all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux)
@ 2009-04-10  5:27 Bao Haojun
  2009-04-10 17:50 ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Bao Haojun @ 2009-04-10  5:27 UTC (permalink / raw
  To: emacs-pretest-bug

[-- Attachment #1: Type: text/plain, Size: 1727 bytes --]

The file is attached, the offending character is the last `"' character on line 117:

	{"get micco", MICCO_TEST, "B<B>B>", "0x1", "},

If I run M-x font-lock-mode, emacs will hang. I have also tested on Linux emacs.


In GNU Emacs 23.0.91.1 (i386-mingw-nt5.1.2600)
 of 2009-02-27 on SOFT-MJASON
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (3.4)'

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: CHS
  value of $XMODIFIERS: nil
  locale-coding-system: cp936
  default-enable-multibyte-characters: t

Major mode: C++/l

Minor modes in effect:
  auto-image-file-mode: t
  shell-dirtrack-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  blink-cursor-mode: t
  global-auto-composition-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t
  abbrev-mode: t

Recent input:
<help-echo> C-x C-f s r c / c l i <M-backspace> e n 
g <M-backspace> a l c <return> j s <return> <return> 
c l i <return> M-x M-p C-k f o n t <tab> l o <tab> 
m o <tab> <return> C-e C-b C-b " C-x C-s M-x C-g M-x 
g l o b <tab> f o n <tab> <return> M-x r e p o r <tab> 
<return>

Recent messages:
Loading paren...done
Loading q:/.session...done
For information about GNU Emacs and the GNU system, type C-h C-a.
Searching for `cli'....
Loading vc-svn...done
Font-Lock mode disabled
Saving file q:/src/alchemy/JSC-fork-dll/AlchemyLib/cli.cpp...
Wrote q:/src/alchemy/JSC-fork-dll/AlchemyLib/cli.cpp
Quit
Global-Font-Lock mode disabled

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/plain; charset=gb18030, Size: 21101 bytes --]

#include "stdafx.h"
#include "alchemy_internal.h"

#include <afxtempl.h>
#include "cli.h"
#define ENABLE_BHJDEBUG
#include "bhjdebug.h" 

typedef enum
{
    FACTORY_ID     = 0x001,
    GPIO_TEST      = 0x003,
    REGISTER_TEST = 0x004,
    ADC_TEST = 0x005,
    REBOOT_TEST = 0x006,
    CAMERA_TEST = 0x007,
    BLUETOOTH_TEST = 0x008,
    TESTINFO       = 0x009,
    ATPARSER_TEST  = 0x00a,
    VIBRATOR_TEST = 0x00b,
    POWERREASON_TEST=0x00c,
    VOLTAGE_TEST = 0x00d,  /*get real voltage by ADC */
    TEMPRATURE_TEST = 0x00e, /*get real temprature by ADC */
    CHARGETYPE_TEST =0x00f,
    GSENSOR_TEST   = 0x010,
    MICCO_TEST     = 0x011,
    LCDBACK_TEST   = 0x012,
    KEYBACK_TEST   = 0x013,
    TOUCH_POINT =0x014,
    KEY_INPUT = 0x015,
    ONLY_Key = 0x031,
    LGSENSOR_TEST  = 0x01c,
    GSENSOR_INFO   = 0x01d,
	
	/* DDR test commands */
    Ddr_TEST = 0x01f,
    /* LCD test commands */
    LCD_TEST = 0x20,
    /* T-FLASH card detect*/
    CARD_TEST =0x021,  

	/* charge status */
    CHARGESTATUS_TEST = 0x022, 
    
	/* MAT FILE Read AND write */
	MAT_TEST = 0x023 ,
	
       /*audio hardware test */
    AUDIO_TEST = 0x024,
     
    
/* ADC calibration &NVM block operation related test commands*/
    CALI_TEMP = 0x016, /*only operation on filesystem file*/
    CALI_VOLT = 0x017, /*only operation on filesystem file*/
    NVM_TEST  = 0X018,
    VOLT_TEST = 0x019, /*read /write from filesystem to NVM block*/
    TEMP_TEST = 0x01a, /*read /write from filesystem to NVM block*/
    RF_TEST   = 0x01b,  /*read /write from filesystem to NVM block*/
    TESTINFO_TEST =0x025,/*read /write from filesystem to NVM block*/
    FACTORYID_TEST=0x026,/*read /write from filesystem to NVM block*/
    MATFLAG_TEST=0x027,/*read /write from filesystem to NVM block*/
    
    /*touch panel test */
   PANEL_TEST = 0x028,
  /*empty  test */
   EMPTY_TEST = 0x029,
   
  /* bluetooth test commands */
    BT_TEST   = 0x050,
    BTNVM_TEST= 0x051,
    BT_INQUIRE= 0x052,
    BT_TESTMODE =0x053,
    BT_KILL=0x054,//kill the "/system/bin/hciattach" process after enter into BT Test Mode /BTINQUIRE 
   /*camera test commands */
    CAMERA_PREVIEW = 0x060,
    LAUNCH_CAMERA = 0x61,
    I2C_TEST  = 0x01e,
    
     /*CMMB test commands */
    IF101_TEST= 0x070,    
    INNO_DEVICE= 0x071, /*enter or exit CMMB test mode*/
    Signallock_TEST = 0x72,
    Sensitive_TEST = 0x73,
    IF101_SPI_TEST = 0x74,
    IF101_SET_FREQ = 0x75,
    LAUNCH_TV = 0x76,
   /* GPS test commands */ 
    GPS_TEST = 0x80,
    GPS_LOCATION=0x81,
    GPS_MESSAGE=0x82,/*only get NEMA Message*/
    GPS_LOCA_MESSAGE=0x83,/*only get Location Message*/
    GPS_CHANGE_MODE=0x84,/*Change between hot mode and code mode*/
  
    /* SPARK */
	SPARK_KEY=0x90,/*TEST KEY INPUT*/
	/* Key Monitor */
	KEY_MONITOR=0x91,
	/* Sensor Monitor */
	SENSOR_MONITOR=0x92,
	/* Set/Get LPR SMS report flag */
	SMS_FLAG =0x93,
	/* Set/Get LPR livetime period  */
    LIVETIME_PERIOD = 0x94,
    /* Set/Get EFEM feature flag  */
    EFEM_FLAG =0x95,
	DIAG_LAUNCH=0x96,	
	GET_RDNVM =0x9a,
	DIAG_EXT_INTERFACE=0x9b,
	/*to set /get element config value */
	NVM_Element=0x9c,
	/*to set /get phase  data : */
	NVM_PHASE =0x9d,
	/*Common set/get Bit config element value*/
	NVM_BITCONFIG  =0x9e, 
	/* Version */
	VERSION     = 0x039,
    
    /* bp only handler */
    BP_ONLY    = 0xFFFF
} TC_AP_FSM_EVENT_OPCODE_T;

typedef unsigned char u8;
typedef unsigned short u16;
typedef struct{
	const char *cmdName;
	int opCode;
	const char *inputSpec; // datatype: BHIOoF, how: <>*! 
	const char *fixedInput;
	const char *description;
	
} testCmd_T;


//< means from the fixedInput, 
//> means from user provided input, 
//! means arbitrary value is acceptable, so we just use 0, 
//* means fill with a string
static testCmd_T cmdMap[] = {
	{"version", VERSION, "B<", "0x12", "Read software version of the phone"},
	{"get factory_id", FACTORY_ID, "B<", "0x11", "Read FactoryId of the phone"},
	{"set factory_id", FACTORY_ID, "B<B*", "0x00", "Update FactoryId of the phone" },
	{"atCommand", ATPARSER_TEST, "B*", "", "Test an AT command" },
	{"get gpio", GPIO_TEST, "B<H>B!", "0x1", "Get GPIO, the u16 argument is the GPIO number"},

	{"set gpio", GPIO_TEST, "B<H>B>", "0x2", 
	 "Set GPIO, the u16 is GPIO number, the u8 is GPIO setting\n"
	 "the meaning of bit 7-0:\n"
	 "    level : 1,     //0:low,1:High\n"
	 "    in_out: 1,    //0:input, 1:output\n"
	 "    pullup: 1,    //0:no pullup,1:pullup\n"
	 "    pulldown:  1,    //0:no pulldown,1:pulldown\n"
	 "    tri_state: 1,    //0:anit_tristate,1:tristate\n"
	 "    reserved:  3;\n"
	},
	{"get register", REGISTER_TEST, "B<I>I!", "0x1", "Read register value, u32 is register number. Use with caution!"},
	{"set register", REGISTER_TEST, "B<I>I>", "0x2", "Write register, first u32 is register number, second is value"},
	{"get adc", ADC_TEST, "B>H!", "", "Read A/D converter value, u8 is AD number" },

	{"reboot poweroff", REBOOT_TEST, "B<", "0x0", "reboot to poweroff mode"},
	{"reboot factory", REBOOT_TEST, "B<", "0x1" "reboot to factory mode (minimal applications will start, so boot/test is faster)"},
	{"reboot normal", REBOOT_TEST, "B<", "0x2", "reboot, the `Normal' reboot"},
	{"reboot flash", REBOOT_TEST, "B<", "0x3", "reboot to flash mode"},

	//{"camera test", //???
	{"launch camera", LAUNCH_CAMERA, "", "", "lauch camera"},
	//{"bluetooth test", //???
	//{"get info", TESTINFO, "B<", "0x11"}, //???
	//{"set info", TESTINFO, "B<B*", "0x0"}, //???
	{"get gsensor", GSENSOR_TEST, "B<B>B!", "0x1", "get gravity sensor value, u8 is the gsensor number"},
	{"set gsensor", GSENSOR_TEST, "B<B>B>", "0x2", "set gsensor value, first u8 is the gsensor number, second is value"},
	{"get micco", MICCO_TEST, "B<B>B>", "0x1", "},
	{"set micco", MICCO_TEST, "B<B>B>", "0x2"},
	{"vibrator on", VIBRATOR_TEST, "B<", "0x1"},
	{"vibrator off", VIBRATOR_TEST, "B<", "0x2"},
	//{"at test" //bhj: don't know what this means
	{"get power reason", POWERREASON_TEST, "", ""},
	{"get chargetype", CHARGETYPE_TEST, "B<", "0x1"},
	{"set chargetype", CHARGETYPE_TEST, "B<B>", "0x2"},
	{"get manual voltage", VOLTAGE_TEST, "B<", "0x0"},
	{"get auto voltage", VOLTAGE_TEST, "B<", "0x4"},
	{"get manual temperature", TEMPRATURE_TEST, "B<", "0x1"},//0x0? 
	{"get auto temperature", TEMPRATURE_TEST, "B<", "0x5"},
	{"get lcdbl", LCDBACK_TEST, "B<B>", "0x1"},
	{"set lcdbl", LCDBACK_TEST, "B<B>", "0x2"},
	{"get keybl", KEYBACK_TEST, "B<B>", "0x1"},
	{"set keybl", KEYBACK_TEST, "B<B>", "0x2"},
	{"test touch", TOUCH_POINT, "", ""},
	{"test keyinput",ONLY_Key,"",""},
	{"get lprflag", SMS_FLAG, "B<", "0x1"},
	{"set lprflag", SMS_FLAG, "B<B>", "0x2"},
	{"get lprtime", LIVETIME_PERIOD, "B<", "0x1"},
	{"set lprtime", LIVETIME_PERIOD, "B<B>", "0x2"},
	{"get efemflag", EFEM_FLAG, "B<", "0x1"},
	{"set efemflag", EFEM_FLAG, "B<B>", "0x2"},
	{"get cali temperature",CALI_TEMP,"B<","0x1"},//add by Jason from here
	{"get cali voltage",CALI_VOLT,"B<","0x1"},
	{"set cali voltage",CALI_VOLT,"B<B*","0x2"},
	{"store volt",VOLT_TEST,"B<","0x1"},
	{"load volt",VOLT_TEST,"B<","0x2"},
	{"store temp",TEMP_TEST,"B<","0x1"},
	{"load temp",TEMP_TEST,"B<","0x2"},
	{"store RF",RF_TEST,"B<","0x1"},
	{"load RF",RF_TEST,"B<","0x2"},
	{"store testinfo",TESTINFO_TEST,"B<","0x1"},
	{"load testinfo",TESTINFO_TEST,"B<","0x2"},
	{"store factoryid",FACTORYID_TEST,"B<","0x1"},
	{"load factoryid",FACTORYID_TEST,"B<","0x2"},
	{"store MATflag",MATFLAG_TEST,"B<","0x1"},
	{"load MATflag",MATFLAG_TEST,"B<","0x2"},
	{"camera preview on",CAMERA_PREVIEW,"B<","0x1"},
	{"camera preview off",CAMERA_PREVIEW,"B<","0x2"},
	{"get sensor",LGSENSOR_TEST,"B<","0x1"},
	{"i2c test",I2C_TEST,"",""},
	{"if101 test",IF101_TEST,"",""},
	{"read bt",BT_TEST,"B<","0x1"},
	{"write bt",BT_TEST,"B<B*","0x2"},
	{"store btnvm",BTNVM_TEST,"B<B*","0x1"},
	{"load btnvm",BTNVM_TEST,"B<","0x2"},
	{"bt inquire",BT_INQUIRE,"",""},
	{"bt testmode",BT_TESTMODE,"",""},
	{"bt kill",BT_KILL,"",""},//ljs:not find the definition
	{"launch tv",LAUNCH_TV,"",""},
	{"ddr test",Ddr_TEST,"",""},
	{"gps test",GPS_TEST,"B>",""},
	{"lcd test",LCD_TEST,"B>",""},
	{"card detect",CARD_TEST,"B>",""},
	{"charge status",CHARGESTATUS_TEST,"B>",""},
	{"audio test",AUDIO_TEST,"B>",""},
	//data: 0x01: AUDIO_SD_PLAY
	//		0x02: AUDIO_MICRO_TEST
    //      0x03: AUDIO_EAR_TEST
	{"save rd",GET_RDNVM,"B<B>","0x1"},
	{"get diag_en",DIAG_LAUNCH,"B<","0x1"},
	{"set diag_en",DIAG_LAUNCH,"B<B>","0x2"},
	{"get diag_intf",DIAG_EXT_INTERFACE,"B<","0x1"},
	{"set diag_intf",DIAG_EXT_INTERFACE,"B<B>","0x2"},
	{"get element",NVM_Element,"I>B<","0x1"},
	{"set element",NVM_Element,"I>B<o","0x2"},
	{"get phase",NVM_PHASE,"I>B<","0x1"},
	{"set phase",NVM_PHASE,"I>B<o>","0x2"},
	{"get ap_panic_report",NVM_BITCONFIG,"I>B<","0x1"},
	{"set ap_panic_report",NVM_BITCONFIG,"I>B<B>","0x2"},
	{"opcode", -1, "o>", ""},
	{"reliable data", 0x97, "F>", ""},
	{NULL, 0, NULL, NULL},
};


static BOOL notOptionalCode(char c)
{
	return (c!='*' && c!='?');
}

static BOOL isOptionalCode(char c)
{
	return !notOptionalCode(c);
}

static BOOL isSingleOptional(char c)
{
	return c=='?';
}

static BOOL isMultiOptional(char c)
{
	return c=='*';
}

static unsigned long getLong(CString& strInput)
{
	const char *s = strInput.GetBufferSetLength(strInput.GetLength());
	char *firstInvalid = NULL;
	
	long dataH = strtol(s, &firstInvalid, 0);
	strInput.ReleaseBuffer();
	strInput.Delete(0, firstInvalid-s);
	strInput.TrimLeft();
	return (unsigned long) dataH;

}

static int getLongCheck(CString& strInput, unsigned long& outLong) 
{
	outLong = 0;
	
	strInput.TrimLeft();
	strInput.TrimRight();

	if (strInput.IsEmpty()) {
		return -1;
	}

	int len = strInput.GetLength();
	outLong = (unsigned long)getLong(strInput);
	if (len == strInput.GetLength()) {
		return -1;
	}
	return 0;
}

static int getB(CString& strInput, CU8Array& dataArr)
{
	unsigned long outLong = 0;
	if (getLongCheck(strInput, outLong) < 0) {
		return -1;
	}
	unsigned char data = (unsigned char)outLong;
	dataArr.Add(data);
	return 0;
}
//'H' stands for a short
static int getH(CString& strInput, CU8Array& dataArr)
{
	unsigned long outLong = 0;
	if (getLongCheck(strInput, outLong) < 0) {
		return -1;
	}

	unsigned short data = (unsigned short) outLong;
	//big endian or little endian?
	dataArr.Add(data&0xff);
	dataArr.Add(data>>8);
	return 0;
}

static int getI(CString& strInput, CU8Array& dataArr)
{

	unsigned long outLong = 0;
	if (getLongCheck(strInput, outLong) < 0) {
		return -1;
	}

	unsigned int data = (unsigned int)outLong;
	dataArr.Add(data&0xff);			//»ñÈ¡intµÄµÍλ×Ö½Ú
	dataArr.Add((data>>8) & 0xff);	//»ñÈ¡intµÄµÚ¶þ¸ö×Ö½Ú	
	dataArr.Add((data>>16) & 0xff);	//»ñÈ¡intµÄµÚÈý¸ö×Ö½Ú
	dataArr.Add((data>>24) &0xff);	//»ñÈ¡intµÄµÚËĸö×Ö½Ú

	return 0;
}

static int getF(CString& strInput, CU8Array& dataArr)
{
	strInput.TrimLeft();
	strInput.TrimRight();

	FILE* fp = fopen(strInput, "rb");
	if (fp == NULL) {
		urgTrace("Error: %s open failed", (const char *)strInput);
		return -1;
	}

	fseek(fp, 0, SEEK_END);
	

	DWORD dwLength = ftell(fp);
	rewind(fp);
	char *buff = (char *)calloc(dwLength, 1);
	DWORD numRead = 0;
	
	for (;;) {
		numRead += fread(buff+numRead, 1, dwLength, fp);
		if (numRead == dwLength)
			break;
	}
	
	ASSERT(numRead == dwLength);
	for (DWORD i=0; i<dwLength; i++) {
		dataArr.Add(buff[i]);
	}
	free(buff);
	fclose(fp);
	return 0;
}

#define AppendFormat(s, fmt) do {		\
		CString tmp_asfd;		\
		tmp_asfd.Format fmt;		\
		s+=tmp_asfd;			\
	} while (0)

static CString getFormat(const char *dC /* i.e., inputSpec, such as "BB*" */)
{
	CString format;
	for (int i=0; dC[i]; i++) {
		if (dC[i]=='B' && notOptionalCode(dC[i+1])) {
				continue;
		} else if (dC[i]=='B' && isMultiOptional(dC[i+1])) {
			i++;
			format += "[string] ";
		} else if (dC[i]=='H' && isSingleOptional(dC[i+1])) {
			i++;
			format += "[uint16] ";
		} else if (dC[i]=='I' && isSingleOptional(dC[i+1])) {
			i++;
			format += "[uint32] ";
		} else if (dC[i]=='B' && isSingleOptional(dC[i+1])) {
			i++;
			format += "[uint8] ";
		} else if (dC[i]=='O' && notOptionalCode(dC[i+1])) {
			format += "[uint32 (as opcode)] [uint8]... ";
		} else if (dC[i]=='F' && notOptionalCode(dC[i+1])) {
			format += "[filename] ";
		} else if (dC[i]=='o' && notOptionalCode(dC[i+1])) {
			format += "[uint8]... ";
		}
	}

	if (format.IsEmpty()) {
		format += "no args";
	}
	format += "\r\n";
	return format;
}

static void commands()
{
	CString helpStr("\r\nCommands:\r\n--------------------------------\r\n\r\n");
	for (int i=0; cmdMap[i].cmdName!=NULL; i++) {
		CString cmdName(cmdMap[i].cmdName);
		AppendFormat(helpStr, ("%-25s : "
				       "opcode 0x%04x : "
				       "%s", cmdName, 
				       (unsigned short)cmdMap[i].opCode, 
				       getFormat(cmdMap[i].inputSpec)));
	}
	urgTrace("%s", helpStr);
	
}

static void help()
{
	CString helpStr("\r\nHelp:\r\n--------------------------------\r\n\r\n"
			"You can type the following to get more infomation:,\r\n"
			"\r\n"
			"        help: dislay this help\r\n"
			"        todo: display to-do in this tool\r\n"
			"        bugs: display bugs/defects known\r\n"
			"    commands: display a list of available commands\r\n"
			"\r\n"
			"When you type `commands`, the commands are displayed as `Command : Args`,\r\n"
			"Leading and trailing spaces in a command is ignored,\r\n"
			"  for e.g., `set keybl 255` is equal to `   set keybl    255   `\r\n"
			"but, space in a command is not,\r\n"
			"  for e.g., `get keybl` is ok, but `get  keybl` is not a valid command\r\n"
			"for those command that want one or more u8/u16/u32 argument, \r\n"
			"if none or less that required argument is supplied, a default 0 is used\r\n"
			"  for e.g., `set register 0x33 0x44` takes 2 args\r\n"
			"  0x33 is register number, 0x44 is the value, \r\n"
			"  i.e., register 0x33 will be set to 68 (decimal value of 0x44) \r\n"
			"  But, if you run `set register`, then register 0 will be set to 0\r\n"
			"And, you can use 0xf/017/15 to mean the same INT, 15.");
			

	urgTrace("%s", helpStr);
}

static void todo()
{
	CString todoStr("\r\nTodo:\r\n--------------------------------\r\n\r\n"
			"    1. make the interface more user-friendly\r\n"
			"       for e.g., get gpio should show if the i/o is pu/pd, etc.\r\n"
			"    2. implement a better help system\r\n"
			"    3. provide a means to clear or save the log to a file\r\n"
			"    4. provide a means to save the commands executed to a file\r\n"
			"    5. implement execution of commands from the saved commands file\r\n"
			"    6. fix bugs");
	urgTrace("%s", todoStr);
}

static void bugs()
{
	CString bugsStr("\r\nBugs:\r\n--------------------------------\r\n\r\n"
			"    1. connection is broken after you disconnect the usb cable\r\n"
			"       and must restart the application to reconnect\r\n"
			"    2. you must connect the usb cable before you start the application\r\n"
			"    3. many other bugs, some are even undiscovered yet\r\n"
			"       Please help report bugs/suggestions to haojun.bao@borqs.com");
	urgTrace("%s", bugsStr);
}


static void printResult(CU8Array& result)
{
	CString recvTrace("\"");
	if (result.GetSize()==0) {
		return;
	}

	for (int k=0; k<result.GetSize(); k++) {
		if (isprint(result[k])) {
			recvTrace += result[k];
		} else {
			CString tmp;
			tmp.Format("\\x%02x", result[k]);
			recvTrace += tmp;
		}
	}
	recvTrace+='"';

	urgTrace("%s", recvTrace);

	recvTrace = "   in hex: ";
	for (k=0; k<result.GetSize(); k++) {
		CString tmp;
		tmp.Format("0x%02x ", result[k]);
		recvTrace += tmp;
	}
	dbgTrace("%s", recvTrace);
								   
	return;
}

static BOOL isFromUser(char where)
{
	return where == '>';
}

static BOOL isFromFixed(char where)
{
	return where == '<';
}

static BOOL isArbitrary(char where)
{
	return where == '!';
}

static BOOL isMultiple(char where)
{
	return where == '*';
}

static int getArg(CU8Array& dataArr, CString& strUserInput, CString& strFixedInput, char dataType, char where)
{
	if (dataType == 'B') {
		if (isFromUser(where)) {
			return getB(strUserInput, dataArr);
		} else if (isFromFixed(where)) {
			return getB(strFixedInput, dataArr);
		} else if (isArbitrary(where)) {
			return getB(CString("0"), dataArr);
		} else if (isMultiple(where)) { //the rest of the user-input is consumed

			for (int k=0; k<strUserInput.GetLength(); k++) {
				dataArr.Add(strUserInput[k]);
			}
			strUserInput = ""; //empty user-input
			return 0;
		}
	} else if (dataType == 'H') {
		if (isFromUser(where)) {
			return getH(strUserInput, dataArr);
		} else if (isFromFixed(where)) {
			return getH(strFixedInput, dataArr);
		} else if (isArbitrary(where)) {
			return getH(CString("0"), dataArr);
		} else {
			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
			return -1;
		}
	} else if (dataType == 'I') {
		if (isFromUser(where)) {
			return getI(strUserInput, dataArr);
		} else if (isFromFixed(where)) {
			return getI(strFixedInput, dataArr);
		} else if (isArbitrary(where)) {
			return getI(CString("0"), dataArr);
		} else {
			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
			return -1;
		}
	} else if (dataType == 'o') {
		strUserInput.TrimLeft();
		CString savedCommand = strUserInput;
					
		for (int k=0;;k++) { //infinite loop, k is only for debugging
			if (strUserInput.IsEmpty()) {
				break;
			}
			getB(strUserInput, dataArr);
			if (strUserInput == savedCommand) {
				urgTrace("invalid arguments, `%s'", savedCommand);
				return -1;
			}
			strUserInput.TrimLeft();
			savedCommand = strUserInput;
		}
		
		return 0;
	} else if (dataType == 'F') {
		if (!isFromUser(where)) {
			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
		}				
		return getF(strUserInput, dataArr);
	} else {
		urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
		return -1;
	}

	return 0;
}

int cliCarryOut(const char *sCommand)
{
	return cliCarryOut(CString(sCommand));
}

int cliCarryOut(const CString& sCommand)
{
	CU8Array result;
	return cliCarryOut(sCommand, result);
}

//resolve the command send by IDC_EXEC_COMMAND
int cliCarryOut(const CString& sCommandConst, CU8Array& result)
{
	if (alchemyInited == FALSE) {
		urgTrace("Must call InitAlchemyLib first!\n");
		return -1;
	}

	//we need to change the input string, so make a copy to remove the `const'
	CString sCommand = sCommandConst;
	sCommand.TrimLeft();
	sCommand.TrimRight();
	
	for (int i=0; cmdMap[i].cmdName; i++) {
		if (sCommand.Find(cmdMap[i].cmdName) == 0) {
			const char *inputSpec = cmdMap[i].inputSpec;
			const char *fixedInput = cmdMap[i].fixedInput;
			int opcode = cmdMap[i].opCode;  // this will change if cmd is "opcode"
			
			//so that only args to the cmd is in sCommand
			sCommand.Delete(0, strlen(cmdMap[i].cmdName));
			sCommand.TrimLeft();
			
			CString strUserInput = sCommand;
			CString strFixedInput = fixedInput? fixedInput : "";
			
			CU8Array dataArr; //empty at first

			//handle opcode first:
			if (opcode < 0) {
				opcode = getLong(strUserInput);
			}
			
			for (int j=0; inputSpec[j]; j=j+2) {
				int n = getArg(dataArr, strUserInput, strFixedInput, inputSpec[j], inputSpec[j+1]);

				if (n < 0) {
					urgTrace("Error: don't know how to parse the input string:\n    %s", (const char*)sCommandConst);
				}
			} 

			if (strUserInput.GetLength()) {
				urgTrace("Error: argument parse failed, `%s' is remaining in the command string", strUserInput);
				return -1;
			}

			BYTE recv[1024] = {0};
			int nRecv = 0;

			CString sendTrace("send: \"opCode ");
			CString tmp;
			tmp.Format("0x%08x,data: ", opcode);
			sendTrace+=tmp;
			for (int k=0; k<min(10,dataArr.GetSize()); k++) {
				CString tmp;
				tmp.Format("0x%02x ", dataArr[k]);
				sendTrace+=tmp;
			}
			if (dataArr.GetSize()>10) {
				sendTrace+="...";
			}
			dbgTrace("%s", sendTrace);

			int ret = getConnection()->UC_Do3rdCommand(opcode,
								   dataArr,
								   result,
								   cmdMap[i].cmdName);
			printResult(result);
			if (ret < 0) {
				infoTrace("`%s`: failed!", cmdMap[i].cmdName);
				return -1;
			} else {
				infoTrace("`%s`: success!", cmdMap[i].cmdName);
				return 0;
			}
		}
	}
	if (sCommand.Find("help") == 0) {
		help();
	} else if (sCommand.Find("todo") == 0) {
		todo();
	} else if (sCommand.Find("bugs") == 0) {
		bugs();
	} else if (sCommand.Find("commands") == 0) {
		commands();
	} else {
		urgTrace("%s", sCommand+=": unknown command");
	} 
	return 0;
}

^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux)
  2009-04-10  5:27 bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux) Bao Haojun
