From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Bao Haojun Newsgroups: gmane.emacs.bugs,gmane.emacs.pretest.bugs Subject: bug#2947: 23.0.91; font-lock-mode will hang emacs on this file (both on Windows/Linux) Date: Fri, 10 Apr 2009 13:27:51 +0800 Message-ID: <83prflkrhk.fsf@borqs.com> Reply-To: Bao Haojun , 2947@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1239381016 32080 80.91.229.12 (10 Apr 2009 16:30:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 10 Apr 2009 16:30:16 +0000 (UTC) To: emacs-pretest-bug@gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Apr 10 18:31:34 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LsJdV-0001xC-BH for geb-bug-gnu-emacs@m.gmane.org; Fri, 10 Apr 2009 18:31:26 +0200 Original-Received: from localhost ([127.0.0.1]:44851 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LsJc6-0005Ni-RL for geb-bug-gnu-emacs@m.gmane.org; Fri, 10 Apr 2009 12:29:58 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Ls9Ww-0005mr-Fr for bug-gnu-emacs@gnu.org; Fri, 10 Apr 2009 01:43:58 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ls9Wq-0005mY-Em for bug-gnu-emacs@gnu.org; Fri, 10 Apr 2009 01:43:57 -0400 Original-Received: from [199.232.76.173] (port=35899 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ls9Wq-0005mV-9X for bug-gnu-emacs@gnu.org; Fri, 10 Apr 2009 01:43:52 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:55716) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Ls9Wp-00069B-F9 for bug-gnu-emacs@gnu.org; Fri, 10 Apr 2009 01:43:52 -0400 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n3A5hnuB026839; Thu, 9 Apr 2009 22:43:49 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id n3A5Z3tX023896; Thu, 9 Apr 2009 22:35:03 -0700 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: Bao Haojun Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs Resent-Date: Fri, 10 Apr 2009 05:35:03 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: report 2947 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by submit@emacsbugs.donarmstrong.com id=B.123934128422276 (code B ref -1); Fri, 10 Apr 2009 05:35:03 +0000 Original-Received: (at submit) by emacsbugs.donarmstrong.com; 10 Apr 2009 05:28:04 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from fencepost.gnu.org (fencepost.gnu.org [140.186.70.10]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n3A5Rw2A022259 for ; Thu, 9 Apr 2009 22:28:00 -0700 Original-Received: from mail.gnu.org ([199.232.76.166]:54509 helo=mx10.gnu.org) by fencepost.gnu.org with esmtp (Exim 4.67) (envelope-from ) id 1Ls9HR-0000Ia-QS for emacs-pretest-bug@gnu.org; Fri, 10 Apr 2009 01:27:58 -0400 Original-Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1Ls9HO-0004d2-LP for emacs-pretest-bug@gnu.org; Fri, 10 Apr 2009 01:27:57 -0400 Original-Received: from smtp103.biz.mail.mud.yahoo.com ([68.142.200.238]:45544) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1Ls9HO-0004cu-0J for emacs-pretest-bug@gnu.org; Fri, 10 Apr 2009 01:27:54 -0400 Original-Received: (qmail 40460 invoked from network); 10 Apr 2009 05:27:52 -0000 Original-Received: from unknown (HELO BHJ1.borqs.com) (haojun.bao@122.200.68.238 with login) by smtp103.biz.mail.mud.yahoo.com with SMTP; 10 Apr 2009 05:27:50 -0000 X-Yahoo-SMTP: OoVJaCSswBBEswerdY_I8Ogt5424kPafFTF4mzWcwmhN X-YMail-OSG: 51R2M0gVM1mSL5HyB1OQ5UBE52fKwRVqStRzwRI.OhA4SRSG.TYpH7Rv9DJ9aceQcKlDGqvPo6ExlBjQz1jbAWzibWKxUG2e0MQXDAOA8QQUQgfGR.QpPRkzUkaf9CPL1.RxpJD..gQi4oV34MBNa3REDWRjzBvdGrW1j7ofs1ZmxAZ_SNmkITR2ze2hUMyv4p.o4xCP1wvP38lMeSDwLQ5KtBzmT._zu1M.srv5IBr4mLwpLIf.xAgR2sGbvnnnhEnsuM1WjnK33TN2CYYuo8omHo7ClmIZVup0AhjYrC3QMtt4II8AgEywxbjUPtbbQfes8NvmTERQrd_Zf7lI X-Yahoo-Newman-Property: ymail-3 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.91 (windows-nt) X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Resent-Date: Fri, 10 Apr 2009 01:43:57 -0400 X-Mailman-Approved-At: Fri, 10 Apr 2009 12:23:30 -0400 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:27062 gmane.emacs.pretest.bugs:24262 Archived-At: --=-=-= The file is attached, the offending character is the last `"' character on line 117: {"get micco", MICCO_TEST, "BB>", "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: C-x C-f s r c / c l i e n g a l c j s c l i M-x M-p C-k f o n t l o m o C-e C-b C-b " C-x C-s M-x C-g M-x g l o b f o n M-x r e p o r 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 --=-=-= Content-Type: text/plain; charset=gb18030 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable #include "stdafx.h" #include "alchemy_internal.h" #include #include "cli.h" #define ENABLE_BHJDEBUG #include "bhjdebug.h"=20 typedef enum { FACTORY_ID =3D 0x001, GPIO_TEST =3D 0x003, REGISTER_TEST =3D 0x004, ADC_TEST =3D 0x005, REBOOT_TEST =3D 0x006, CAMERA_TEST =3D 0x007, BLUETOOTH_TEST =3D 0x008, TESTINFO =3D 0x009, ATPARSER_TEST =3D 0x00a, VIBRATOR_TEST =3D 0x00b, POWERREASON_TEST=3D0x00c, VOLTAGE_TEST =3D 0x00d, /*get real voltage by ADC */ TEMPRATURE_TEST =3D 0x00e, /*get real temprature by ADC */ CHARGETYPE_TEST =3D0x00f, GSENSOR_TEST =3D 0x010, MICCO_TEST =3D 0x011, LCDBACK_TEST =3D 0x012, KEYBACK_TEST =3D 0x013, TOUCH_POINT =3D0x014, KEY_INPUT =3D 0x015, ONLY_Key =3D 0x031, LGSENSOR_TEST =3D 0x01c, GSENSOR_INFO =3D 0x01d, =09 /* DDR test commands */ Ddr_TEST =3D 0x01f, /* LCD test commands */ LCD_TEST =3D 0x20, /* T-FLASH card detect*/ CARD_TEST =3D0x021,=20=20 /* charge status */ CHARGESTATUS_TEST =3D 0x022,=20 =20=20=20=20 /* MAT FILE Read AND write */ MAT_TEST =3D 0x023 , =09 /*audio hardware test */ AUDIO_TEST =3D 0x024, =20=20=20=20=20 =20=20=20=20 /* ADC calibration &NVM block operation related test commands*/ CALI_TEMP =3D 0x016, /*only operation on filesystem file*/ CALI_VOLT =3D 0x017, /*only operation on filesystem file*/ NVM_TEST =3D 0X018, VOLT_TEST =3D 0x019, /*read /write from filesystem to NVM block*/ TEMP_TEST =3D 0x01a, /*read /write from filesystem to NVM block*/ RF_TEST =3D 0x01b, /*read /write from filesystem to NVM block*/ TESTINFO_TEST =3D0x025,/*read /write from filesystem to NVM block*/ FACTORYID_TEST=3D0x026,/*read /write from filesystem to NVM block*/ MATFLAG_TEST=3D0x027,/*read /write from filesystem to NVM block*/ =20=20=20=20 /*touch panel test */ PANEL_TEST =3D 0x028, /*empty test */ EMPTY_TEST =3D 0x029, =20=20=20 /* bluetooth test commands */ BT_TEST =3D 0x050, BTNVM_TEST=3D 0x051, BT_INQUIRE=3D 0x052, BT_TESTMODE =3D0x053, BT_KILL=3D0x054,//kill the "/system/bin/hciattach" process after enter = into BT Test Mode /BTINQUIRE=20 /*camera test commands */ CAMERA_PREVIEW =3D 0x060, LAUNCH_CAMERA =3D 0x61, I2C_TEST =3D 0x01e, =20=20=20=20 /*CMMB test commands */ IF101_TEST=3D 0x070,=20=20=20=20 INNO_DEVICE=3D 0x071, /*enter or exit CMMB test mode*/ Signallock_TEST =3D 0x72, Sensitive_TEST =3D 0x73, IF101_SPI_TEST =3D 0x74, IF101_SET_FREQ =3D 0x75, LAUNCH_TV =3D 0x76, /* GPS test commands */=20 GPS_TEST =3D 0x80, GPS_LOCATION=3D0x81, GPS_MESSAGE=3D0x82,/*only get NEMA Message*/ GPS_LOCA_MESSAGE=3D0x83,/*only get Location Message*/ GPS_CHANGE_MODE=3D0x84,/*Change between hot mode and code mode*/ =20=20 /* SPARK */ SPARK_KEY=3D0x90,/*TEST KEY INPUT*/ /* Key Monitor */ KEY_MONITOR=3D0x91, /* Sensor Monitor */ SENSOR_MONITOR=3D0x92, /* Set/Get LPR SMS report flag */ SMS_FLAG =3D0x93, /* Set/Get LPR livetime period */ LIVETIME_PERIOD =3D 0x94, /* Set/Get EFEM feature flag */ EFEM_FLAG =3D0x95, DIAG_LAUNCH=3D0x96,=09 GET_RDNVM =3D0x9a, DIAG_EXT_INTERFACE=3D0x9b, /*to set /get element config value */ NVM_Element=3D0x9c, /*to set /get phase data : */ NVM_PHASE =3D0x9d, /*Common set/get Bit config element value*/ NVM_BITCONFIG =3D0x9e,=20 /* Version */ VERSION =3D 0x039, =20=20=20=20 /* bp only handler */ BP_ONLY =3D 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: <>*!=20 const char *fixedInput; const char *description; =09 } testCmd_T; //< means from the fixedInput,=20 //> means from user provided input,=20 //! means arbitrary value is acceptable, so we just use 0,=20 //* means fill with a string static testCmd_T cmdMap[] =3D { {"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, "BB!", "0x1", "Get GPIO, the u16 argument is th= e GPIO number"}, {"set gpio", GPIO_TEST, "BB>", "0x2",=20 "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, "BI!", "0x1", "Read register value, u32= is register number. Use with caution!"}, {"set register", REGISTER_TEST, "BI>", "0x2", "Write register, first u3= 2 is register number, second is value"}, {"get adc", ADC_TEST, "B>H!", "", "Read A/D converter value, u8 is AD numb= er" }, {"reboot poweroff", REBOOT_TEST, "B<", "0x0", "reboot to poweroff mode"}, {"reboot factory", REBOOT_TEST, "B<", "0x1" "reboot to factory mode (minim= al 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, "BB!", "0x1", "get gravity sensor value, = u8 is the gsensor number"}, {"set gsensor", GSENSOR_TEST, "BB>", "0x2", "set gsensor value, first u= 8 is the gsensor number, second is value"}, {"get micco", MICCO_TEST, "BB>", "0x1", "}, {"set micco", MICCO_TEST, "BB>", "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", "0x2"}, {"get manual voltage", VOLTAGE_TEST, "B<", "0x0"}, {"get auto voltage", VOLTAGE_TEST, "B<", "0x4"}, {"get manual temperature", TEMPRATURE_TEST, "B<", "0x1"},//0x0?=20 {"get auto temperature", TEMPRATURE_TEST, "B<", "0x5"}, {"get lcdbl", LCDBACK_TEST, "B", "0x1"}, {"set lcdbl", LCDBACK_TEST, "B", "0x2"}, {"get keybl", KEYBACK_TEST, "B", "0x1"}, {"set keybl", KEYBACK_TEST, "B", "0x2"}, {"test touch", TOUCH_POINT, "", ""}, {"test keyinput",ONLY_Key,"",""}, {"get lprflag", SMS_FLAG, "B<", "0x1"}, {"set lprflag", SMS_FLAG, "B", "0x2"}, {"get lprtime", LIVETIME_PERIOD, "B<", "0x1"}, {"set lprtime", LIVETIME_PERIOD, "B", "0x2"}, {"get efemflag", EFEM_FLAG, "B<", "0x1"}, {"set efemflag", EFEM_FLAG, "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",""}, {"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","0x1"}, {"get diag_en",DIAG_LAUNCH,"B<","0x1"}, {"set diag_en",DIAG_LAUNCH,"B","0x2"}, {"get diag_intf",DIAG_EXT_INTERFACE,"B<","0x1"}, {"set diag_intf",DIAG_EXT_INTERFACE,"B","0x2"}, {"get element",NVM_Element,"I>B<","0x1"}, {"set element",NVM_Element,"I>BB<","0x1"}, {"set phase",NVM_PHASE,"I>B","0x2"}, {"get ap_panic_report",NVM_BITCONFIG,"I>B<","0x1"}, {"set ap_panic_report",NVM_BITCONFIG,"I>B","0x2"}, {"opcode", -1, "o>", ""}, {"reliable data", 0x97, "F>", ""}, {NULL, 0, NULL, NULL}, }; static BOOL notOptionalCode(char c) { return (c!=3D'*' && c!=3D'?'); } static BOOL isOptionalCode(char c) { return !notOptionalCode(c); } static BOOL isSingleOptional(char c) { return c=3D=3D'?'; } static BOOL isMultiOptional(char c) { return c=3D=3D'*'; } static unsigned long getLong(CString& strInput) { const char *s =3D strInput.GetBufferSetLength(strInput.GetLength()); char *firstInvalid =3D NULL; =09 long dataH =3D 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)=20 { outLong =3D 0; =09 strInput.TrimLeft(); strInput.TrimRight(); if (strInput.IsEmpty()) { return -1; } int len =3D strInput.GetLength(); outLong =3D (unsigned long)getLong(strInput); if (len =3D=3D strInput.GetLength()) { return -1; } return 0; } static int getB(CString& strInput, CU8Array& dataArr) { unsigned long outLong =3D 0; if (getLongCheck(strInput, outLong) < 0) { return -1; } unsigned char data =3D (unsigned char)outLong; dataArr.Add(data); return 0; } //'H' stands for a short static int getH(CString& strInput, CU8Array& dataArr) { unsigned long outLong =3D 0; if (getLongCheck(strInput, outLong) < 0) { return -1; } unsigned short data =3D (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 =3D 0; if (getLongCheck(strInput, outLong) < 0) { return -1; } unsigned int data =3D (unsigned int)outLong; dataArr.Add(data&0xff); //=BB=F1=C8=A1int=B5=C4=B5=CD=CE=BB=D7=D6=BD=DA dataArr.Add((data>>8) & 0xff); //=BB=F1=C8=A1int=B5=C4=B5=DA=B6=FE=B8=F6= =D7=D6=BD=DA=09 dataArr.Add((data>>16) & 0xff); //=BB=F1=C8=A1int=B5=C4=B5=DA=C8=FD=B8=F6= =D7=D6=BD=DA dataArr.Add((data>>24) &0xff); //=BB=F1=C8=A1int=B5=C4=B5=DA=CB=C4=B8=F6= =D7=D6=BD=DA return 0; } static int getF(CString& strInput, CU8Array& dataArr) { strInput.TrimLeft(); strInput.TrimRight(); FILE* fp =3D fopen(strInput, "rb"); if (fp =3D=3D NULL) { urgTrace("Error: %s open failed", (const char *)strInput); return -1; } fseek(fp, 0, SEEK_END); =09 DWORD dwLength =3D ftell(fp); rewind(fp); char *buff =3D (char *)calloc(dwLength, 1); DWORD numRead =3D 0; =09 for (;;) { numRead +=3D fread(buff+numRead, 1, dwLength, fp); if (numRead =3D=3D dwLength) break; } =09 ASSERT(numRead =3D=3D dwLength); for (DWORD i=3D0; i'; } static BOOL isFromFixed(char where) { return where =3D=3D '<'; } static BOOL isArbitrary(char where) { return where =3D=3D '!'; } static BOOL isMultiple(char where) { return where =3D=3D '*'; } static int getArg(CU8Array& dataArr, CString& strUserInput, CString& strFix= edInput, char dataType, char where) { if (dataType =3D=3D '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=3D0; k10) { sendTrace+=3D"..."; } dbgTrace("%s", sendTrace); int ret =3D 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") =3D=3D 0) { help(); } else if (sCommand.Find("todo") =3D=3D 0) { todo(); } else if (sCommand.Find("bugs") =3D=3D 0) { bugs(); } else if (sCommand.Find("commands") =3D=3D 0) { commands(); } else { urgTrace("%s", sCommand+=3D": unknown command"); }=20 return 0; } --=-=-=--