SCRCHK.C
上传用户:wesley
上传日期:2007-01-07
资源大小:266k
文件大小:8k
源码类别:

通讯/手机编程

开发平台:

C/C++

  1. #include<stdio.h>
  2. #define PROGSIZ 256
  3. struct
  4. {
  5. char type;
  6. unsigned char label;
  7. }
  8. miniprog[PROGSIZ];
  9. main(argc, argv)
  10. int argc;
  11. char **argv;
  12. {
  13. FILE *scriptfd;
  14. char fpname[256], str[81];
  15. int proglen, i, value[8], flag;
  16. short int labels[256];
  17. if(argc!=2)
  18. {
  19. printf("USAGE: scrchk <sourcefile>");
  20. exit(1);
  21. }
  22. if(getenv("TERMPATH")==NULL)
  23. sprintf(fpname, "%s.scr", argv[1]);
  24. else
  25. sprintf(fpname, "%s\%s.scr", getenv("TERMPATH"), argv[1]);
  26. if((scriptfd=fopen(fpname, "r"))==NULL)
  27. {
  28. printf("Error opening script file %s.n", fpname);
  29. exit(2);
  30. }
  31. fgets(str, 80, scriptfd); /* Flush init params */
  32. for(i=0;i<256;++i)
  33. labels[i]=-1;
  34. /* Parse */
  35. printf("Parsing...n");
  36. for(proglen=0;proglen<PROGSIZ;++proglen)
  37. {
  38. if(fgets(str, 80, scriptfd)==NULL)
  39. {
  40. flag=1;
  41. proglen++;
  42. break;
  43. }
  44. for(i=0;i<80;++i)
  45. if(str[i]=='n')
  46. {
  47. str[i]='';
  48. break;
  49. }
  50. else if(str[i]=='')
  51. break;
  52. if(!strlen(str))
  53. {
  54. printf("---n");
  55. proglen--;
  56. }
  57. else
  58. {
  59. if((str[0]!=':')&&(str[0]!=';'))
  60. printf("%03d %sn", proglen, str);
  61. else
  62. printf("--- %sn", str);
  63. if((str[0]!=';')&&(str[0]!='c')&&(str[0]!='+')&&(str[0]!='-')&&(str[1]!=' '))
  64. {
  65. printf("*** Missing first delimiting space.n");
  66. exit(11);
  67. }
  68. switch(str[0])
  69. {
  70. case ':':
  71. if(sscanf(str, "%*c %d", &value[0])!=1)
  72. {
  73. printf("*** Bad scan of label (:)n");
  74. exit(11);
  75. }
  76. if((value[0]<0)||(value[0]>255))
  77. {
  78. printf("*** Label out of rangen");
  79. exit(11);
  80. }
  81. if(labels[value[0]]!=-1)
  82. {
  83. printf("*** Label duplicatedn", value[0], proglen);
  84. exit(11);
  85. }
  86. labels[value[0]]=proglen;
  87. proglen--;
  88. break;
  89. case '*':
  90. miniprog[proglen].type='*';
  91. if(sscanf(str, "%*c %d", &value[0])!=1)
  92. {
  93. printf("*** Bad scan.n");
  94. exit(11);
  95. }
  96. if(value[0]>255)
  97. {
  98. printf("*** Label out of range.n");
  99. exit(11);
  100. }
  101. if(value[0]>=0)
  102. miniprog[proglen].label=(unsigned char)value[0];
  103. else
  104. miniprog[proglen].label=0;
  105. break;
  106. case 'g':
  107. case 'G':
  108. miniprog[proglen].type='g';
  109. if(sscanf(str, "%*c %d", &value[0])!=1)
  110. {
  111. printf("*** Bad scann");
  112. exit(11);
  113. }
  114. if((value[0]<0)||(value[0]>255))
  115. {
  116. printf("*** Label out of range.n");
  117. exit(11);
  118. }
  119. miniprog[proglen].label=(unsigned char)value[0];
  120. break;
  121. case 'r':
  122. case 'R':
  123. miniprog[proglen].type='r';
  124. if(sscanf(str, "%*c %d %d %d", &value[0], &value[1], &value[2])!=3)
  125. {
  126. printf("*** Bad scann");
  127. exit(11);
  128. }
  129. if((value[0]<0)||(value[0]>255))
  130. {
  131. printf("*** Label out of range.n");
  132. exit(11);
  133. }
  134. if((value[2]<0)||(value[2]>255))
  135. {
  136. printf("*** Retry Register out of range.n");
  137. exit(11);
  138. }
  139. miniprog[proglen].label=(unsigned char)value[0];
  140. break;
  141. case '0':
  142. miniprog[proglen].type='0';
  143. if(sscanf(str, "%*c %d", &value[0])!=1)
  144. {
  145. printf("*** Bad scann");
  146. exit(11);
  147. }
  148. if((value[0]<0)||(value[0]>255))
  149. {
  150. printf("*** Retry Register out of range.n");
  151. exit(11);
  152. }
  153. break;
  154. case 'p':
  155. case 'P':
  156. miniprog[proglen].type='p';
  157. if(sscanf(str, "%*c %d", &value[0])!=1)
  158. {
  159. printf("*** Bad scann");
  160. exit(11);
  161. }
  162. break;
  163. case 'w':
  164. case 'W':
  165. miniprog[proglen].type='w';
  166. if(sscanf(str, "%*c %d", &value[0])!=1)
  167. {
  168. printf("*** Bad scann");
  169. exit(11);
  170. }
  171. break;
  172. case '>':
  173. miniprog[proglen].type='>';
  174. if(sscanf(str, "%*c %d", &value[0])!=1)
  175. {
  176. printf("*** Bad scann");
  177. exit(11);
  178. }
  179. if((value[0]<0)||(value[0]>255))
  180. {
  181. printf("*** Label out of range.n");
  182. exit(11);
  183. }
  184. miniprog[proglen].label=(unsigned char)value[0];
  185. break;
  186. case 'k':
  187. case 'K':
  188. miniprog[proglen].type='k';
  189. if(sscanf(str, "%*c %d", &value[0])!=1)
  190. {
  191. printf("*** Bad scann");
  192. exit(11);
  193. }
  194. if((value[0]<0)||(value[0]>255))
  195. {
  196. printf("*** Label out of range.n");
  197. exit(11);
  198. }
  199. miniprog[proglen].label=(unsigned char)value[0];
  200. break;
  201. case '?':
  202. miniprog[proglen].type='?';
  203. if(sscanf(str, "%*c %d", &value[0])!=1)
  204. {
  205. printf("*** Bad scann");
  206. exit(11);
  207. }
  208. if((value[0]<0)||(value[0]>255))
  209. {
  210. printf("*** Label out of range.n");
  211. exit(11);
  212. }
  213. miniprog[proglen].label=value[0];
  214. break;
  215. case 'd':
  216. case 'D':
  217. miniprog[proglen].type='d';
  218. if(sscanf(str, "%*c %d", &value[0])!=1)
  219. {
  220. printf("*** Bad scann");
  221. exit(11);
  222. }
  223. if((value[0]<0)||(value[0]>255))
  224. {
  225. printf("*** Label out of range.n");
  226. exit(11);
  227. }
  228. miniprog[proglen].label=value[0];
  229. break;
  230. case '<':
  231. miniprog[proglen].type='<';
  232. break;
  233. case '+':
  234. miniprog[proglen].type='+';
  235. break;
  236. case 'c':
  237. miniprog[proglen].type='c';
  238. break;
  239. case '-':
  240. miniprog[proglen].type='-';
  241. break;
  242. case '!':
  243. miniprog[proglen].type='!';
  244. break;
  245. case 'x':
  246. case 'X':
  247. miniprog[proglen].type='s';
  248. if(sscanf(str, "%*c %d", &value[0])!=1)
  249. {
  250. printf("*** Bad scann");
  251. exit(11);
  252. }
  253. if((value[0]<0)||(value[0]>255))
  254. {
  255. printf("*** Label out of range.n");
  256. exit(11);
  257. }
  258. miniprog[proglen].label=value[0];
  259. break;
  260. case 's':
  261. case 'S':
  262. miniprog[proglen].type='s';
  263. if(sscanf(str, "%*c %d", &value[0])!=1)
  264. {
  265. printf("*** Bad scann");
  266. exit(11);
  267. }
  268. if((value[0]<0)||(value[0]>255))
  269. {
  270. printf("*** Label out of range.n");
  271. exit(11);
  272. }
  273. miniprog[proglen].label=value[0];
  274. break;
  275. case 'q':
  276. case 'Q':
  277. miniprog[proglen].type='q';
  278. if(sscanf(str, "%*c %d", &value[0])!=1)
  279. {
  280. printf("*** Bad scann");
  281. exit(11);
  282. }
  283. if((value[0]<128)&&(value[0]!=0))
  284. {
  285. printf("*** Quit with reserved exit code (!=0&&<128)n");
  286. exit(11);
  287. }
  288. break;
  289. case ';':
  290. proglen--;
  291. break;
  292. default:
  293. printf("*** Bad command charactern");
  294. exit(10);
  295. }
  296. }
  297. }
  298. if(!flag)
  299. {
  300. printf("Program too long.n");
  301. exit(11);
  302. }
  303. /* Check labels */
  304. printf("nnChecking branch label validity...n");
  305. for(i=0;i<proglen;i++)
  306. switch(miniprog[i].type)
  307. {
  308. case 'g':
  309. case '?':
  310. case 'd':
  311. if(labels[miniprog[i].label]==-1)
  312. printf("Unlisted label %d at statement %d (%c).n", miniprog[i].label, i, miniprog[i].type);
  313. break;
  314. case 'r':
  315. if(labels[miniprog[i].label]==-1)
  316. printf("Unlisted label %d at statement %d (%c).n", miniprog[i].label, i, miniprog[i].type);
  317. break;
  318. case '>':
  319. if(labels[miniprog[i].label]==-1)
  320. printf("Unlisted label %d at statement %d (%c).n", miniprog[i].label, i, miniprog[i].type);
  321. break;
  322. case 'k':
  323. if(labels[miniprog[i].label]==-1)
  324. printf("Unlisted label %d at statement %d (%c).n", miniprog[i].label, i, miniprog[i].type);
  325. case 'x':
  326. case 's':
  327. if(labels[miniprog[i].label]==-1)
  328. printf("Unlisted label %d at statement %d (%c).n", miniprog[i].label, i, miniprog[i].type);
  329. break;
  330. }
  331. printf("nnLabel Table:nn");
  332. printf("Lbl: Stmt:     Lbl: Stmt:     Lbl: Stmt:     Lbl: Stmt:     Lbl: Stmt:n ");
  333. for(i=0;i<256;++i)
  334. {
  335. if(labels[i]==-1)
  336. printf("%3d   ---", i);
  337. else
  338. printf("%3d   %3d", i, labels[i]);
  339. if((i+1)%5)
  340. printf("      ");
  341. else
  342. printf("n ");
  343. }
  344. printf("nDone.n");
  345. }