@ 2009-04-10 17:50 ` Stefan Monnier
  2009-04-10 17:55   ` Processed: " Emacs bug Tracking System
  2011-10-03 20:18   ` Glenn Morris
  0 siblings, 2 replies; 4+ messages in thread
From: Stefan Monnier @ 2009-04-10 17:50 UTC (permalink / raw
  To: Bao Haojun; +Cc: 2947

reassign 2947 emacs,cc-mode
thanks

> The file is attached, the offending character is the last `"'
> character on line 117:

> 	{"get micco", MICCO_TEST, "B<B>B>", "0x1", "},

> If I run M-x font-lock-mode, Emacs will hang. I have also tested on
> Linux Emacs.
  ^^^^^
[ Emacs does not run on a bare Linux kernel.  Please call the system
  GNU/Linux. ]

IIUC the file is opened in c++-mode, right?  If so, it looks like
a pathological regexp (or something similar) in cc-mode.  Alan, can you
take a look at it?


        Stefan


> In GNU Emacs 23.0.91.1 (i386-mingw-nt5.1.2600)
>  of 2009-02-27 on SOFT-MJASON
> Windowing system distributor `Microsoft Corp.', version 5.1.2600
> configured using `configure --with-gcc (3.4)'

> Important settings:
>   value of $LC_ALL: nil
>   value of $LC_COLLATE: nil
>   value of $LC_CTYPE: nil
>   value of $LC_MESSAGES: nil
>   value of $LC_MONETARY: nil
>   value of $LC_NUMERIC: nil
>   value of $LC_TIME: nil
>   value of $LANG: CHS
>   value of $XMODIFIERS: nil
>   locale-coding-system: cp936
>   default-enable-multibyte-characters: t

> Major mode: C++/l

> Minor modes in effect:
>   auto-image-file-mode: t
>   shell-dirtrack-mode: t
>   mouse-wheel-mode: t
>   file-name-shadow-mode: t
>   blink-cursor-mode: t
>   global-auto-composition-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>   abbrev-mode: t

> Recent input:
> <help-echo> C-x C-f s r c / c l i <M-backspace> e n 
> g <M-backspace> a l c <return> j s <return> <return> 
> c l i <return> M-x M-p C-k f o n t <tab> l o <tab> 
> m o <tab> <return> C-e C-b C-b " C-x C-s M-x C-g M-x 
> g l o b <tab> f o n <tab> <return> M-x r e p o r <tab> 
> <return>

> Recent messages:
> Loading paren...done
> Loading q:/.session...done
> For information about GNU Emacs and the GNU system, type C-h C-a.
> Searching for `cli'....
> Loading vc-svn...done
> Font-Lock mode disabled
> Saving file q:/src/alchemy/JSC-fork-dll/AlchemyLib/cli.cpp...
> Wrote q:/src/alchemy/JSC-fork-dll/AlchemyLib/cli.cpp
> Quit
> Global-Font-Lock mode disabled

> #include "stdafx.h"
> #include "alchemy_internal.h"

> #include <afxtempl.h>
> #include "cli.h"
> #define ENABLE_BHJDEBUG
> #include "bhjdebug.h" 

> typedef enum
> {
>     FACTORY_ID     = 0x001,
>     GPIO_TEST      = 0x003,
>     REGISTER_TEST = 0x004,
>     ADC_TEST = 0x005,
>     REBOOT_TEST = 0x006,
>     CAMERA_TEST = 0x007,
>     BLUETOOTH_TEST = 0x008,
>     TESTINFO       = 0x009,
>     ATPARSER_TEST  = 0x00a,
>     VIBRATOR_TEST = 0x00b,
>     POWERREASON_TEST=0x00c,
>     VOLTAGE_TEST = 0x00d,  /*get real voltage by ADC */
>     TEMPRATURE_TEST = 0x00e, /*get real temprature by ADC */
>     CHARGETYPE_TEST =0x00f,
>     GSENSOR_TEST   = 0x010,
>     MICCO_TEST     = 0x011,
>     LCDBACK_TEST   = 0x012,
>     KEYBACK_TEST   = 0x013,
>     TOUCH_POINT =0x014,
>     KEY_INPUT = 0x015,
>     ONLY_Key = 0x031,
>     LGSENSOR_TEST  = 0x01c,
>     GSENSOR_INFO   = 0x01d,
	
> 	/* DDR test commands */
>     Ddr_TEST = 0x01f,
>     /* LCD test commands */
>     LCD_TEST = 0x20,
>     /* T-FLASH card detect*/
>     CARD_TEST =0x021,  

> 	/* charge status */
>     CHARGESTATUS_TEST = 0x022, 
    
> 	/* MAT FILE Read AND write */
> 	MAT_TEST = 0x023 ,
	
>        /*audio hardware test */
>     AUDIO_TEST = 0x024,
     
    
> /* ADC calibration &NVM block operation related test commands*/
>     CALI_TEMP = 0x016, /*only operation on filesystem file*/
>     CALI_VOLT = 0x017, /*only operation on filesystem file*/
>     NVM_TEST  = 0X018,
>     VOLT_TEST = 0x019, /*read /write from filesystem to NVM block*/
>     TEMP_TEST = 0x01a, /*read /write from filesystem to NVM block*/
>     RF_TEST   = 0x01b,  /*read /write from filesystem to NVM block*/
>     TESTINFO_TEST =0x025,/*read /write from filesystem to NVM block*/
>     FACTORYID_TEST=0x026,/*read /write from filesystem to NVM block*/
>     MATFLAG_TEST=0x027,/*read /write from filesystem to NVM block*/
    
>     /*touch panel test */
>    PANEL_TEST = 0x028,
>   /*empty  test */
>    EMPTY_TEST = 0x029,
   
>   /* bluetooth test commands */
>     BT_TEST   = 0x050,
>     BTNVM_TEST= 0x051,
>     BT_INQUIRE= 0x052,
>     BT_TESTMODE =0x053,
>     BT_KILL=0x054,//kill the "/system/bin/hciattach" process after enter into BT Test Mode /BTINQUIRE 
>    /*camera test commands */
>     CAMERA_PREVIEW = 0x060,
>     LAUNCH_CAMERA = 0x61,
>     I2C_TEST  = 0x01e,
    
>      /*CMMB test commands */
>     IF101_TEST= 0x070,    
>     INNO_DEVICE= 0x071, /*enter or exit CMMB test mode*/
>     Signallock_TEST = 0x72,
>     Sensitive_TEST = 0x73,
>     IF101_SPI_TEST = 0x74,
>     IF101_SET_FREQ = 0x75,
>     LAUNCH_TV = 0x76,
>    /* GPS test commands */ 
>     GPS_TEST = 0x80,
>     GPS_LOCATION=0x81,
>     GPS_MESSAGE=0x82,/*only get NEMA Message*/
>     GPS_LOCA_MESSAGE=0x83,/*only get Location Message*/
>     GPS_CHANGE_MODE=0x84,/*Change between hot mode and code mode*/
  
>     /* SPARK */
> 	SPARK_KEY=0x90,/*TEST KEY INPUT*/
> 	/* Key Monitor */
> 	KEY_MONITOR=0x91,
> 	/* Sensor Monitor */
> 	SENSOR_MONITOR=0x92,
> 	/* Set/Get LPR SMS report flag */
> 	SMS_FLAG =0x93,
> 	/* Set/Get LPR livetime period  */
>     LIVETIME_PERIOD = 0x94,
>     /* Set/Get EFEM feature flag  */
>     EFEM_FLAG =0x95,
> 	DIAG_LAUNCH=0x96,	
> 	GET_RDNVM =0x9a,
> 	DIAG_EXT_INTERFACE=0x9b,
> 	/*to set /get element config value */
> 	NVM_Element=0x9c,
> 	/*to set /get phase  data : */
> 	NVM_PHASE =0x9d,
> 	/*Common set/get Bit config element value*/
> 	NVM_BITCONFIG  =0x9e, 
> 	/* Version */
> 	VERSION     = 0x039,
    
>     /* bp only handler */
>     BP_ONLY    = 0xFFFF
> } TC_AP_FSM_EVENT_OPCODE_T;

> typedef unsigned char u8;
> typedef unsigned short u16;
> typedef struct{
> 	const char *cmdName;
> 	int opCode;
> 	const char *inputSpec; // datatype: BHIOoF, how: <>*! 
> 	const char *fixedInput;
> 	const char *description;
	
> } testCmd_T;


> //< means from the fixedInput, 
> //> means from user provided input, 
> //! means arbitrary value is acceptable, so we just use 0, 
> //* means fill with a string
> static testCmd_T cmdMap[] = {
> 	{"version", VERSION, "B<", "0x12", "Read software version of the phone"},
> 	{"get factory_id", FACTORY_ID, "B<", "0x11", "Read FactoryId of the phone"},
> 	{"set factory_id", FACTORY_ID, "B<B*", "0x00", "Update FactoryId of the phone" },
> 	{"atCommand", ATPARSER_TEST, "B*", "", "Test an AT command" },
> 	{"get gpio", GPIO_TEST, "B<H>B!", "0x1", "Get GPIO, the u16 argument is the GPIO number"},

> 	{"set gpio", GPIO_TEST, "B<H>B>", "0x2", 
> 	 "Set GPIO, the u16 is GPIO number, the u8 is GPIO setting\n"
> 	 "the meaning of bit 7-0:\n"
> 	 "    level : 1,     //0:low,1:High\n"
> 	 "    in_out: 1,    //0:input, 1:output\n"
> 	 "    pullup: 1,    //0:no pullup,1:pullup\n"
> 	 "    pulldown:  1,    //0:no pulldown,1:pulldown\n"
> 	 "    tri_state: 1,    //0:anit_tristate,1:tristate\n"
> 	 "    reserved:  3;\n"
> 	},
> 	{"get register", REGISTER_TEST, "B<I>I!", "0x1", "Read register value, u32 is register number. Use with caution!"},
> 	{"set register", REGISTER_TEST, "B<I>I>", "0x2", "Write register, first u32 is register number, second is value"},
> 	{"get adc", ADC_TEST, "B>H!", "", "Read A/D converter value, u8 is AD number" },

> 	{"reboot poweroff", REBOOT_TEST, "B<", "0x0", "reboot to poweroff mode"},
> 	{"reboot factory", REBOOT_TEST, "B<", "0x1" "reboot to factory mode (minimal applications will start, so boot/test is faster)"},
> 	{"reboot normal", REBOOT_TEST, "B<", "0x2", "reboot, the `Normal' reboot"},
> 	{"reboot flash", REBOOT_TEST, "B<", "0x3", "reboot to flash mode"},

> 	//{"camera test", //???
> 	{"launch camera", LAUNCH_CAMERA, "", "", "lauch camera"},
> 	//{"bluetooth test", //???
> 	//{"get info", TESTINFO, "B<", "0x11"}, //???
> 	//{"set info", TESTINFO, "B<B*", "0x0"}, //???
> 	{"get gsensor", GSENSOR_TEST, "B<B>B!", "0x1", "get gravity sensor value, u8 is the gsensor number"},
> 	{"set gsensor", GSENSOR_TEST, "B<B>B>", "0x2", "set gsensor value, first u8 is the gsensor number, second is value"},
> 	{"get micco", MICCO_TEST, "B<B>B>", "0x1", "},
> 	{"set micco", MICCO_TEST, "B<B>B>", "0x2"},
> 	{"vibrator on", VIBRATOR_TEST, "B<", "0x1"},
> 	{"vibrator off", VIBRATOR_TEST, "B<", "0x2"},
> 	//{"at test" //bhj: don't know what this means
> 	{"get power reason", POWERREASON_TEST, "", ""},
> 	{"get chargetype", CHARGETYPE_TEST, "B<", "0x1"},
> 	{"set chargetype", CHARGETYPE_TEST, "B<B>", "0x2"},
> 	{"get manual voltage", VOLTAGE_TEST, "B<", "0x0"},
> 	{"get auto voltage", VOLTAGE_TEST, "B<", "0x4"},
> 	{"get manual temperature", TEMPRATURE_TEST, "B<", "0x1"},//0x0? 
> 	{"get auto temperature", TEMPRATURE_TEST, "B<", "0x5"},
> 	{"get lcdbl", LCDBACK_TEST, "B<B>", "0x1"},
> 	{"set lcdbl", LCDBACK_TEST, "B<B>", "0x2"},
> 	{"get keybl", KEYBACK_TEST, "B<B>", "0x1"},
> 	{"set keybl", KEYBACK_TEST, "B<B>", "0x2"},
> 	{"test touch", TOUCH_POINT, "", ""},
> 	{"test keyinput",ONLY_Key,"",""},
> 	{"get lprflag", SMS_FLAG, "B<", "0x1"},
> 	{"set lprflag", SMS_FLAG, "B<B>", "0x2"},
> 	{"get lprtime", LIVETIME_PERIOD, "B<", "0x1"},
> 	{"set lprtime", LIVETIME_PERIOD, "B<B>", "0x2"},
> 	{"get efemflag", EFEM_FLAG, "B<", "0x1"},
> 	{"set efemflag", EFEM_FLAG, "B<B>", "0x2"},
> 	{"get cali temperature",CALI_TEMP,"B<","0x1"},//add by Jason from here
> 	{"get cali voltage",CALI_VOLT,"B<","0x1"},
> 	{"set cali voltage",CALI_VOLT,"B<B*","0x2"},
> 	{"store volt",VOLT_TEST,"B<","0x1"},
> 	{"load volt",VOLT_TEST,"B<","0x2"},
> 	{"store temp",TEMP_TEST,"B<","0x1"},
> 	{"load temp",TEMP_TEST,"B<","0x2"},
> 	{"store RF",RF_TEST,"B<","0x1"},
> 	{"load RF",RF_TEST,"B<","0x2"},
> 	{"store testinfo",TESTINFO_TEST,"B<","0x1"},
> 	{"load testinfo",TESTINFO_TEST,"B<","0x2"},
> 	{"store factoryid",FACTORYID_TEST,"B<","0x1"},
> 	{"load factoryid",FACTORYID_TEST,"B<","0x2"},
> 	{"store MATflag",MATFLAG_TEST,"B<","0x1"},
> 	{"load MATflag",MATFLAG_TEST,"B<","0x2"},
> 	{"camera preview on",CAMERA_PREVIEW,"B<","0x1"},
> 	{"camera preview off",CAMERA_PREVIEW,"B<","0x2"},
> 	{"get sensor",LGSENSOR_TEST,"B<","0x1"},
> 	{"i2c test",I2C_TEST,"",""},
> 	{"if101 test",IF101_TEST,"",""},
> 	{"read bt",BT_TEST,"B<","0x1"},
> 	{"write bt",BT_TEST,"B<B*","0x2"},
> 	{"store btnvm",BTNVM_TEST,"B<B*","0x1"},
> 	{"load btnvm",BTNVM_TEST,"B<","0x2"},
> 	{"bt inquire",BT_INQUIRE,"",""},
> 	{"bt testmode",BT_TESTMODE,"",""},
> 	{"bt kill",BT_KILL,"",""},//ljs:not find the definition
> 	{"launch tv",LAUNCH_TV,"",""},
> 	{"ddr test",Ddr_TEST,"",""},
> 	{"gps test",GPS_TEST,"B>",""},
> 	{"lcd test",LCD_TEST,"B>",""},
> 	{"card detect",CARD_TEST,"B>",""},
> 	{"charge status",CHARGESTATUS_TEST,"B>",""},
> 	{"audio test",AUDIO_TEST,"B>",""},
> 	//data: 0x01: AUDIO_SD_PLAY
> 	//		0x02: AUDIO_MICRO_TEST
>     //      0x03: AUDIO_EAR_TEST
> 	{"save rd",GET_RDNVM,"B<B>","0x1"},
> 	{"get diag_en",DIAG_LAUNCH,"B<","0x1"},
> 	{"set diag_en",DIAG_LAUNCH,"B<B>","0x2"},
> 	{"get diag_intf",DIAG_EXT_INTERFACE,"B<","0x1"},
> 	{"set diag_intf",DIAG_EXT_INTERFACE,"B<B>","0x2"},
> 	{"get element",NVM_Element,"I>B<","0x1"},
> 	{"set element",NVM_Element,"I>B<o","0x2"},
> 	{"get phase",NVM_PHASE,"I>B<","0x1"},
> 	{"set phase",NVM_PHASE,"I>B<o>","0x2"},
> 	{"get ap_panic_report",NVM_BITCONFIG,"I>B<","0x1"},
> 	{"set ap_panic_report",NVM_BITCONFIG,"I>B<B>","0x2"},
> 	{"opcode", -1, "o>", ""},
> 	{"reliable data", 0x97, "F>", ""},
> 	{NULL, 0, NULL, NULL},
> };


> static BOOL notOptionalCode(char c)
> {
> 	return (c!='*' && c!='?');
> }

> static BOOL isOptionalCode(char c)
> {
> 	return !notOptionalCode(c);
> }

> static BOOL isSingleOptional(char c)
> {
> 	return c=='?';
> }

> static BOOL isMultiOptional(char c)
> {
> 	return c=='*';
> }

> static unsigned long getLong(CString& strInput)
> {
> 	const char *s = strInput.GetBufferSetLength(strInput.GetLength());
> 	char *firstInvalid = NULL;
	
> 	long dataH = strtol(s, &firstInvalid, 0);
> 	strInput.ReleaseBuffer();
> 	strInput.Delete(0, firstInvalid-s);
> 	strInput.TrimLeft();
> 	return (unsigned long) dataH;

> }

> static int getLongCheck(CString& strInput, unsigned long& outLong) 
> {
> 	outLong = 0;
	
> 	strInput.TrimLeft();
> 	strInput.TrimRight();

> 	if (strInput.IsEmpty()) {
> 		return -1;
> 	}

> 	int len = strInput.GetLength();
> 	outLong = (unsigned long)getLong(strInput);
> 	if (len == strInput.GetLength()) {
> 		return -1;
> 	}
> 	return 0;
> }

> static int getB(CString& strInput, CU8Array& dataArr)
> {
> 	unsigned long outLong = 0;
> 	if (getLongCheck(strInput, outLong) < 0) {
> 		return -1;
> 	}
> 	unsigned char data = (unsigned char)outLong;
> 	dataArr.Add(data);
> 	return 0;
> }
> //'H' stands for a short
> static int getH(CString& strInput, CU8Array& dataArr)
> {
> 	unsigned long outLong = 0;
> 	if (getLongCheck(strInput, outLong) < 0) {
> 		return -1;
> 	}

> 	unsigned short data = (unsigned short) outLong;
> 	//big endian or little endian?
> 	dataArr.Add(data&0xff);
> 	dataArr.Add(data>>8);
> 	return 0;
> }

> static int getI(CString& strInput, CU8Array& dataArr)
> {

> 	unsigned long outLong = 0;
> 	if (getLongCheck(strInput, outLong) < 0) {
> 		return -1;
> 	}

> 	unsigned int data = (unsigned int)outLong;
> 	dataArr.Add(data&0xff);			//获取int的低位字节
> 	dataArr.Add((data>>8) & 0xff);	//获取int的第二个字节	
> 	dataArr.Add((data>>16) & 0xff);	//获取int的第三个字节
> 	dataArr.Add((data>>24) &0xff);	//获取int的第四个字节

> 	return 0;
> }

> static int getF(CString& strInput, CU8Array& dataArr)
> {
> 	strInput.TrimLeft();
> 	strInput.TrimRight();

> 	FILE* fp = fopen(strInput, "rb");
> 	if (fp == NULL) {
> 		urgTrace("Error: %s open failed", (const char *)strInput);
> 		return -1;
> 	}

> 	fseek(fp, 0, SEEK_END);
	

> 	DWORD dwLength = ftell(fp);
> 	rewind(fp);
> 	char *buff = (char *)calloc(dwLength, 1);
> 	DWORD numRead = 0;
	
> 	for (;;) {
> 		numRead += fread(buff+numRead, 1, dwLength, fp);
> 		if (numRead == dwLength)
> 			break;
> 	}
	
> 	ASSERT(numRead == dwLength);
> 	for (DWORD i=0; i<dwLength; i++) {
> 		dataArr.Add(buff[i]);
> 	}
> 	free(buff);
> 	fclose(fp);
> 	return 0;
> }

> #define AppendFormat(s, fmt) do {		\
> 		CString tmp_asfd;		\
> 		tmp_asfd.Format fmt;		\
> 		s+=tmp_asfd;			\
> 	} while (0)

