WORK.C
上传用户:xiantiandi
上传日期:2007-01-06
资源大小:21k
文件大小:11k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. work()
  5. {
  6. #include "teco.h"
  7. int iter; /* Iteration  < > count */
  8. int prefix; /* Non-zero if prefix   */
  9. int sign; /* Sign  of number      */
  10. int tmp; /* Scratch variable     */
  11. int value; /* Value of number      */
  12. int wrk; /* Another scratch var. */
  13. append(); /* Read in first buffer */
  14. bufptx=0; /* Start at head of bfr */
  15. loop: cancel=0; /* Show output  allowed */
  16. comand(); /* Get the comand strng */
  17. getptx=0; /* Start of command buf */
  18. iter=0; /* Not any <> iteration */
  19. next: if (++getptx > getptr) { /* Any more commands?   */
  20. if (iter) fprintf(stderr,"?UTC, Unterminated commandn7");
  21. goto loop; /*  ..yes then go again */
  22. }
  23. if (getbuf[getptx] == 27) goto next; /* Punt Delimiter */
  24. prefix=0; /* No numeric arg */
  25. sign=1;  /* Default  sign  */
  26. value=1; /* Default  value */
  27. if (getbuf[getptx] == '+') {
  28. sign=1; /* Positive sign  */
  29. getptx++;
  30. } else {
  31. if (getbuf[getptx] == '-') {
  32. sign=-1; /* Negative sign  */
  33. getptx++;
  34. }
  35. }
  36. tmp=getptx; /* Start  parse   */
  37. if (isdigit(getbuf[tmp])) { /*  ...is number  */
  38. prefix=1; /*  ...not deflt  */
  39. value=0; /*  ...initialize */
  40. while (isdigit(getbuf[tmp])) {
  41. value=value*10+(getbuf[tmp++]-'0');
  42. }
  43. } else {
  44. if (getbuf[tmp] == '.'){ /* Dot means THIS */
  45. prefix=1; /*  ....not deflt */
  46. value=bufptx; /* Value is  THIS */
  47. tmp++; /* Accept it      */
  48. }
  49. if (toupper(getbuf[tmp]) == 'B'){
  50. prefix=1; /*  ....not deflt */
  51. value=0; /* Always is zero */
  52. tmp++; /* Accept it      */
  53. }
  54. if (toupper(getbuf[tmp]) == 'Z'){
  55. prefix=1; /*  ....not deflt */
  56. value=bufptr; /* Value is   END */
  57. tmp++; /* Accept it      */
  58. }
  59. }
  60. number=sign*value; /* Specific value */
  61. getptx=tmp; /* getptx --> Cmd */
  62. verb=toupper(getbuf[getptx]); /* VERB is action */
  63. if (verb == 27 ) goto next; /* Missing  verb  */
  64. if (verb == '=') { /* Show our globl */
  65. if (prefix) {
  66. fprintf(stderr,"%dn",number);
  67. } else {
  68. fprintf(stderr,"?NAE, No arg before =n7");
  69. }
  70. goto next; /* punt, all done */
  71. } else {
  72.       adverb=toupper(getbuf[getptx+1]); /* verb qualifier */
  73. } /*   ...is adverb */
  74. if (verb == '>') { /* End iteration */
  75. if (!iter)  { /*  ..must exist */
  76. fprintf(stderr,"?BNI, Not in iterationn7");
  77. goto loop; /*  ...flush buf */
  78. }
  79. if (--iter) { /*  ..find start */
  80. while (getbuf[--getptx] != '<');
  81. } /*  ..must exist */
  82. goto next; /*  ...continue  */
  83. }
  84. if (verb == '<') { /* Iteration mode */
  85. if (iter)  { /*  ...norecursiv */
  86. fprintf(stderr,"?PDO, Push-down list overflown7");
  87. goto loop;
  88. }
  89. if (!prefix) { /*  ...no limits  */
  90. iter=32766; /*  ...big enuff  */
  91. } else { /*  ...use his v  */
  92. iter=value; /*  ...supplied   */
  93. } /*  ...finished   */
  94. goto next; /*  ...have more  */
  95. }
  96. if (verb == 'A') { /* Append a  page */
  97. while (0 < number--) append(); /*  ...with call  */
  98. goto next; /*  ...punt this  */
  99. }
  100. if (verb == 'C') { /* Advance char   */
  101. bufptx=bufptx+number; /*  on  request   */
  102. if (bufptx<0) { /* Insane request */
  103. fprintf(stderr,"?POP, pointer off pagen7");
  104. bufptx=0; /* Minimum place  */
  105. goto loop; /*  ...abort this */
  106. }
  107. if (bufptx>bufptr) { /* More  insanity */
  108. fprintf(stderr,"?POP, pointer off pagen7");
  109. bufptx=bufptr; /* Maximum place  */
  110. goto loop; /*  ...abort this */
  111. }
  112. goto next; /* Eat some more  */
  113. }
  114. if (verb == 'D') { /* Delete char    */
  115. if (number == 0) goto next; /* Must exist     */
  116. if (number <  0) { /* Delete backwds */
  117. bufptx=bufptx+number; /*  ...back up    */
  118. number=abs(number); /*  ...magnitude  */
  119. } /*  ...delete for */
  120. if (bufptx < 0) { /* Sanity chk #1  */
  121. fprintf(stderr,"?DTB, Delete too bign7");
  122. goto loop; /*  ...flush all  */
  123. } /*  ...of buffer  */
  124. if (bufptx+number > bufptr) { /* Sanity chk #2  */
  125. fprintf(stderr,"?DTB, Delete too bign7");
  126. goto loop; /*  ...flush all  */
  127. } /*  ...of buffer  */
  128. memcpy(&buffer[bufptx+1],&buffer[bufptx+number+1],bufptr-bufptx);
  129. bufptr=bufptr-number; /* Show deleted.. */
  130. if (bufptr < bufptx) { /*  ..not past nd */
  131. bufptx=bufptr; /* Impose  sanity */
  132. } /*  ..stop  this  */
  133. goto next; /*  ...punt this  */
  134. }
  135. if (verb == 'E' ) { /* Buffer  exits  */
  136. getptx++; /* Advance pointr */
  137. if (adverb == 'F') return; /* Terminate file */
  138. if (adverb == 'X') { /* Orderly   exit */
  139. while (bufptr) page(); /* Write out page */
  140. return; /*  ...and leave  */
  141. }
  142.       fprintf(stderr,"?IEC, Illegal character '%c' after En7",adverb);
  143. goto loop; /* Punt commands  */
  144. }
  145. if (verb == 'F' ) { /* Replaqe string */
  146. getptx++; /* Advance pointr */
  147. if (adverb=='S' | adverb=='N') {/* ...replace cmd */
  148. if (1 > number) {
  149. fprintf(stderr,"?ISA, Illegal search argn7");
  150. goto loop;
  151. }
  152. if (getbuf[++getptx] == 27) goto next;
  153. while (number--) { /* Scan from here */
  154. if (adverb == 'S'){/* Local in scope */
  155. search();
  156. } else { /* Global replace */
  157. next();
  158. }
  159. if (!bufptx) { /*  ...not  found */
  160.       tmp=getptx;
  161.       while (getbuf[++getptx] != 27);
  162.       getbuf[getptx]='';
  163.       fprintf(stderr,"?SRH, Search failure ");
  164.       fprintf(stderr,"'%s'n7",&getbuf[tmp]);
  165.       goto loop;
  166. }
  167.      tmp=0;
  168.      while (getbuf[getptx + ++tmp] != 27);
  169.      memcpy(&buffer[bufptx],&buffer[bufptx+tmp],bufptr-bufptx);
  170.      bufptr=bufptr-tmp;
  171.      wrk=0;
  172.      while (getbuf[getptx + tmp + ++wrk] != 27);
  173.      wrk--;
  174.      bufptr++;
  175.      if (bufptr+wrk > bufsiz) {
  176. fprintf(stderr,"?MEM, Memory overflown7");
  177. goto loop;
  178.      }
  179.      if (bufptr > bufptx) {
  180.       memcpy(&buffer[bufptx+wrk],&buffer[bufptx],bufptr-bufptx);
  181.      }
  182.      if (wrk > 0) {
  183. memcpy(&buffer[bufptx],&getbuf[getptx+tmp+1],wrk);
  184.      }
  185.      bufptx--;
  186.      bufptr--;
  187.      bufptr=bufptr+wrk;
  188.      bufptx=bufptx+wrk;
  189.      }
  190.      while (getbuf[++getptx] != 27);
  191.      while (getbuf[++getptx] != 27);
  192.      goto next;
  193. }
  194. fprintf(stderr,"?ILL, Illegal command '%c%c'n7",verb,adverb);
  195. goto loop;
  196. }
  197. if (verb == 'H' ) { /* Hole   thingy  */
  198. getptx++; /* Advance pointr */
  199. if (adverb == 'T') { /* Type the buffr */
  200. tmp=0; /* Start at begin */
  201. while (++tmp<=bufptr ){ /*  ...start list */
  202. echo(buffer[tmp]);
  203. } /*  ...all done   */
  204. goto next; /*  ...fetch next */
  205. }
  206. if (adverb == 'K') { /* Kill the bufer */
  207. bufptr=0; /* Nothing in it  */
  208. bufptx=0; /* Force at end   */
  209. goto next; /* Fetch next com */
  210. }
  211. fprintf(stderr,"?ILL, Illegal command '%c%c'n7",verb,adverb);
  212. goto loop; /* Punt the error */
  213. }
  214. if (verb == 'I' | verb == 9) { /* Insert    text */
  215. if (verb == 'I') ++getptx; /* Skip 'I'  only */
  216. tmp=getptx; /* Grab a pointer */
  217. if (prefix) { /* Character inst */
  218. if (getbuf[tmp] != 27) {
  219. fprintf(stderr,"?IIA, Illegal insert argn7");
  220. goto loop;
  221. }
  222. bufptr++;
  223. bufptx++;
  224. if (bufptr > bufsiz) {
  225. fprintf(stderr,"?MEM, Memory overflown7");
  226. goto loop;
  227. }
  228. if (bufptr > bufptx) { /* Sanity  check  */
  229. memcpy(&buffer[bufptx+1],&buffer[bufptx],bufptr-bufptx);
  230. } /* ..only if sane */
  231. buffer[bufptx]=toascii(number);
  232. goto next; /* Eat some  more */
  233. }
  234. while (getbuf[++tmp] != 27); /* Find string nd */
  235. bufptr++;
  236. bufptx++;
  237. if (bufptr+tmp > bufsiz) {
  238. fprintf(stderr,"?MEM, Memory overflown7");
  239. goto loop;
  240. }
  241. if (bufptr > bufptx) { /* Sanity  check  */
  242. memcpy(&buffer[bufptx+tmp-getptx],&buffer[bufptx],bufptr-bufptx);
  243. } /* ..only if sane */
  244. memcpy(&buffer[bufptx],&getbuf[getptx],tmp-getptx);
  245. bufptx--; /* Undo the fudge */
  246. bufptr--; /*  ...also fudge */
  247. bufptr=bufptr+tmp-getptx; /* New buffer siz */
  248. bufptx=bufptx+tmp-getptx; /* Position AFTER */
  249. getptx=tmp; /* Skip insertion */
  250. goto next; /*  ...fetch next */
  251. }
  252. if (verb == 'J') { /* Jump  defaults */
  253. bufptx=0; /* ...to zero !!! */
  254. if (prefix) { /* Explicit  jump */
  255. if (number < 0) { /* Sanity chk  #1 */
  256. fprintf(stderr,"?POP, Pointer off pagen7");
  257. goto loop; /*  ..insane, abt */
  258. }
  259. if (number > bufptr) { /* Sanity chk  #2 */
  260. fprintf(stderr,"?POP, Pointer off pagen7");
  261. bufptx=bufptr-1;/* Maximum place  */
  262. goto loop; /*  ...abort  cmd */
  263. }
  264. bufptx=number; /* Jump  location */
  265. }
  266. goto next; /* punt, all done */
  267. }
  268. if (verb == 'K' ) { /* delete lines   */
  269. kill(); /*  ...as desired */
  270. goto next; /* Eat some more */
  271. }
  272. if (verb == 'L') { /* Line  position */
  273. line(); /*   ...go for it */
  274. goto next; /*   ...work more */
  275. }
  276. if (verb == 'N') { /* Global  search */
  277. if (1 > number) {
  278. fprintf(stderr,"?ISA, Illegal search argn7");
  279. goto loop;
  280. }
  281. if (getbuf[++getptx] == 27) { /* Scan from here */
  282. goto next; /*  ..null search */
  283. }
  284. while (number--) { /* Search  counts */
  285. next(); /* Execute search */
  286. if (!bufptx) { /*  ...not found  */
  287. tmp=getptx;
  288. while (getbuf[++getptx] != 27);
  289. getbuf[getptx]='';
  290. fprintf(stderr,"?SRH, Search failure ");
  291. fprintf(stderr,"'%s'n7",&getbuf[tmp]);
  292. goto loop;
  293. }
  294. }
  295. while (getbuf[++getptx] != 27) {
  296. bufptx++;
  297. }
  298. goto next;
  299. }
  300. if (verb == 'P') { /* Page in buffer */
  301. if (number < 1) { /* Illegal  count */
  302. fprintf(stderr,"?NPA, Negative page argumentn7");
  303. goto loop; /*  ...abort this */
  304. }
  305. while(number-- && bufptr)page();/*  ...do   pages */
  306. goto next; /* Eat some more  */
  307. }
  308. if (verb == 'R') { /* Backspace char */
  309. bufptx=bufptx-number; /*  on  request   */
  310. if (bufptx<0) { /* Insane request */
  311. fprintf(stderr,"?POP, pointer off pagen7");
  312. bufptx=0; /* Minimum place  */
  313. goto loop; /*  ...abort this */
  314. }
  315. if (bufptx>bufptr) { /* More insanity  */
  316. fprintf(stderr,"?POP, Pointer off pagen7");
  317. bufptx=bufptr; /* Maximum place  */
  318. goto loop; /*  ...abort this */
  319. }
  320. goto next; /* Eat some more  */
  321. }
  322. if (verb == 'S') { /* Local   search */
  323. if (1 > number) {
  324. fprintf(stderr,"?ISA, Illegal search argn7");
  325. goto loop;
  326. }
  327. if (getbuf[++getptx] == 27) { /* Scan from here */
  328. goto next; /*  ..null search */
  329. }
  330. while (number--) { /* Search  counts */
  331. search(); /* Execute search */
  332. if (!bufptx) { /*  ...not found  */
  333. tmp=getptx;
  334. while (getbuf[++getptx] != 27);
  335. getbuf[getptx]='';
  336. fprintf(stderr,"?SRH, Search failure ");
  337. fprintf(stderr,"'%s'n7",&getbuf[tmp]);
  338. goto loop;
  339. }
  340. }
  341. while (getbuf[++getptx] != 27) {
  342. bufptx++;
  343. }
  344. goto next;
  345. }
  346. if (verb == 'T') { /* Type out stuff */
  347. type(); /*  ...get typist */
  348. goto next; /* Eat more stuff */
  349. }
  350. if (verb == 'V') { /* Verify  lines  */
  351. verify(); /*  ..verify type */
  352. goto next; /* Eat more stuff */
  353. }
  354. if (verb == '^' & adverb == 'C') { /* Flush politely */
  355. abort(); /*  ..and go away */
  356. }
  357. fprintf(stderr,"?ILL, Illegal command '%c'n7",verb);
  358. goto loop; /* Flush command  */
  359. }