Fmt.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941
  1. /********************************************************************
  2. 版权所有:
  3. 文件版本: V1.00
  4. 文件名称: fmt.c
  5. 生成日期: 2007年04月26日
  6. 作 者:xxxxxx
  7. 使用范围:
  8. 功 能: 菜单内容格式分析
  9. 更新信息:
  10. 更新日志1:
  11. 修改者:
  12. 修改日期:
  13. 修改内容:
  14. 修改原因:
  15. *********************************************************************/
  16. #include <stdarg.h>
  17. #include "head.h"
  18. MODIFY_DEF g_tModify; /* 修改数据的结构*/
  19. static void itoa1(short int value,char *pbuf)
  20. {
  21. sprintf(pbuf,"%i",value);
  22. }
  23. /**************************************************************************
  24. 函数名称:itoa
  25. 函数版本:1.00
  26. 作者:
  27. 创建日期:2008.9.1
  28. 函数功能说明:完成函数itoa的功能,将整数转为字符串
  29. 输入参数:
  30. 输出参数:
  31. 返回值:
  32. 更新信息:
  33. 更新日志1:
  34. 日期:
  35. 修改者:
  36. 修改内容:
  37. 修改原因:
  38. ***************************************************************************/
  39. static void itoa2(int value,char *pbuf)
  40. {
  41. // %i 输出整数
  42. sprintf(pbuf,"%i",value);
  43. }
  44. /**************************************************************************
  45. 函数名称:ltoa
  46. 函数版本:1.00
  47. 作者:
  48. 创建日期:2008.9.1
  49. 函数功能说明:将长整数转为字符串
  50. 输入参数:
  51. 输出参数:
  52. 返回值:
  53. 更新信息:
  54. 更新日志1:
  55. 日期:
  56. 修改者:
  57. 修改内容:
  58. 修改原因:
  59. ***************************************************************************/
  60. #if 0
  61. static void ltoa(long value,char *pbuf)
  62. {
  63. sprintf(pbuf,"%ld",value);
  64. }
  65. #endif
  66. /**************************************************************************
  67. 函数名称:itostr
  68. 函数版本:1.00
  69. 作者:
  70. 创建日期:2008.9.1
  71. 函数功能说明:将长整数按格式转换为字符串
  72. 输入参数:
  73. 输出参数:
  74. 返回值:
  75. 更新信息:
  76. 更新日志1:
  77. 日期:
  78. 修改者:
  79. 修改内容:
  80. 修改原因:
  81. ***************************************************************************/
  82. static void itostr(unsigned int value,char *pbuf,char basetype)
  83. {
  84. switch(basetype)
  85. {
  86. case 8:
  87. sprintf(pbuf,"%o",value);
  88. break;
  89. case 10:
  90. sprintf(pbuf,"%u",value);
  91. break;
  92. case 16:
  93. sprintf(pbuf,"%x",value);
  94. break;
  95. case 17:
  96. sprintf(pbuf,"%X",value);
  97. break;
  98. default:
  99. strcpy(pbuf,"Format error!");
  100. break;
  101. }
  102. }
  103. /**************************************************************************
  104. 函数名称:stostr
  105. 函数版本:1.00
  106. 作者:
  107. 创建日期:2008.9.1
  108. 函数功能说明:将短整数按格式转换为字符串
  109. 输入参数:
  110. 输出参数:
  111. 返回值:
  112. 更新信息:
  113. 更新日志1:
  114. 日期:
  115. 修改者:
  116. 修改内容:
  117. 修改原因:
  118. ***************************************************************************/
  119. static void stostr(unsigned short value,char *pbuf,char basetype)
  120. {
  121. switch(basetype)
  122. {
  123. case 8:
  124. sprintf(pbuf,"%o",value);
  125. break;
  126. case 10:
  127. sprintf(pbuf,"%u",value);
  128. break;
  129. case 16:
  130. sprintf(pbuf,"%x",value);
  131. break;
  132. case 17:
  133. sprintf(pbuf,"%X",value);
  134. break;
  135. default:
  136. strcpy(pbuf,"Format error!"); /**/
  137. break;
  138. }
  139. }
  140. /**************************************************************************
  141. 函数名称:ltostr
  142. 函数版本:1.00
  143. 作者:
  144. 创建日期:2008.9.1
  145. 函数功能说明:将无符号长整数按格式转换为字符串
  146. 输入参数:
  147. 输出参数:
  148. 返回值:
  149. 更新信息:
  150. 更新日志1:
  151. 日期:
  152. 修改者:
  153. 修改内容:
  154. 修改原因:
  155. ***************************************************************************/
  156. #if 0
  157. static void ltostr(unsigned long int value,char *pbuf,char basetype)
  158. {
  159. switch(basetype)
  160. {
  161. case 10:
  162. sprintf(pbuf,"%lu",value);
  163. break;
  164. case 16:
  165. sprintf(pbuf,"%lx",value);
  166. break;
  167. case 17:
  168. sprintf(pbuf,"%lX",value);
  169. break;
  170. default:
  171. sprintf(pbuf,"%lu",value);
  172. break;
  173. }
  174. }
  175. #endif
  176. /**************************************************************************
  177. 函数名称:ftoa
  178. 函数版本:1.00
  179. 作者:
  180. 创建日期:2008.9.1
  181. 函数功能说明:将浮点数按格式转换为字符串
  182. 输入参数:
  183. 输出参数:
  184. 返回值:
  185. 更新信息:
  186. 更新日志1:
  187. 日期:
  188. 修改者:
  189. 修改内容:
  190. 修改原因:
  191. ***************************************************************************/
  192. static void ftoa(float value,char *pbuf,char basetype,char precison)
  193. {
  194. basetype=basetype;
  195. switch(precison)
  196. {
  197. case 0:
  198. sprintf(pbuf,"%.0f",value);/*Right?*/
  199. break;
  200. case 1:
  201. sprintf(pbuf,"%.1f",value);
  202. break;
  203. case 2:
  204. sprintf(pbuf,"%.2f",value);
  205. break;
  206. case 3:
  207. sprintf(pbuf,"%.3f",value);
  208. break;
  209. case 4:
  210. sprintf(pbuf,"%.4f",value);
  211. break;
  212. default:
  213. sprintf(pbuf,"%.3f",value);
  214. break;
  215. }
  216. }
  217. /**************************************************************************
  218. 函数名称:atof1
  219. 函数版本:1.00
  220. 作者:
  221. 创建日期:2008.9.1
  222. 函数功能说明:将字符串转为浮点数
  223. 输入参数:
  224. 输出参数:
  225. 返回值:
  226. 更新信息:
  227. 更新日志1:
  228. 日期:
  229. 修改者:
  230. 修改内容:
  231. 修改原因:
  232. ***************************************************************************/
  233. float atof1(char *str) // 将字符串转为浮点数
  234. {
  235. float ff;
  236. char fstr[20];
  237. int dot,dignum,num,divn;
  238. dot=-1;
  239. num=0;
  240. dignum=0;
  241. for(;*str!='\0';str++)
  242. {
  243. if(*str=='-'||*str=='+')
  244. {
  245. fstr[num++]=*str;
  246. if(num>19)break;
  247. }
  248. else if(*str>='0'&&*str<='9')
  249. {
  250. fstr[num++]=*str;
  251. dignum++;
  252. if(num>19)break;
  253. }
  254. else if(*str=='.')// 小数点位置
  255. {
  256. dot=dignum;
  257. }
  258. }
  259. fstr[num]=0;
  260. ff=(float)atol(fstr); // 取得没有小数点的数字
  261. if(dot==-1||dot==dignum) // 没有小数点或小数点在最后面
  262. {
  263. return ff;
  264. }
  265. divn=1;
  266. dot=dignum-dot;
  267. for(;dot>0;dot--)
  268. {
  269. divn*=10;
  270. }
  271. return (ff/divn);
  272. }
  273. /***************************************************************************
  274. ** 功能: 对一个浮点数值的字符串进行转换后处理,即给任何格式(f,e,E,g,G)的 **
  275. ** 不带小数点的浮点数字符串加上小数点 **
  276. ** 入口: TempPtr是被处理浮点数字符串的指针 **
  277. ** Precision是被处理浮点数字符串的显示精度 **
  278. ** 出口: 处理后浮点数字符串的指针是TempPtr **
  279. ***************************************************************************/
  280. static void AddDotsFloat(char *TempPtr,unsigned char Precision)
  281. {
  282. char Temp;
  283. if(Precision==0){
  284. for(;*TempPtr!='e'&&*TempPtr!='E'&&*TempPtr!='\0';TempPtr++){}
  285. Temp=*TempPtr;
  286. for(;*TempPtr!='\0';TempPtr++){}
  287. *(TempPtr+1)='\0';
  288. for(;*TempPtr!=Temp;TempPtr--)
  289. *TempPtr=*(TempPtr-1);
  290. *TempPtr='.';
  291. }
  292. }
  293. /***************************************************************************
  294. ** 功能: 将一个任何格式(f,e,E,g,G)的显示精度为零的带小数点的浮点数字符串 **
  295. ** 的小数点删除 **
  296. ** 入口: TempPtr是被处理浮点数字符串的指针 **
  297. ** 出口: 处理后浮点数字符串的指针是TempPtr **
  298. ***************************************************************************/
  299. static void DelDotsFloat(char *TempPtr)
  300. {
  301. for(;*TempPtr!='e'&&*TempPtr!='E'&&*TempPtr!='\0';TempPtr++){}
  302. TempPtr--;
  303. if(*TempPtr=='.')
  304. {
  305. for(;*TempPtr!='\0';TempPtr++)
  306. *TempPtr=*(TempPtr+1);
  307. *TempPtr='\0';
  308. }
  309. }
  310. /***************************************************************************
  311. ** 功能: 将与带符号整数和浮点数相对应的具有缺省格式的字符串转变成给定格 **
  312. ** 式的字符串 **
  313. ** 入口: Flags是标志字符序列指针 **
  314. ** Width是输出字符串的最小宽度 **
  315. ** TempStr是具有缺省格式的字符串的指针 **
  316. ** 出口: 返回输出字符串的长度 **
  317. ** 输出字符串在TempStr指向的字符数组中 **
  318. ***************************************************************************/
  319. static void SignedFormatOut(char *Flags,unsigned char Width,char *TempStr)
  320. {
  321. char *TempPtr;
  322. char NFlags;
  323. int i;
  324. int ii;
  325. i=0;
  326. /*处理浮点数的小数点(在浮点数没有小数的时候)*/
  327. TempPtr=Flags;
  328. for(;*TempPtr!='#'&&*TempPtr!='\0';TempPtr++){}
  329. if(*TempPtr=='\0')
  330. DelDotsFloat(TempStr);
  331. /*预处理数值符号*/
  332. if(*TempStr=='-')
  333. {
  334. TempPtr=TempStr;
  335. for(ii=0;*TempPtr!='\0';TempPtr++,ii++)
  336. *TempPtr=*(TempPtr+1);
  337. *TempPtr='\0';
  338. ii--;
  339. NFlags=1;
  340. }
  341. else
  342. {
  343. TempPtr=TempStr;
  344. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  345. NFlags=0;
  346. }
  347. /*检查标志字符序列中是否有'+'*/
  348. TempPtr=Flags;
  349. for(;*TempPtr!='+'&&*TempPtr!='\0';TempPtr++){}
  350. if(*TempPtr=='+')
  351. {
  352. i=(int)Width-ii-1;
  353. if(i>0)
  354. {
  355. /*检查标志字符序列中是否有'*'*/
  356. TempPtr=Flags;
  357. for(;*TempPtr!='*'&&*TempPtr!='\0';TempPtr++){}
  358. if(*TempPtr=='*')
  359. {
  360. /*在临时字符串中写'0'*/
  361. TempPtr=TempStr;
  362. for(;*TempPtr!='\0';TempPtr++){}
  363. for(ii++;ii>0;ii--,TempPtr--)
  364. *(TempPtr+i)=*TempPtr;
  365. TempPtr++;
  366. for(ii=i;ii>0;ii--)
  367. *TempPtr++='0';
  368. /*在临时字符串中写符号标志*/
  369. TempPtr=TempStr;
  370. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  371. for(ii++;ii>0;ii--,TempPtr--)
  372. *(TempPtr+1)=*TempPtr;
  373. TempPtr++;
  374. if(NFlags)
  375. *TempPtr='-';
  376. else
  377. *TempPtr=' ';
  378. }
  379. else
  380. {
  381. /*在临时字符串中写符号标志*/
  382. TempPtr=TempStr;
  383. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  384. for(ii++;ii>0;ii--,TempPtr--)
  385. *(TempPtr+1)=*TempPtr;
  386. TempPtr++;
  387. if(NFlags)
  388. *TempPtr='-';
  389. else
  390. *TempPtr=' ';
  391. /*检查标志字符序列中是否有'-'*/
  392. TempPtr=Flags;
  393. for(;*TempPtr!='-'&&*TempPtr!='\0';TempPtr++){}
  394. if(*TempPtr=='-')
  395. {
  396. /*如果是左对齐,在临时字符串右端写' '*/
  397. TempPtr=TempStr;
  398. for(;*TempPtr!='\0';TempPtr++){}
  399. for(ii=i;ii>0;ii--)
  400. *TempPtr++=' ';
  401. *TempPtr='\0';
  402. }
  403. else
  404. {
  405. /*在临时字符串左端写' '*/
  406. TempPtr=TempStr;
  407. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  408. for(ii++;ii>0;ii--,TempPtr--)
  409. *(TempPtr+i)=*TempPtr;
  410. TempPtr++;
  411. for(ii=i;ii>0;ii--)
  412. *TempPtr++=' ';
  413. }
  414. }
  415. }
  416. else
  417. {
  418. /*在临时字符串中写符号标志*/
  419. TempPtr=TempStr;
  420. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  421. for(ii++;ii>0;ii--,TempPtr--)
  422. *(TempPtr+1)=*TempPtr;
  423. TempPtr++;
  424. if(NFlags)
  425. *TempPtr='-';
  426. else
  427. *TempPtr=' ';
  428. }
  429. i='+';
  430. }
  431. if(i!='+')
  432. {
  433. if(NFlags)
  434. {
  435. i=(int)Width-ii-1;
  436. if(i>0)
  437. {
  438. /*检查标志字符序列中是否有'*'*/
  439. TempPtr=Flags;
  440. for(;*TempPtr!='*'&&*TempPtr!='\0';TempPtr++){}
  441. if(*TempPtr=='*')
  442. {
  443. /*在临时字符串中写'-'和'0'*/
  444. TempPtr=TempStr;
  445. for(;*TempPtr!='\0';TempPtr++){}
  446. for(ii++;ii>0;ii--,TempPtr--)
  447. *(TempPtr+i+1)=*TempPtr;
  448. TempPtr++;
  449. *TempPtr++='-';
  450. for(ii=i;ii>0;ii--)
  451. *TempPtr++='0';
  452. }
  453. else
  454. {
  455. /*在临时字符串中填' '*/
  456. /*在临时字符串中写'-'*/
  457. TempPtr=TempStr;
  458. for(;*TempPtr!='\0';TempPtr++){}
  459. for(ii++;ii>0;ii--,TempPtr--)
  460. *(TempPtr+1)=*TempPtr;
  461. TempPtr++;
  462. *TempPtr='-';
  463. /*判断对齐方式*/
  464. TempPtr=Flags;
  465. for(;*TempPtr!='-'&&*TempPtr!='\0';TempPtr++){}
  466. if(*TempPtr=='-')
  467. {
  468. /*如果是左对齐,在临时字符串右端写' '*/
  469. TempPtr=TempStr;
  470. for(;*TempPtr!='\0';TempPtr++){}
  471. for(ii=i;ii>0;ii--)
  472. *TempPtr++=' ';
  473. *TempPtr='\0';
  474. }
  475. else
  476. {
  477. /*在临时字符串左端写' '*/
  478. TempPtr=TempStr;
  479. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  480. for(ii++;ii>0;ii--,TempPtr--)
  481. *(TempPtr+i)=*TempPtr;
  482. TempPtr++;
  483. for(ii=i;ii>0;ii--)
  484. *TempPtr++=' ';
  485. }
  486. }
  487. }
  488. else
  489. {
  490. /*在临时字符串中写'-'*/
  491. TempPtr=TempStr;
  492. for(;*TempPtr!='\0';TempPtr++){}
  493. for(ii++;ii>0;ii--,TempPtr--)
  494. *(TempPtr+1)=*TempPtr;
  495. TempPtr++;
  496. *TempPtr='-';
  497. }
  498. }
  499. else
  500. {
  501. i=(int)Width-ii;
  502. if(i>0)
  503. {
  504. /*检查标志字符序列中是否有'*'*/
  505. TempPtr=Flags;
  506. for(;*TempPtr!='*'&&*TempPtr!='\0';TempPtr++){}
  507. if(*TempPtr=='*')
  508. {
  509. /*在临时字符串中写'0'*/
  510. TempPtr=TempStr;
  511. for(;*TempPtr!='\0';TempPtr++){}
  512. for(ii++;ii>0;ii--,TempPtr--)
  513. *(TempPtr+i)=*TempPtr;
  514. TempPtr++;
  515. for(ii=i;ii>0;ii--)
  516. *TempPtr++='0';
  517. }
  518. else
  519. {
  520. /*在临时字符串中填' '*/
  521. /*判断对齐方式*/
  522. TempPtr=Flags;
  523. for(;*TempPtr!='-'&&*TempPtr!='\0';TempPtr++){}
  524. if(*TempPtr=='-')
  525. {
  526. /*如果是左对齐,在临时字符串右端写' '*/
  527. TempPtr=TempStr;
  528. for(;*TempPtr!='\0';TempPtr++){}
  529. for(ii=i;ii>0;ii--)
  530. *TempPtr++=' ';
  531. *TempPtr='\0';
  532. }
  533. else
  534. {
  535. /*在临时字符串左端写' '*/
  536. TempPtr=TempStr;
  537. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  538. for(ii++;ii>0;ii--,TempPtr--)
  539. *(TempPtr+i)=*TempPtr;
  540. TempPtr++;
  541. for(ii=i;ii>0;ii--)
  542. *TempPtr++=' ';
  543. }
  544. }
  545. }
  546. }
  547. }
  548. /*增加判断超出范围的的处理方法*/
  549. if(Width==0) /*没有长度限制 */
  550. {
  551. TempPtr=TempStr;
  552. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  553. }
  554. else /*有长度限制*/
  555. {
  556. TempPtr=TempStr;
  557. TempPtr[Width]='\0'; /*截断后面的显示*/
  558. i=Width;
  559. }
  560. }
  561. /***************************************************************************
  562. ** 功能: 将与无符号整数相对应的具有缺省格式的字符串转变成给定格式的 **
  563. ** 字符串 **
  564. ** 入口: Flags是标志字符序列指针 **
  565. ** Width是输出字符串的最小宽度 **
  566. ** TempStr是具有缺省格式的字符串的指针 **
  567. ** CountBase数制计数基值 **
  568. ** 出口: 返回输出字符串的长度 **
  569. ** 输出字符串在TempStr指向的字符数组中 **
  570. ***************************************************************************/
  571. static void UnsignedFormatOut(char *Flags,unsigned char Width,char *TempStr,unsigned char CountBase)
  572. {
  573. char *TempPtr;
  574. int i;
  575. int ii;
  576. i=0;
  577. TempPtr=TempStr;
  578. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  579. /*检查标志字符序列中是否有'#'*/
  580. TempPtr=Flags;
  581. for(;*TempPtr!='#'&&*TempPtr!='\0';TempPtr++){}
  582. #if 0
  583. if(*TempPtr=='#')
  584. {
  585. i=(int)Width-ii-2;
  586. if(i>0)
  587. {
  588. /*检查标志字符序列中是否有'*'*/
  589. TempPtr=Flags;
  590. for(;*TempPtr!='*'&&*TempPtr!='\0';TempPtr++){}
  591. if(*TempPtr=='*')
  592. {
  593. /*在临时字符串中写'0'*/
  594. TempPtr=TempStr;
  595. for(;*TempPtr!='\0';TempPtr++){}
  596. for(ii++;ii>0;ii--,TempPtr--)
  597. *(TempPtr+i)=*TempPtr;
  598. TempPtr++;
  599. for(ii=i;ii>0;ii--)
  600. *TempPtr++='0';
  601. /*在临时字符串中写进位计数制头标志*/
  602. TempPtr=TempStr;
  603. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  604. if(CountBase==8)
  605. {
  606. /*在临时字符串中写'0o'*/
  607. for(ii++;ii>0;ii--,TempPtr--)
  608. *(TempPtr+2)=*TempPtr;
  609. TempPtr++;
  610. *TempPtr++='0';
  611. *TempPtr='o';
  612. }
  613. if(CountBase==16)
  614. {
  615. /*在临时字符串中写'0o'*/
  616. for(ii++;ii>0;ii--,TempPtr--)
  617. *(TempPtr+2)=*TempPtr;
  618. TempPtr++;
  619. *TempPtr++='0';
  620. *TempPtr='x';
  621. }
  622. }
  623. else
  624. {
  625. /*在临时字符串中写进位计数制头标志*/
  626. TempPtr=TempStr;
  627. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  628. if(CountBase==8)
  629. {
  630. /*在临时字符串中写'0o'*/
  631. for(ii++;ii>0;ii--,TempPtr--)
  632. *(TempPtr+2)=*TempPtr;
  633. TempPtr++;
  634. *TempPtr++='0';
  635. *TempPtr='o';
  636. }
  637. if(CountBase==16)
  638. {
  639. /*在临时字符串中写'0o'*/
  640. for(ii++;ii>0;ii--,TempPtr--)
  641. *(TempPtr+2)=*TempPtr;
  642. TempPtr++;
  643. *TempPtr++='0';
  644. *TempPtr='x';
  645. }
  646. /*检查标志字符序列中是否有'-'*/
  647. TempPtr=Flags;
  648. for(;*TempPtr!='-'&&*TempPtr!='\0';TempPtr++){}
  649. if(*TempPtr=='-')
  650. {
  651. /*如果是左对齐,在临时字符串右端写' '*/
  652. TempPtr=TempStr;
  653. for(;*TempPtr!='\0';TempPtr++){}
  654. for(ii=i;ii>0;ii--)
  655. *TempPtr++=' ';
  656. *TempPtr='\0';
  657. }
  658. else
  659. {
  660. /*在临时字符串中写'0'*/
  661. TempPtr=TempStr;
  662. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  663. for(ii++;ii>0;ii--,TempPtr--)
  664. *(TempPtr+i)=*TempPtr;
  665. TempPtr++;
  666. for(ii=i;ii>0;ii--)
  667. *TempPtr++=' ';
  668. }
  669. }
  670. }
  671. else
  672. {
  673. /*在临时字符串中写进位计数制头标志*/
  674. TempPtr=TempStr;
  675. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  676. if(CountBase==8)
  677. {
  678. /*在临时字符串中写'0o'*/
  679. for(ii++;ii>0;ii--,TempPtr--)
  680. *(TempPtr+2)=*TempPtr;
  681. TempPtr++;
  682. *TempPtr++='0';
  683. *TempPtr='o';
  684. }
  685. if(CountBase==16)
  686. {
  687. /*在临时字符串中写'0o'*/
  688. for(ii++;ii>0;ii--,TempPtr--)
  689. *(TempPtr+2)=*TempPtr;
  690. TempPtr++;
  691. *TempPtr++='0';
  692. *TempPtr='x';
  693. }
  694. }
  695. i='#';
  696. }
  697. #endif
  698. if(i!='#')
  699. {
  700. i=(int)Width-ii;
  701. if(i>0)
  702. {
  703. /*检查标志字符序列中是否有'*'*/
  704. TempPtr=Flags;
  705. for(;*TempPtr!='*'&&*TempPtr!='\0';TempPtr++){}
  706. if(*TempPtr=='*')
  707. {
  708. /*在临时字符串中写'0'*/
  709. TempPtr=TempStr;
  710. for(;*TempPtr!='\0';TempPtr++){}
  711. for(ii++;ii>0;ii--,TempPtr--)
  712. *(TempPtr+i)=*TempPtr;
  713. TempPtr++;
  714. for(ii=i;ii>0;ii--)
  715. *TempPtr++='0';
  716. }
  717. else
  718. {
  719. /*检查标志字符序列中是否有'-'*/
  720. TempPtr=Flags;
  721. for(;*TempPtr!='-'&&*TempPtr!='\0';TempPtr++){}
  722. if(*TempPtr=='-')
  723. {
  724. /*如果是左对齐,在临时字符串右端写' '*/
  725. TempPtr=TempStr;
  726. for(;*TempPtr!='\0';TempPtr++){}
  727. for(ii=i;ii>0;ii--)
  728. *TempPtr++=' ';
  729. *TempPtr='\0';
  730. }
  731. else
  732. {
  733. /*在临时字符串中写'0'*/
  734. TempPtr=TempStr;
  735. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  736. for(ii++;ii>0;ii--,TempPtr--)
  737. *(TempPtr+i)=*TempPtr;
  738. TempPtr++;
  739. for(ii=i;ii>0;ii--)
  740. *TempPtr++=' ';
  741. }
  742. }
  743. }
  744. }
  745. if(Width==0) /*没有长度限制 */
  746. {
  747. TempPtr=TempStr;
  748. for(ii=0;*TempPtr!='\0';TempPtr++,ii++){}
  749. }
  750. else /*有长度限制*/
  751. {
  752. TempPtr=TempStr;
  753. TempPtr[Width]='\0'; /*截断后面的显示*/
  754. i=Width;
  755. }
  756. }
  757. /***************************************************************************
  758. ** 功能: 将从参数表中取出的指针,并将它所指向的值转变成给定格式的字符串 **
  759. ** 入口: ap是参数表的参数指针,注意: 参数表中的参数均应为void * **
  760. ** FmtStr是输出字符串格式描述串的指针 **
  761. ** Str是输出字符串的指针 **
  762. ** 出口: 返回输出字符串的长度 **
  763. ** 输出字符串在Str指向的字符数组中 **
  764. ***************************************************************************/
  765. unsigned char ValuePtrToStr(char *Str,char *FmtStr,va_list ap)
  766. {
  767. char *TempPtr;
  768. char Temp[4];
  769. char TempStr[64];
  770. //xbtong char i;
  771. int i;
  772. /************************定义数据格式串的数据结构****************************/
  773. char Flags[5]; // 存放格式的标志
  774. u8 Width=0; // 存放格式的宽度
  775. u8 Precision=6; // 存放格式的精度
  776. char Type[3]; // 存放格式的类型
  777. /*****************************分解数据格式串*********************************/
  778. // 格式字符串:%[标志][输入数据宽度][.精度][长度]类型
  779. /*分解出%号*/
  780. FmtStr++; /*=%*/
  781. TempPtr=(char *)FmtStr;
  782. /*分解出标志字符序列*/
  783. for(; *TempPtr<'0'; TempPtr++){} /*+ - * # .*/
  784. for(i=0; FmtStr<TempPtr; Flags[i]=*FmtStr++,i++){}/*copy到Flags[]中*/
  785. Flags[i]='\0';
  786. /*分解出数据的显示宽度*/
  787. // 剔除0~9以外的内容
  788. for(; (*TempPtr<='9')&&(*TempPtr>='0'); TempPtr++){}/*0~9 change by wjj old:(*TempPtr<':'&&*TempPtr>'/')*/
  789. for(i=0; FmtStr<TempPtr; Temp[i]=*FmtStr++,i++){} /*copy到Temp[]中*/
  790. Temp[i]='\0';
  791. Width=(unsigned char)atoi(Temp);/*宽度*/
  792. /*分解出数据的显示精度*/
  793. if(*TempPtr=='.')
  794. {
  795. FmtStr++;
  796. TempPtr++;
  797. for(;*TempPtr<='9'&&*TempPtr>='0';TempPtr++){}/*0~9 change by wjj */
  798. for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
  799. Temp[i]='\0';
  800. Precision=(unsigned char)atoi(Temp);
  801. }
  802. /*分解出数据的类型*/
  803. for(;*TempPtr!='\0';TempPtr++){}
  804. for(i=0;FmtStr<TempPtr;Type[i]=*FmtStr++,i++){}
  805. /***************按类型将数值转换成给定格式的字符串****************************/
  806. switch(Type[0])
  807. {
  808. // va_arg获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型)
  809. // 从实际效果可推导,应该是取出格式化字符串后的另一个参数,即定值指针
  810. // itoa2:将格式与定值内容对接,拼凑出按格式打印数据的效果
  811. case 'd': itoa2((int)(*(int *)va_arg(ap,void *)),TempStr);//变量,
  812. SignedFormatOut(Flags,Width,TempStr);
  813. break;
  814. // 整数
  815. case 'i': itoa2((int)(*(int *)va_arg(ap,void *)),TempStr);
  816. SignedFormatOut(Flags,Width,TempStr);
  817. break;
  818. case 'u': itostr((unsigned int)(*(unsigned int *)va_arg(ap,void *)),TempStr,10);
  819. UnsignedFormatOut(Flags,Width,TempStr,10);
  820. break;
  821. case 'x': itostr((unsigned int)(*(unsigned int *)va_arg(ap,void *)),TempStr,16);
  822. UnsignedFormatOut(Flags,Width,TempStr,16);
  823. break;
  824. case 'X': itostr((unsigned int)(*(unsigned int *)va_arg(ap,void *)),TempStr,17);
  825. UnsignedFormatOut(Flags,Width,TempStr,16);
  826. TempPtr=TempStr;
  827. for(;*TempPtr!='\0';TempPtr++)
  828. *TempPtr=LowerToUpper(*TempPtr);
  829. break;
  830. case 'f':
  831. case 'F':
  832. ftoa((float)(*(float *)va_arg(ap,void *)),TempStr,'f',Precision);
  833. AddDotsFloat(TempStr,Precision);
  834. SignedFormatOut(Flags,Width,TempStr);
  835. break;
  836. case 's': TempPtr=(char *)va_arg(ap,void *);
  837. for(i=0;*TempPtr!='\0';TempStr[i]=*TempPtr++,i++){}
  838. TempStr[i]='\0';
  839. break;
  840. case 'h': switch(Type[1]) /*变量长度修饰符*/
  841. {
  842. /****************************************************
  843. **这里取参数之所以使用int型关键字是因为short关键字**
  844. **只从参数表中取出对应参数的一半字节数,而int型关 **
  845. **键字从参数表中取出对应参数的全部字节数 **
  846. ****************************************************/
  847. case 'd': itoa1((short int)(*(short int *)va_arg(ap,void *)),TempStr);
  848. SignedFormatOut(Flags,Width,TempStr);
  849. break;
  850. case 'i': itoa1((short int)(*(short int *)va_arg(ap,void *)),TempStr);
  851. SignedFormatOut(Flags,Width,TempStr);
  852. break;
  853. case 'u': stostr((unsigned short int)(*(unsigned short int *)va_arg(ap,void *)),TempStr,10);
  854. UnsignedFormatOut(Flags,Width,TempStr,10);
  855. break;
  856. case 'x': stostr((unsigned short int)(*(unsigned short int *)va_arg(ap,void *)),TempStr,16);
  857. UnsignedFormatOut(Flags,Width,TempStr,16);
  858. break;
  859. case 'X': stostr((unsigned short int)(*(unsigned short int *)va_arg(ap,void *)),TempStr,16);
  860. UnsignedFormatOut(Flags,Width,TempStr,17);
  861. TempPtr=TempStr;
  862. for(;*TempPtr!='\0';TempPtr++)
  863. *TempPtr=LowerToUpper(*TempPtr);
  864. break;
  865. }
  866. break;
  867. default : return(0);
  868. }
  869. /*将处理后的数值字符串输出并返回其长度*/
  870. TempPtr=TempStr;
  871. for(i=0;*TempPtr!='\0';Str++,i++)
  872. *Str=*TempPtr++;
  873. *Str='\0';
  874. return(i);
  875. }
  876. /***************************************************************************
  877. ** 功能: 将从参数表中取出的值转变成给定格式的字符串 **
  878. ** 入口: Str是定值的字符串 **
  879. ** FmtStr是输出字符串格式描述串的指针 **
  880. ** 出口: 按格式将字符串转化为数字输出至Varible **
  881. ***************************************************************************/
  882. void StrToValue(char *Str,char *FmtStr,void *Varible)
  883. {
  884. char *TempPtr;
  885. char Temp[4];
  886. unsigned char i;
  887. /************************定义数据格式串的数据结构****************************/
  888. char Flags[5];
  889. unsigned char Width=0;
  890. unsigned char Precision=6;
  891. char Type[3];
  892. /*****************************分解数据格式串*********************************/
  893. TempPtr=(char *)++FmtStr;
  894. /*分解出标志字符序列*/
  895. for(;*TempPtr<'0';TempPtr++){}
  896. for(i=0;FmtStr<TempPtr;Flags[i]=*FmtStr++,i++){}
  897. Flags[i]='\0';
  898. /*分解出数据的显示宽度*/
  899. for(;*TempPtr<':'&&*TempPtr>'/';TempPtr++){}
  900. for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
  901. Temp[i]='\0';
  902. Width=(unsigned char)atoi(Temp);
  903. /*分解出数据的显示精度*/
  904. if(*TempPtr=='.')
  905. {
  906. FmtStr++;
  907. TempPtr++;
  908. for(;*TempPtr<':'&&*TempPtr>'/';TempPtr++){}
  909. for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
  910. Temp[i]='\0';
  911. Precision=(unsigned char)atoi(Temp);
  912. }
  913. /*分解出数据的类型*/
  914. for(;*TempPtr!='\0';TempPtr++){}
  915. for(i=0;FmtStr<TempPtr&&i<2;Type[i]=*FmtStr++,i++){}
  916. /***************按类型将给定格式的字符串转换成数值****************************/
  917. switch(Type[0])
  918. {
  919. case 'd': *(int *)Varible=(int)atoi(Str);
  920. break;
  921. case 'i': *(int *)Varible=(int)atoi(Str);
  922. break;
  923. case 'o': *(unsigned int *)Varible=(unsigned int)strtoul(Str,0,8);
  924. break;
  925. case 'u': *(unsigned int *)Varible=(unsigned int)strtoul(Str,0,10);
  926. break;
  927. case 'x': *(unsigned int *)Varible=(unsigned int)strtoul(Str,0,16);
  928. break;
  929. case 'X': *(unsigned int *)Varible=(unsigned int)strtoul(Str,0,16);
  930. break;
  931. case 'f':
  932. case 'F':
  933. *((float *)Varible)=(float)atof1(Str);
  934. break;
  935. case 'c': *(char *)Varible=*Str;
  936. break;
  937. case 'h':
  938. switch(Type[1])
  939. {
  940. case 'd': *(short int *)Varible=(short int)atoi(Str);
  941. break;
  942. case 'i': *(short int *)Varible=(short int)atoi(Str);
  943. break;
  944. case 'o': *(unsigned short int *)Varible=(unsigned short int)strtoul(Str,0,8);
  945. break;
  946. case 'u': *(unsigned short int *)Varible=(unsigned short int)strtoul(Str,0,10);
  947. break;
  948. case 'x': *(unsigned short int *)Varible=(unsigned short int)strtoul(Str,0,16);
  949. break;
  950. case 'X': *(unsigned short int *)Varible=(unsigned short int)strtoul(Str,0,16);
  951. break;
  952. }
  953. break;
  954. }
  955. }
  956. /***************************************************************************
  957. ** 功能: 从给定的格式描述串中取出数据格式描述串 **
  958. ** 入口: FmtStr是给定格式描述串的指针 **
  959. ** Str是数据格式描述串的指针 **
  960. ** 出口: 返回数据格式描述串的长度 **
  961. ** 获取的数据格式描述串在Str指向的字符数组中 **
  962. ***************************************************************************/
  963. unsigned char ScanFmtStr(char *Type,const char *ScanPtr,char *FmtStr)
  964. {
  965. unsigned char i;
  966. *FmtStr=*ScanPtr++; /*%号*/
  967. FmtStr++;
  968. *Type='d';/*默认是无符号数*/
  969. for(i=1;i<34;i++) /*值得体味*/
  970. {
  971. switch(*ScanPtr)
  972. {
  973. case '-': /*对齐标志*/
  974. case '+':
  975. case '*':
  976. case '#':
  977. case '.':
  978. case '0':
  979. case '1':
  980. case '2':
  981. case '3':
  982. case '4':
  983. case '5':
  984. case '6':
  985. case '7':
  986. case '8':
  987. case '9':
  988. case 'h':
  989. case 'I':
  990. *FmtStr=*ScanPtr++;
  991. FmtStr++;
  992. break;
  993. case 'L':
  994. *FmtStr=*ScanPtr++;
  995. FmtStr++;
  996. break;
  997. case 'd':
  998. case 'i':
  999. case 'o':
  1000. case 'u':
  1001. case 'x':
  1002. case 'X':
  1003. case 'f':
  1004. case 'F':
  1005. case 'c':
  1006. case 's':
  1007. case 'B':
  1008. case 'b':
  1009. *Type=*ScanPtr;/*数据类型标志*/
  1010. *FmtStr=*ScanPtr++;
  1011. FmtStr++;
  1012. *FmtStr='\0';
  1013. return(++i);
  1014. default : return(0);
  1015. }
  1016. }
  1017. return 0;
  1018. }
  1019. /**************************************************************************
  1020. 函数名称:fmt_Printf
  1021. 函数版本:1.00
  1022. 作者:
  1023. 创建日期:2008.9.1
  1024. 函数功能说明:按格式将字符串分析,并存入发送缓冲区
  1025. 输入参数:
  1026. 输出参数:
  1027. 返回值:
  1028. 更新信息:
  1029. 更新日志1:
  1030. 日期:
  1031. 修改者:
  1032. 修改内容:
  1033. 修改原因:
  1034. ***************************************************************************/
  1035. void fmt_Printf(short sx,short sy,char Flags,const char *FmtStr,...)
  1036. {
  1037. char Code1;
  1038. char arrOutStr[44];
  1039. char TempFmtStr[40];
  1040. short x=sx,y=sy;
  1041. char *pstr;
  1042. int i;
  1043. char postart=0;
  1044. char position=0,datalenth=0;
  1045. va_list ap;
  1046. va_start(ap,FmtStr);
  1047. pstr=arrOutStr;
  1048. for(;*FmtStr!='\0';)
  1049. {
  1050. if(*FmtStr=='%')
  1051. {
  1052. position=postart;
  1053. /*取数值格式描述串*/
  1054. i=ScanFmtStr(&Code1,FmtStr,TempFmtStr);
  1055. if(i)
  1056. {
  1057. /*从格式描述串中略过数值格式描述串*/
  1058. FmtStr+=i;
  1059. datalenth=ValuePtrToStr(pstr,TempFmtStr,ap);
  1060. for(;*pstr!='\0';pstr++){}
  1061. }
  1062. else
  1063. {
  1064. /*将% 当成一个字符处理*/
  1065. *pstr=*FmtStr++;
  1066. pstr++;
  1067. *pstr='\0';
  1068. }
  1069. }
  1070. else
  1071. {
  1072. /*将字符输出到输出字符串中*/
  1073. *pstr=*FmtStr++;
  1074. pstr++;
  1075. *pstr='\0';
  1076. }
  1077. postart++;
  1078. }
  1079. va_end(ap);
  1080. /*发给驱动板的数据*/
  1081. {
  1082. BYTE mode,len;
  1083. BYTE *pd=(BYTE *)arrOutStr;
  1084. if(Flags==MMI_FOCUS_NORMAL)mode=1;
  1085. else mode=0;
  1086. len=0;
  1087. while(*pd++!='\0')len++;
  1088. if(Flags==MMI_FOCUS_DATA) /*只反显数据*/
  1089. {
  1090. Add_Continue_Data(x,y,(BYTE *)arrOutStr,position, mode);
  1091. Add_Continue_Data((x+position),y,(BYTE *)(arrOutStr+position),datalenth, 1);
  1092. }
  1093. else
  1094. {
  1095. Add_Continue_Data(x,y,(BYTE *)arrOutStr,len, mode);
  1096. }
  1097. }
  1098. }
  1099. /**************************************************************************
  1100. 函数名称:fmt_GetStrLenth
  1101. 函数版本:1.00
  1102. 作者:
  1103. 创建日期:2008.9.1
  1104. 函数功能说明:分析字符串格式,并取得字符串的长度
  1105. 输入参数:
  1106. 输出参数:
  1107. 返回值:
  1108. 更新信息:
  1109. 更新日志1:
  1110. 日期:
  1111. 修改者:
  1112. 修改内容:
  1113. 修改原因:
  1114. ***************************************************************************/
  1115. short fmt_GetStrLenth(char * pd,char *FmtStr)
  1116. {
  1117. char *TempPtr;
  1118. char Temp[4];
  1119. //xbtong char i;
  1120. int i;
  1121. char Flags[5];
  1122. char Type[3];
  1123. unsigned char width=0;
  1124. short lenth=0;
  1125. while(*FmtStr!='\0')
  1126. {
  1127. if(*FmtStr=='%')
  1128. {
  1129. FmtStr++;
  1130. TempPtr=(char *)FmtStr;
  1131. /*分解出标志字符序列*/
  1132. for(;*TempPtr<'0';TempPtr++){}
  1133. for(i=0;FmtStr<TempPtr;Flags[i]=*FmtStr++,i++){}
  1134. Flags[i]='\0';
  1135. /*分解出数据的显示宽度*/
  1136. for(;*TempPtr<':'&&*TempPtr>'/';TempPtr++){}
  1137. for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
  1138. Temp[i]='\0';
  1139. width=(unsigned char)atoi(Temp);
  1140. /*分解出数据的显示精度*/
  1141. if(*TempPtr=='.')
  1142. {
  1143. FmtStr++;
  1144. TempPtr++;
  1145. for(;*TempPtr<':'&&*TempPtr>'/';TempPtr++,FmtStr++){}
  1146. }
  1147. /*分解出数据的类型 */
  1148. Type[0]=*FmtStr;
  1149. if(Type[0]=='h')FmtStr++; /*读到最后的描述字符为止 */
  1150. if(Type[0]=='s')/*字符串显示 取字符串的长度*/
  1151. {
  1152. TempPtr=(char *)pd;
  1153. lenth+=strlen(TempPtr);
  1154. }
  1155. else
  1156. {
  1157. lenth+=width;
  1158. }
  1159. }
  1160. else /*刷新整个字符串*/
  1161. {
  1162. lenth++;
  1163. }
  1164. FmtStr++;
  1165. }
  1166. return lenth;
  1167. }
  1168. /**************************************************************************
  1169. 函数名称:fmt_StrPrintf
  1170. 函数版本:1.00
  1171. 作者:
  1172. 创建日期:2008.9.1
  1173. 函数功能说明:将字符串存入发送缓冲区
  1174. 输入参数:
  1175. 输出参数:
  1176. 返回值:
  1177. 更新信息:
  1178. 更新日志1:
  1179. 日期:
  1180. 修改者:
  1181. 修改内容:
  1182. 修改原因:
  1183. ***************************************************************************/
  1184. void fmt_StrPrintf(short sx,short sy,short bytes,char model,const char *str)
  1185. {
  1186. BYTE mode,len;
  1187. BYTE *pd=(BYTE *)str;
  1188. if(model==MMI_FOCUS_NORMAL)mode=1;
  1189. else mode=0;
  1190. len=0;
  1191. while(*pd++!='\0')len++;
  1192. Add_Continue_Data(sx,sy,(BYTE *)str, len, mode);
  1193. }
  1194. /**************************************************************************
  1195. 函数名称:fmt_InitModify
  1196. 函数版本:1.00
  1197. 作者:
  1198. 创建日期:2008.9.1
  1199. 函数功能说明:进入修改模式,初始化函数
  1200. 输入参数:
  1201. 输出参数:
  1202. 返回值:
  1203. 更新信息:
  1204. 更新日志1:
  1205. 日期:
  1206. 修改者:
  1207. 修改内容:
  1208. 修改原因:
  1209. ***************************************************************************/
  1210. void fmt_InitModify(BYTE index,short x,short y,void *p,char flag,const char *FmtStr,...)
  1211. {
  1212. int i;
  1213. char postart=0;
  1214. bool bhave_no=true; /* %号只分析一次 */
  1215. va_list ap; //定义字符指针
  1216. MODIFY_DEF *pt=&g_tModify;
  1217. pt->Fmtstr[0]='\0';
  1218. pt->Valstr[0]='\0';
  1219. pt->Type='u';
  1220. pt->Current=0;
  1221. pt->Lenth=0;
  1222. pt->x=x;
  1223. pt->y=y;
  1224. pt->pValue=(void*)p;
  1225. if(flag)pt->bModify=false; /*要不要编辑,标志位*/
  1226. else pt->bModify=true;
  1227. // 获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,FmtStr是可变参数最左边的参数)
  1228. va_start(ap,FmtStr);
  1229. for(;*FmtStr!='\0';)
  1230. {
  1231. if(*FmtStr=='%'&&bhave_no)
  1232. {
  1233. pt->x=x+postart;
  1234. // 复制数值格式描述串,并获取描述所占长度
  1235. i=ScanFmtStr(&pt->Type,FmtStr,pt->Fmtstr);
  1236. if(index<0xff&&pt->Type=='f')
  1237. {
  1238. pt->bFmtstr=true;
  1239. pt->pFmtstr=(void*)FmtStr;
  1240. pt->index=index;
  1241. }
  1242. else
  1243. {
  1244. pt->bFmtstr=false;
  1245. pt->pFmtstr=NULL;
  1246. }
  1247. if(i)
  1248. {
  1249. // 从格式描述串中略过数值格式描述串,以便从list中取得定值指针
  1250. FmtStr+=i;
  1251. // 将格式描述与数据对接,获得按格式打印数据的效果,并将数据转为字符串存入Valstr,返回长度给Lenth
  1252. pt->Lenth=ValuePtrToStr(pt->Valstr,pt->Fmtstr,ap);
  1253. }
  1254. bhave_no=false;
  1255. }
  1256. else
  1257. {
  1258. FmtStr++;
  1259. }
  1260. postart++;
  1261. }
  1262. // 清空va_list可变参数列表
  1263. va_end(ap);
  1264. // 要编辑符号的话,先跳过符号位,即正负位
  1265. if(pt->Type=='f'||pt->Type=='d'||pt->Type=='i')
  1266. {
  1267. pt->Current=1;
  1268. }
  1269. // 数据不要编辑,反显所有数据
  1270. if(!g_tModify.bModify)
  1271. {
  1272. pt->Current=0;
  1273. fmt_StrPrintf(g_tModify.x,g_tModify.y,g_tModify.Lenth, MMI_FOCUS_NORMAL,g_tModify.Valstr);
  1274. }
  1275. }
  1276. /**************************************************************************
  1277. 函数名称:fmt_ClearCursor
  1278. 函数版本:1.00
  1279. 作者:
  1280. 创建日期:2008.9.1
  1281. 函数功能说明:
  1282. 输入参数:
  1283. 输出参数:
  1284. 返回值:
  1285. 更新信息:
  1286. 更新日志1:
  1287. 日期:
  1288. 修改者:
  1289. 修改内容:
  1290. 修改原因:
  1291. ***************************************************************************/
  1292. #if 0
  1293. static void fmt_ClearCursor(void)
  1294. {
  1295. #if 0
  1296. short pointer;
  1297. int i;
  1298. char byte;
  1299. pointer=g_tModify.y*BYTES_PER_LINE+g_tModify.x+g_tModify.Current;
  1300. for(i=0;i<16;i++)
  1301. {
  1302. lcd_WriteRAM(pointer+BYTES_PER_LINE*i,lcd_ReadRAM(pointer+BYTES_PER_LINE*i)&0xFE);
  1303. }
  1304. #endif
  1305. }
  1306. #endif
  1307. /**************************************************************************
  1308. 函数名称:fmt_CursorOff
  1309. 函数版本:1.00
  1310. 作者:
  1311. 创建日期:2008.9.1
  1312. 函数功能说明:关闭光标显示
  1313. 输入参数:
  1314. 输出参数:
  1315. 返回值:
  1316. 更新信息:
  1317. 更新日志1:
  1318. 日期:
  1319. 修改者:
  1320. 修改内容:
  1321. 修改原因:
  1322. ***************************************************************************/
  1323. void fmt_CursorOff(void)
  1324. {
  1325. BYTE model=MMI_FOCUS_NORMAL;
  1326. if(g_tModify.bModify)model=MMI_FOCUS_NO;
  1327. fmt_StrPrintf(g_tModify.x,g_tModify.y,g_tModify.Lenth, model,g_tModify.Valstr);
  1328. }
  1329. /**************************************************************************
  1330. 函数名称:fmt_CursorOn
  1331. 函数版本:1.00
  1332. 作者:
  1333. 创建日期:2008.9.1
  1334. 函数功能说明:打开光标显示
  1335. 输入参数:
  1336. 输出参数:
  1337. 返回值:
  1338. 更新信息:
  1339. 更新日志1:
  1340. 日期:
  1341. 修改者:
  1342. 修改内容:
  1343. 修改原因:
  1344. ***************************************************************************/
  1345. void fmt_CursorOn(void)
  1346. {
  1347. char str[3];
  1348. if(!g_tModify.bModify)return;
  1349. str[0]=g_tModify.Valstr[(int)g_tModify.Current];
  1350. if(str[0]&0x80) /*汉字显示反显2个字节*/
  1351. {
  1352. str[1]=g_tModify.Valstr[g_tModify.Current+1];
  1353. str[2]='\0';
  1354. fmt_StrPrintf(g_tModify.x+g_tModify.Current,g_tModify.y,2, MMI_FOCUS_NORMAL,str);
  1355. }
  1356. else
  1357. {
  1358. str[1]='\0';
  1359. fmt_StrPrintf(g_tModify.x+g_tModify.Current,g_tModify.y,1, MMI_FOCUS_NORMAL,str);
  1360. }
  1361. }
  1362. /**************************************************************************
  1363. 函数名称:fmt_CursorFlush
  1364. 函数版本:1.00
  1365. 作者:
  1366. 创建日期:2008.9.1
  1367. 函数功能说明:光标闪烁
  1368. 输入参数:
  1369. 输出参数:
  1370. 返回值:
  1371. 更新信息:
  1372. 更新日志1:
  1373. 日期:
  1374. 修改者:
  1375. 修改内容:
  1376. 修改原因:
  1377. ***************************************************************************/
  1378. void fmt_CursorFlush(void)
  1379. {
  1380. #if 0
  1381. static bool bFlag=false;
  1382. static char TimeCnt=0;
  1383. short pointer;
  1384. unsigned char byte;
  1385. int i;
  1386. if(!g_tModify.bModify)return;
  1387. if(TimeCnt++<1) /*闪烁频率*/
  1388. {
  1389. return;
  1390. }
  1391. TimeCnt=0;
  1392. bFlag=!bFlag;
  1393. if(g_tModify.Valstr[g_tModify.Current]&0x80)/*汉字修改显示*/
  1394. {
  1395. pointer=g_tModify.y*BYTES_PER_LINE+g_tModify.x+g_tModify.Current+1;
  1396. }
  1397. else
  1398. {
  1399. pointer=g_tModify.y*BYTES_PER_LINE+g_tModify.x+g_tModify.Current;
  1400. }
  1401. for(i=0;i<16;i++)
  1402. {
  1403. byte=(lcd_ReadRAM(pointer+BYTES_PER_LINE*i)&0xFE)+bFlag;
  1404. lcd_WriteRAM(pointer+BYTES_PER_LINE*i,byte);
  1405. }
  1406. #endif
  1407. }
  1408. /**************************************************************************
  1409. 函数名称:fmt_CursorLeft
  1410. 函数版本:1.00
  1411. 作者:
  1412. 创建日期:2008.9.1
  1413. 函数功能说明:修改模式下,左键功能,编辑数据左移一位
  1414. 输入参数:
  1415. 输出参数:
  1416. 返回值:
  1417. 更新信息:
  1418. 更新日志1:
  1419. 日期:
  1420. 修改者:
  1421. 修改内容:
  1422. 修改原因:
  1423. ***************************************************************************/
  1424. bool fmt_CursorLeft(void)
  1425. {
  1426. if(!g_tModify.bModify)return true;
  1427. if(g_tModify.Lenth<=0)return true;
  1428. fmt_CursorOff();
  1429. if(g_tModify.Current<=0)
  1430. {
  1431. g_tModify.Current=g_tModify.Lenth-1;
  1432. if(g_tModify.Valstr[(int)g_tModify.Current]=='.'&&g_tModify.Type=='F')
  1433. {
  1434. g_tModify.Current-=1;
  1435. }
  1436. if(g_tModify.Valstr[(int)g_tModify.Current]&0x80)g_tModify.Current-=1;
  1437. fmt_CursorOn();
  1438. return true;
  1439. }
  1440. else
  1441. {
  1442. g_tModify.Current--;
  1443. if(g_tModify.Valstr[(int)g_tModify.Current]=='.'&&g_tModify.Type=='F')
  1444. {
  1445. g_tModify.Current-=1;
  1446. }
  1447. if(g_tModify.Valstr[(int)g_tModify.Current]&0x80)/*当前还是汉字*/
  1448. g_tModify.Current--;
  1449. }
  1450. fmt_CursorOn();
  1451. return false;
  1452. }
  1453. /**************************************************************************
  1454. 函数名称:fmt_CursorRight
  1455. 函数版本:1.00
  1456. 作者:
  1457. 创建日期:2008.9.1
  1458. 函数功能说明:修改模式下,右键功能,编辑数据右移一位
  1459. 输入参数:
  1460. 输出参数:
  1461. 返回值:
  1462. 更新信息:
  1463. 更新日志1:
  1464. 日期:
  1465. 修改者:
  1466. 修改内容:
  1467. 修改原因:
  1468. ***************************************************************************/
  1469. bool fmt_CursorRight(void) /*到最右边,返回true;*/
  1470. {
  1471. if(!g_tModify.bModify)return true;
  1472. if(g_tModify.Lenth<=0)return true;
  1473. fmt_CursorOff();
  1474. if(g_tModify.Valstr[(int)g_tModify.Current]&0x80)
  1475. {
  1476. if(g_tModify.Current>=g_tModify.Lenth-2)
  1477. {
  1478. g_tModify.Current=0; /*到最右边*/
  1479. fmt_CursorOn();
  1480. return true;
  1481. }
  1482. else
  1483. {
  1484. g_tModify.Current+=2;
  1485. }
  1486. }
  1487. else
  1488. {
  1489. if(g_tModify.Current>=g_tModify.Lenth-1)
  1490. {
  1491. g_tModify.Current=0; /*到最右边*/
  1492. fmt_CursorOn();
  1493. return true;
  1494. }
  1495. else
  1496. {
  1497. g_tModify.Current+=1;
  1498. if(g_tModify.Valstr[(int)g_tModify.Current]=='.'&&g_tModify.Type=='F')
  1499. {
  1500. g_tModify.Current+=1;
  1501. }
  1502. }
  1503. }
  1504. fmt_CursorOn();
  1505. return false;
  1506. }
  1507. /**************************************************************************
  1508. 函数名称:fmt_IsHavePoint
  1509. 函数版本:1.00
  1510. 作者:
  1511. 创建日期:2008.9.1
  1512. 函数功能说明:判断是否有小数点
  1513. 输入参数:
  1514. 输出参数:
  1515. 返回值:
  1516. 更新信息:
  1517. 更新日志1:
  1518. 日期:
  1519. 修改者:
  1520. 修改内容:
  1521. 修改原因:
  1522. ***************************************************************************/
  1523. static bool fmt_IsHavePoint(void)
  1524. {
  1525. unsigned char cnt;
  1526. for(cnt=0;cnt<g_tModify.Lenth;cnt++)
  1527. {
  1528. if(g_tModify.Valstr[cnt]=='.')
  1529. return true;
  1530. }
  1531. return false;
  1532. }
  1533. /**************************************************************************
  1534. 函数名称:fmt_MovePoint
  1535. 函数版本:1.00
  1536. 作者:
  1537. 创建日期:2008.9.1
  1538. 函数功能说明:移动小数点位
  1539. 输入参数:bFlag 移动标志位,true 右移 false 左移
  1540. 输出参数:
  1541. 返回值:
  1542. 更新信息:
  1543. 更新日志1:
  1544. 日期:
  1545. 修改者:
  1546. 修改内容:
  1547. 修改原因:
  1548. ***************************************************************************/
  1549. static void fmt_MovePoint(bool bFlag)
  1550. {
  1551. unsigned char point,cnt;
  1552. char TempStr[40];
  1553. char *p=TempStr;
  1554. for(cnt=0;cnt<g_tModify.Lenth;cnt++)
  1555. {
  1556. if(g_tModify.Valstr[cnt]=='.')continue;
  1557. *p++=g_tModify.Valstr[cnt];
  1558. }
  1559. point=g_tModify.Current;
  1560. if(bFlag) /*小数点右移*/
  1561. {
  1562. if(point>=g_tModify.Lenth-1)point=1; /*到最右边*/
  1563. else point++;
  1564. }
  1565. else
  1566. {
  1567. if(point<=1)point=g_tModify.Lenth-1; /*到最左边*/
  1568. else point--;
  1569. }
  1570. p=TempStr;
  1571. for(cnt=0;cnt<g_tModify.Lenth;cnt++)
  1572. {
  1573. if(cnt==point)g_tModify.Valstr[cnt]='.';
  1574. else g_tModify.Valstr[cnt]=*p++;
  1575. }
  1576. g_tModify.Current=point;
  1577. fmt_CursorOff();
  1578. }
  1579. /**************************************************************************
  1580. 函数名称:fmt_CursorAdd
  1581. 函数版本:1.00
  1582. 作者:
  1583. 创建日期:2008.9.1
  1584. 函数功能说明:编辑模式下,加键功能
  1585. 输入参数:
  1586. 输出参数:
  1587. 返回值:
  1588. 更新信息:
  1589. 更新日志1:
  1590. 日期:
  1591. 修改者:
  1592. 修改内容:
  1593. 修改原因:
  1594. ***************************************************************************/
  1595. void fmt_CursorAdd(void)
  1596. {
  1597. char dat;
  1598. if(!g_tModify.bModify)return;
  1599. fmt_CursorOff();
  1600. dat=g_tModify.Valstr[(int)g_tModify.Current]; /*取当前修改字符*/
  1601. if(g_tModify.Type!='s') /*不是汉字修改*/
  1602. {
  1603. switch(g_tModify.Type)
  1604. {
  1605. case 'o':
  1606. if(dat=='7')dat='0';else dat++;
  1607. if(dat>'7')dat='0';
  1608. break;
  1609. case 'u': /*无符号数*/
  1610. if(dat=='9')dat='0';else dat++;
  1611. if(dat>'9')dat='0';
  1612. break;
  1613. case 'x': /*16进制小写*/
  1614. switch(dat)
  1615. {
  1616. case '9': dat='a'; break;
  1617. case 'f': dat='0'; break;
  1618. default: dat++; break;
  1619. }
  1620. break;
  1621. case 'X': /*16进制大写*/
  1622. switch(dat)
  1623. {
  1624. case '9': dat='A'; break;
  1625. case 'F': dat='0'; break;
  1626. default: dat++; break;
  1627. }
  1628. break;
  1629. case 'c':
  1630. if(dat=='9')dat='0';else dat++;
  1631. if(dat>'9')dat='0';
  1632. break;
  1633. case 'B':
  1634. case 'b':
  1635. if(dat=='1')dat='0';else dat='1';
  1636. break;
  1637. case 'd': /*有符号数*/
  1638. case 'i':
  1639. if(g_tModify.Current==0)
  1640. {
  1641. dat=' ';
  1642. }
  1643. else
  1644. {
  1645. switch(dat)
  1646. {
  1647. case '9': dat='0';break;
  1648. default: dat++; break;
  1649. }
  1650. if(dat<'0'||dat>'9')dat='0';
  1651. }
  1652. break;
  1653. case 'f': /*浮点数*/
  1654. case 'F': /*浮点数*/
  1655. if(g_tModify.Current==0)
  1656. {
  1657. dat=' ';
  1658. }
  1659. else
  1660. {
  1661. switch(dat)
  1662. {
  1663. case '9':
  1664. if((g_tModify.Current==g_tModify.Lenth-1)&&(!fmt_IsHavePoint()))
  1665. {
  1666. dat='.'; /*防止没有小数点的情况出现*/
  1667. }
  1668. else
  1669. {
  1670. dat='0';
  1671. }
  1672. break;
  1673. case '.': fmt_MovePoint(1);break;
  1674. default:
  1675. if(dat>='0'&&dat<='9')dat++;
  1676. else dat='0';
  1677. break;
  1678. }
  1679. }
  1680. break;
  1681. default:
  1682. dat='0';
  1683. break;
  1684. }
  1685. if(dat!='.')g_tModify.Valstr[(int)g_tModify.Current]=dat; /*取当前修改字符*/
  1686. }
  1687. fmt_CursorOn();
  1688. }
  1689. /**************************************************************************
  1690. 函数名称:fmt_CursorSubb
  1691. 函数版本:1.00
  1692. 作者:
  1693. 创建日期:2008.9.1
  1694. 函数功能说明:编辑模式下,减键功能
  1695. 输入参数:
  1696. 输出参数:
  1697. 返回值:
  1698. 更新信息:
  1699. 更新日志1:
  1700. 日期:
  1701. 修改者:
  1702. 修改内容:
  1703. 修改原因:
  1704. ***************************************************************************/
  1705. void fmt_CursorSubb(void)
  1706. {
  1707. char dat;
  1708. if(!g_tModify.bModify)return;
  1709. fmt_CursorOff();
  1710. dat=g_tModify.Valstr[(int)g_tModify.Current]; /*取当前修改字符*/
  1711. if(g_tModify.Type!='s') /*不是汉字修改*/
  1712. {
  1713. switch(g_tModify.Type)
  1714. {
  1715. case 'o':
  1716. if(dat=='0')dat='7';else dat--;
  1717. if(dat>'7')dat='0';
  1718. break;
  1719. case 'u': /*无符号数*/
  1720. if(dat=='0')dat='9';else dat--;
  1721. if(dat>'9')dat='0';
  1722. break;
  1723. case 'x': /*16进制小写*/
  1724. switch(dat)
  1725. {
  1726. case 'a': dat='9'; break;
  1727. case '0': dat='f'; break;
  1728. default: dat--; break;
  1729. }
  1730. break;
  1731. case 'X': /*16进制大写*/
  1732. switch(dat)
  1733. {
  1734. case 'A': dat='9'; break;
  1735. case '0': dat='F'; break;
  1736. default: dat--; break;
  1737. }
  1738. break;
  1739. case 'c':
  1740. if(dat=='0')dat='9';else dat++;
  1741. if(dat>'9')dat='0';
  1742. break;
  1743. case 'B':
  1744. case 'b':
  1745. if(dat=='1')dat='0';else dat='1';
  1746. break;
  1747. case 'd': /*有符号数*/
  1748. case 'i':
  1749. if(g_tModify.Current==0)
  1750. {
  1751. dat='-';
  1752. }
  1753. else
  1754. {
  1755. switch(dat)
  1756. {
  1757. case '0': dat='9';break;
  1758. default: dat--; break;
  1759. }
  1760. if(dat<'0'||dat>'9')dat='0';
  1761. }
  1762. break;
  1763. case 'f': /*浮点数*/
  1764. case 'F': /*浮点数*/
  1765. if(g_tModify.Current==0)
  1766. {
  1767. dat='-';
  1768. }
  1769. else
  1770. {
  1771. switch(dat)
  1772. {
  1773. case '0':
  1774. if((g_tModify.Current==g_tModify.Lenth-1)&&(!fmt_IsHavePoint()))
  1775. {
  1776. dat='.'; /*防止没有小数点的情况出现*/
  1777. }
  1778. else
  1779. {
  1780. dat='9';
  1781. }
  1782. break;
  1783. case '.': fmt_MovePoint(0);break;
  1784. default:
  1785. if(dat>='0'&&dat<='9')dat--;
  1786. else dat='0';
  1787. break;
  1788. }
  1789. }
  1790. break;
  1791. default:
  1792. dat='0';
  1793. break;
  1794. }
  1795. if(dat!='.')g_tModify.Valstr[(int)g_tModify.Current]=dat; /*取当前修改字符*/
  1796. }
  1797. fmt_CursorOn();
  1798. }
  1799. /**************************************************************************
  1800. 函数名称:fmt_GetModifyValue_Single
  1801. 函数版本:1.00
  1802. 作者:
  1803. 创建日期:2008.9.1
  1804. 函数功能说明:取得编辑的数据的值
  1805. 输入参数:
  1806. 输出参数:
  1807. 返回值:
  1808. 更新信息:
  1809. 更新日志1:
  1810. 日期:
  1811. 修改者:
  1812. 修改内容:
  1813. 修改原因:
  1814. ***************************************************************************/
  1815. void fmt_GetModifyValue_Single(void)
  1816. {
  1817. StrToValue(g_tModify.Valstr,g_tModify.Fmtstr,g_tModify.pValue);
  1818. }
  1819. /**************************************************************************
  1820. 函数名称:fmt_GetModifyType
  1821. 函数版本:1.00
  1822. 作者:
  1823. 创建日期:2008.9.1
  1824. 函数功能说明:获取当前的编辑状态
  1825. 输入参数:
  1826. 输出参数:
  1827. 返回值:
  1828. 更新信息:
  1829. 更新日志1:
  1830. 日期:
  1831. 修改者:
  1832. 修改内容:
  1833. 修改原因:
  1834. ***************************************************************************/
  1835. bool fmt_GetModifyType(void)
  1836. {
  1837. return (g_tModify.bModify);
  1838. }
  1839. /******************************************************************
  1840. file end
  1841. ******************************************************************/