> static CString getFormat(const char *dC /* i.e., inputSpec, such as "BB*" */)
> {
> 	CString format;
> 	for (int i=0; dC[i]; i++) {
> 		if (dC[i]=='B' && notOptionalCode(dC[i+1])) {
> 				continue;
> 		} else if (dC[i]=='B' && isMultiOptional(dC[i+1])) {
> 			i++;
> 			format += "[string] ";
> 		} else if (dC[i]=='H' && isSingleOptional(dC[i+1])) {
> 			i++;
> 			format += "[uint16] ";
> 		} else if (dC[i]=='I' && isSingleOptional(dC[i+1])) {
> 			i++;
> 			format += "[uint32] ";
> 		} else if (dC[i]=='B' && isSingleOptional(dC[i+1])) {
> 			i++;
> 			format += "[uint8] ";
> 		} else if (dC[i]=='O' && notOptionalCode(dC[i+1])) {
> 			format += "[uint32 (as opcode)] [uint8]... ";
> 		} else if (dC[i]=='F' && notOptionalCode(dC[i+1])) {
> 			format += "[filename] ";
> 		} else if (dC[i]=='o' && notOptionalCode(dC[i+1])) {
> 			format += "[uint8]... ";
> 		}
> 	}

> 	if (format.IsEmpty()) {
> 		format += "no args";
> 	}
> 	format += "\r\n";
> 	return format;
> }

> static void commands()
> {
> 	CString helpStr("\r\nCommands:\r\n--------------------------------\r\n\r\n");
> 	for (int i=0; cmdMap[i].cmdName!=NULL; i++) {
> 		CString cmdName(cmdMap[i].cmdName);
> 		AppendFormat(helpStr, ("%-25s : "
> 				       "opcode 0x%04x : "
> 				       "%s", cmdName, 
> 				       (unsigned short)cmdMap[i].opCode, 
> 				       getFormat(cmdMap[i].inputSpec)));
> 	}
> 	urgTrace("%s", helpStr);
	
> }

> static void help()
> {
> 	CString helpStr("\r\nHelp:\r\n--------------------------------\r\n\r\n"
> 			"You can type the following to get more infomation:,\r\n"
> 			"\r\n"
> 			"        help: dislay this help\r\n"
> 			"        todo: display to-do in this tool\r\n"
> 			"        bugs: display bugs/defects known\r\n"
> 			"    commands: display a list of available commands\r\n"
> 			"\r\n"
> 			"When you type `commands`, the commands are displayed as `Command : Args`,\r\n"
> 			"Leading and trailing spaces in a command is ignored,\r\n"
> 			"  for e.g., `set keybl 255` is equal to `   set keybl    255   `\r\n"
> 			"but, space in a command is not,\r\n"
> 			"  for e.g., `get keybl` is ok, but `get  keybl` is not a valid command\r\n"
> 			"for those command that want one or more u8/u16/u32 argument, \r\n"
> 			"if none or less that required argument is supplied, a default 0 is used\r\n"
> 			"  for e.g., `set register 0x33 0x44` takes 2 args\r\n"
> 			"  0x33 is register number, 0x44 is the value, \r\n"
> 			"  i.e., register 0x33 will be set to 68 (decimal value of 0x44) \r\n"
> 			"  But, if you run `set register`, then register 0 will be set to 0\r\n"
> 			"And, you can use 0xf/017/15 to mean the same INT, 15.");
			

> 	urgTrace("%s", helpStr);
> }

> static void todo()
> {
> 	CString todoStr("\r\nTodo:\r\n--------------------------------\r\n\r\n"
> 			"    1. make the interface more user-friendly\r\n"
> 			"       for e.g., get gpio should show if the i/o is pu/pd, etc.\r\n"
> 			"    2. implement a better help system\r\n"
> 			"    3. provide a means to clear or save the log to a file\r\n"
> 			"    4. provide a means to save the commands executed to a file\r\n"
> 			"    5. implement execution of commands from the saved commands file\r\n"
> 			"    6. fix bugs");
> 	urgTrace("%s", todoStr);
> }

> static void bugs()
> {
> 	CString bugsStr("\r\nBugs:\r\n--------------------------------\r\n\r\n"
> 			"    1. connection is broken after you disconnect the usb cable\r\n"
> 			"       and must restart the application to reconnect\r\n"
> 			"    2. you must connect the usb cable before you start the application\r\n"
> 			"    3. many other bugs, some are even undiscovered yet\r\n"
> 			"       Please help report bugs/suggestions to haojun.bao@borqs.com");
> 	urgTrace("%s", bugsStr);
> }


> static void printResult(CU8Array& result)
> {
> 	CString recvTrace("\"");
> 	if (result.GetSize()==0) {
> 		return;
> 	}

> 	for (int k=0; k<result.GetSize(); k++) {
> 		if (isprint(result[k])) {
> 			recvTrace += result[k];
> 		} else {
> 			CString tmp;
> 			tmp.Format("\\x%02x", result[k]);
> 			recvTrace += tmp;
> 		}
> 	}
> 	recvTrace+='"';

> 	urgTrace("%s", recvTrace);

> 	recvTrace = "   in hex: ";
> 	for (k=0; k<result.GetSize(); k++) {
> 		CString tmp;
> 		tmp.Format("0x%02x ", result[k]);
> 		recvTrace += tmp;
> 	}
> 	dbgTrace("%s", recvTrace);
								   
> 	return;
> }

> static BOOL isFromUser(char where)
> {
> 	return where == '>';
> }

> static BOOL isFromFixed(char where)
> {
> 	return where == '<';
> }

> static BOOL isArbitrary(char where)
> {
> 	return where == '!';
> }

> static BOOL isMultiple(char where)
> {
> 	return where == '*';
> }

> static int getArg(CU8Array& dataArr, CString& strUserInput, CString& strFixedInput, char dataType, char where)
> {
> 	if (dataType == 'B') {
> 		if (isFromUser(where)) {
> 			return getB(strUserInput, dataArr);
> 		} else if (isFromFixed(where)) {
> 			return getB(strFixedInput, dataArr);
> 		} else if (isArbitrary(where)) {
> 			return getB(CString("0"), dataArr);
> 		} else if (isMultiple(where)) { //the rest of the user-input is consumed

> 			for (int k=0; k<strUserInput.GetLength(); k++) {
> 				dataArr.Add(strUserInput[k]);
> 			}
> 			strUserInput = ""; //empty user-input
> 			return 0;
> 		}
> 	} else if (dataType == 'H') {
> 		if (isFromUser(where)) {
> 			return getH(strUserInput, dataArr);
> 		} else if (isFromFixed(where)) {
> 			return getH(strFixedInput, dataArr);
> 		} else if (isArbitrary(where)) {
> 			return getH(CString("0"), dataArr);
> 		} else {
> 			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
> 			return -1;
> 		}
> 	} else if (dataType == 'I') {
> 		if (isFromUser(where)) {
> 			return getI(strUserInput, dataArr);
> 		} else if (isFromFixed(where)) {
> 			return getI(strFixedInput, dataArr);
> 		} else if (isArbitrary(where)) {
> 			return getI(CString("0"), dataArr);
> 		} else {
> 			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
> 			return -1;
> 		}
> 	} else if (dataType == 'o') {
> 		strUserInput.TrimLeft();
> 		CString savedCommand = strUserInput;
					
> 		for (int k=0;;k++) { //infinite loop, k is only for debugging
> 			if (strUserInput.IsEmpty()) {
> 				break;
> 			}
> 			getB(strUserInput, dataArr);
> 			if (strUserInput == savedCommand) {
> 				urgTrace("invalid arguments, `%s'", savedCommand);
> 				return -1;
> 			}
> 			strUserInput.TrimLeft();
> 			savedCommand = strUserInput;
> 		}
		
> 		return 0;
> 	} else if (dataType == 'F') {
> 		if (!isFromUser(where)) {
> 			urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
> 		}				
> 		return getF(strUserInput, dataArr);
> 	} else {
> 		urgTrace("Error: alchemy bug detected, code is %c %c", dataType, where);
> 		return -1;
> 	}

> 	return 0;
> }

> int cliCarryOut(const char *sCommand)
> {
> 	return cliCarryOut(CString(sCommand));
> }

> int cliCarryOut(const CString& sCommand)
> {
> 	CU8Array result;
> 	return cliCarryOut(sCommand, result);
> }

> //resolve the command send by IDC_EXEC_COMMAND
> int cliCarryOut(const CString& sCommandConst, CU8Array& result)
> {
> 	if (alchemyInited == FALSE) {
> 		urgTrace("Must call InitAlchemyLib first!\n");
> 		return -1;
> 	}

> 	//we need to change the input string, so make a copy to remove the `const'
> 	CString sCommand = sCommandConst;
> 	sCommand.TrimLeft();
> 	sCommand.TrimRight();
	
> 	for (int i=0; cmdMap[i].cmdName; i++) {
> 		if (sCommand.Find(cmdMap[i].cmdName) == 0) {
> 			const char *inputSpec = cmdMap[i].inputSpec;
> 			const char *fixedInput = cmdMap[i].fixedInput;
> 			int opcode = cmdMap[i].opCode;  // this will change if cmd is "opcode"
			
> 			//so that only args to the cmd is in sCommand
> 			sCommand.Delete(0, strlen(cmdMap[i].cmdName));
> 			sCommand.TrimLeft();
			
> 			CString strUserInput = sCommand;
> 			CString strFixedInput = fixedInput? fixedInput : "";
			
> 			CU8Array dataArr; //empty at first

> 			//handle opcode first:
> 			if (opcode < 0) {
> 				opcode = getLong(strUserInput);
> 			}
			
> 			for (int j=0; inputSpec[j]; j=j+2) {
> 				int n = getArg(dataArr, strUserInput, strFixedInput, inputSpec[j], inputSpec[j+1]);

> 				if (n < 0) {
> 					urgTrace("Error: don't know how to parse the input string:\n    %s", (const char*)sCommandConst);
> 				}
> 			} 

> 			if (strUserInput.GetLength()) {
> 				urgTrace("Error: argument parse failed, `%s' is remaining in the command string", strUserInput);
> 				return -1;
> 			}

> 			BYTE recv[1024] = {0};
> 			int nRecv = 0;

> 			CString sendTrace("send: \"opCode ");
> 			CString tmp;
> 			tmp.Format("0x%08x,data: ", opcode);
> 			sendTrace+=tmp;
> 			for (int k=0; k<min(10,dataArr.GetSize()); k++) {
> 				CString tmp;
> 				tmp.Format("0x%02x ", dataArr[k]);
> 				sendTrace+=tmp;
> 			}
> 			if (dataArr.GetSize()>10) {
> 				sendTrace+="...";
> 			}
> 			dbgTrace("%s", sendTrace);

> 			int ret = getConnection()->UC_Do3rdCommand(opcode,
> 								   dataArr,
> 								   result,
> 								   cmdMap[i].cmdName);
> 			printResult(result);
> 			if (ret < 0) {
> 				infoTrace("`%s`: failed!", cmdMap[i].cmdName);
> 				return -1;
> 			} else {
> 				infoTrace("`%s`: success!", cmdMap[i].cmdName);
> 				return 0;
> 			}
> 		}
> 	}
> 	if (sCommand.Find("help") == 0) {
> 		help();
> 	} else if (sCommand.Find("todo") == 0) {
> 		todo();
> 	} else if (sCommand.Find("bugs") == 0) {
> 		bugs();
> 	} else if (sCommand.Find("commands") == 0) {
> 		commands();
> 	} else {
> 		urgTrace("%s", sCommand+=": unknown command");
> 	} 
> 	return 0;
> }






^ permalink raw reply	[flat|nested] 4+ messages in thread

* Processed: Re: bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux)
  2009-04-10 17:50 ` Stefan Monnier
@ 2009-04-10 17:55   ` Emacs bug Tracking System
  2011-10-03 20:18   ` Glenn Morris
  1 sibling, 0 replies; 4+ messages in thread
From: Emacs bug Tracking System @ 2009-04-10 17:55 UTC (permalink / raw
  To: Stefan Monnier; +Cc: Emacs Bugs, ccmode for {2947}

Processing commands for control@emacsbugs.donarmstrong.com:

> reassign 2947 emacs,cc-mode
bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux)
Warning: Unknown package 'cc-mode'
bug reassigned from package `emacs' to `emacs,cc-mode'.

> thanks
Stopping processing here.

Please contact me if you need assistance.

Don Armstrong
(administrator, Emacs bugs database)




^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux)
  2009-04-10 17:50 ` Stefan Monnier
  2009-04-10 17:55   ` Processed: " Emacs bug Tracking System
@ 2011-10-03 20:18   ` Glenn Morris
  1 sibling, 0 replies; 4+ messages in thread
From: Glenn Morris @ 2011-10-03 20:18 UTC (permalink / raw
  To: 2947-done

Version: 23.3

I can reproduce the problem, by opening the file in c++-mode and then
doing `M-x isearch-forward get m'. (I think the original report meant
line 171 rather than line 117).

However, it seems to be fixed in Emacs 23.3 and up.





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-10-03 20:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-10  5:27 bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux) Bao Haojun
2009-04-10 17:50 ` Stefan Monnier
2009-04-10 17:55   ` Processed: " Emacs bug Tracking System
2011-10-03 20:18   ` Glenn Morris

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.