home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d848 / cweb.lha / CWeb / CWeb27.lha / examples / wmerge.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  11.3 KB  |  616 lines

  1. #define buf_size 100 \
  2.  
  3. #define max_include_depth 10 \
  4.  
  5. #define max_file_name_length 60
  6. #define cur_file file[include_depth]
  7. #define cur_file_name file_name[include_depth]
  8. #define cur_line line[include_depth]
  9. #define web_file file[0]
  10. #define web_file_name file_name[0] \
  11.  
  12. #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
  13. strncmp(buffer,change_buffer,limit-buffer)) \
  14.  
  15. #define max_modules 2000 \
  16.  \
  17.  
  18. #define spotless 0
  19. #define harmless_message 1
  20. #define error_message 2
  21. #define fatal_message 3
  22. #define mark_harmless {if(history==spotless)history= harmless_message;}
  23. #define mark_error history= error_message \
  24.  
  25. #define fatal(s1,s2){ \
  26. fprintf(stderr,s1);err_print(s2); \
  27. history= fatal_message;wrap_up(); \
  28. } \
  29.  
  30. #define confusion(s)fatal("! This can't happen: ",s) \
  31.  \
  32.  
  33. #define overflow(s){ \
  34. fprintf(stderr,"! Sorry, capacity exceeded: ");fatal("",s); \
  35. } \
  36.  \
  37.  
  38. #define update_terminal fflush(stdout) \
  39.  
  40. #line 183 "examples/wmerge-p.ch"
  41.  
  42. /*1:*/
  43. #line 12 "examples/wmerge.w"
  44.  
  45. #line 57 "examples/wmerge-p.ch"
  46. #include <stdio.h>
  47. #include <string.h>
  48. #include <stdlib.h>
  49. /*2:*/
  50. #line 71 "examples/wmerge-p.ch"
  51.  
  52. typedef short boolean;
  53. #ifdef __SASC
  54. typedef unsigned char eight_bits;
  55. #else
  56. typedef char unsigned eight_bits;
  57. #endif
  58. typedef char ASCII;
  59. #line 30 "examples/wmerge.w"
  60.  
  61. /*:2*//*3:*/
  62. #line 49 "examples/wmerge.w"
  63.  
  64. ASCII buffer[buf_size];
  65. ASCII*buffer_end= buffer+buf_size-2;
  66. ASCII*limit;
  67. ASCII*loc;
  68.  
  69. /*:3*//*5:*/
  70. #line 117 "examples/wmerge.w"
  71.  
  72. int include_depth;
  73. FILE*file[max_include_depth];
  74. FILE*change_file;
  75. char file_name[max_include_depth][max_file_name_length];
  76.  
  77. char change_file_name[max_file_name_length];
  78. int line[max_include_depth];
  79. int change_line;
  80. boolean input_has_ended;
  81. boolean changing;
  82.  
  83. /*:5*//*6:*/
  84. #line 140 "examples/wmerge.w"
  85.  
  86. ASCII change_buffer[buf_size];
  87. ASCII*change_limit;
  88.  
  89. /*:6*//*17:*/
  90. #line 305 "examples/wmerge.w"
  91.  
  92. typedef unsigned short sixteen_bits;
  93. sixteen_bits module_count;
  94. boolean changed_module[max_modules];
  95. boolean print_where= 0;
  96.  
  97. /*:17*//*23:*/
  98. #line 438 "examples/wmerge.w"
  99.  
  100. int history= spotless;
  101.  
  102. /*:23*/
  103. #line 60 "examples/wmerge-p.ch"
  104.  
  105. /*38:*/
  106. #line 183 "examples/wmerge-p.ch"
  107.  
  108. int input_ln(FILE*fp);
  109. int prime_the_change_buffer(void);
  110. int check_change(void);
  111. int reset_input(void);
  112. int get_line(void);
  113. int put_line(void);
  114. int check_complete(void);
  115. int err_print(char*s);
  116. int wrap_up(void);
  117. int scan_args(int argc,char**argv);
  118. int main(int argc,char**argv);
  119.  
  120. /*:38*/
  121. #line 61 "examples/wmerge-p.ch"
  122.  
  123. /*4:*/
  124. #line 90 "examples/wmerge-p.ch"
  125.  
  126. #line 76 "examples/wmerge.w"
  127. input_ln(fp)
  128. FILE*fp;
  129. {
  130. register int c;
  131. register ASCII*k;
  132. if(feof(fp))return(0);
  133. limit= k= buffer;
  134. while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
  135. if((*(k++)= c)!=32)limit= k;
  136. if(k>buffer_end)
  137. if((c= getc(fp))!=EOF&&c!='\n'){
  138. ungetc(c,fp);loc= buffer;err_print("\n! Input line too long");
  139.  
  140. }
  141. if(c==EOF&&limit==buffer)return(0);
  142.  
  143. return(1);
  144. }
  145.  
  146. /*:4*//*7:*/
  147. #line 150 "examples/wmerge.w"
  148.  
  149. prime_the_change_buffer()
  150. {
  151. change_limit= change_buffer;
  152. /*8:*/
  153. #line 164 "examples/wmerge.w"
  154.  
  155. while(1){
  156. change_line++;
  157. if(!input_ln(change_file))return;
  158. if(limit<buffer+2)continue;
  159. if(buffer[0]!=64)continue;
  160. /*9:*/
  161. #line 182 "examples/wmerge.w"
  162.  
  163. if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;
  164.  
  165. #line 96 "examples/wmerge-p.ch"
  166. /*:9*/
  167. #line 170 "examples/wmerge.w"
  168. ;
  169. /*10:*/
  170. #line 187 "examples/wmerge.w"
  171. {
  172. #line 188 "examples/wmerge.w"
  173. if(buffer[1]==105){
  174. loc= buffer+2;
  175. err_print("! No includes allowed in change file");
  176.  
  177. }
  178. }
  179.  
  180. /*:10*/
  181. #line 171 "examples/wmerge.w"
  182. ;
  183. if(buffer[1]==120)break;
  184. if(buffer[1]==121||buffer[1]==122){
  185. loc= buffer+2;
  186. err_print("! Where is the matching @x?");
  187.  
  188. }
  189. }
  190.  
  191. /*:8*/
  192. #line 154 "examples/wmerge.w"
  193. ;
  194. /*11:*/
  195. #line 197 "examples/wmerge.w"
  196.  
  197. do{
  198. change_line++;
  199. if(!input_ln(change_file)){
  200. err_print("! Change file ended after @x");
  201.  
  202. return;
  203. }
  204. }while(limit==buffer);
  205.  
  206. /*:11*/
  207. #line 155 "examples/wmerge.w"
  208. ;
  209. /*12:*/
  210. #line 207 "examples/wmerge.w"
  211.  
  212. {
  213. change_limit= change_buffer-buffer+limit;
  214. strncpy(change_buffer,buffer,limit-buffer+1);
  215. }
  216.  
  217. /*:12*/
  218. #line 156 "examples/wmerge.w"
  219. ;
  220. }
  221.  
  222. /*:7*//*13:*/
  223. #line 222 "examples/wmerge.w"
  224.  
  225. check_change()
  226. {
  227. int n= 0;
  228. if(lines_dont_match)return;
  229. while(1){
  230. changing= 1;print_where= 1;change_line++;
  231. if(!input_ln(change_file)){
  232. err_print("! Change file ended before @y");
  233.  
  234. change_limit= change_buffer;changing= 0;print_where= 1;
  235. return;
  236. }
  237. #line 237 "examples/wmerge.w"
  238. /*14:*/
  239. #line 253 "examples/wmerge.w"
  240.  
  241. if(limit>buffer+1&&buffer[0]==64){
  242. /*9:*/
  243. #line 182 "examples/wmerge.w"
  244.  
  245. if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;
  246.  
  247. #line 96 "examples/wmerge-p.ch"
  248. /*:9*/
  249. #line 255 "examples/wmerge.w"
  250. ;
  251. if(buffer[1]==120||buffer[1]==122){
  252. loc= buffer+2;err_print("! Where is the matching @y?");
  253.  
  254. }
  255. else if(buffer[1]==121){
  256. if(n>0){
  257. loc= buffer+2;
  258. err_print("! Hmm... some of the preceding lines failed to match");
  259.  
  260. }
  261. return;
  262. }
  263. }
  264.  
  265. /*:14*/
  266. #line 238 "examples/wmerge.w"
  267. ;
  268. /*12:*/
  269. #line 207 "examples/wmerge.w"
  270.  
  271. {
  272. change_limit= change_buffer-buffer+limit;
  273. strncpy(change_buffer,buffer,limit-buffer+1);
  274. }
  275.  
  276. /*:12*/
  277. #line 239 "examples/wmerge.w"
  278. ;
  279. changing= 0;print_where= 1;cur_line++;
  280. while(!input_ln(cur_file)){
  281. if(include_depth==0){
  282. err_print("! WEB file ended during a change");
  283.  
  284. input_has_ended= 1;return;
  285. }
  286. include_depth--;print_where= 1;cur_line++;
  287. }
  288. if(lines_dont_match)n++;
  289. }
  290. }
  291.  
  292. /*:13*//*15:*/
  293. #line 273 "examples/wmerge.w"
  294.  
  295. reset_input()
  296. {
  297. limit= buffer;loc= buffer+1;buffer[0]= 32;
  298. /*16:*/
  299. #line 286 "examples/wmerge.w"
  300.  
  301. if((web_file= fopen(web_file_name,"r"))==NULL)
  302. fatal("! Cannot open input file",web_file_name);
  303. if((change_file= fopen(change_file_name,"r"))==NULL)
  304. fatal("! Cannot open change file",change_file_name);
  305.  
  306. /*:16*/
  307. #line 277 "examples/wmerge.w"
  308. ;
  309. cur_line= 0;change_line= 0;include_depth= 0;
  310. changing= 1;prime_the_change_buffer();changing= !changing;
  311. limit= buffer;loc= buffer+1;buffer[0]= 32;input_has_ended= 0;
  312. }
  313.  
  314. /*:15*//*18:*/
  315. #line 311 "examples/wmerge.w"
  316.  
  317. get_line()
  318. {
  319. restart:
  320. if(changing)changed_module[module_count]= 1;
  321. else/*20:*/
  322. #line 373 "examples/wmerge.w"
  323. {
  324. cur_line++;
  325. while(!input_ln(cur_file)){
  326. print_where= 1;
  327. if(include_depth==0){input_has_ended= 1;break;}
  328. else{include_depth--;cur_line++;}
  329. }
  330. if(!input_has_ended)
  331. if(limit==change_limit-change_buffer+buffer)
  332. if(buffer[0]==change_buffer[0])
  333. if(change_limit>change_buffer)check_change();
  334. }
  335.  
  336. /*:20*/
  337. #line 316 "examples/wmerge.w"
  338. ;
  339. if(changing){
  340. /*21:*/
  341. #line 386 "examples/wmerge.w"
  342. {
  343. change_line++;
  344. if(!input_ln(change_file)){
  345. err_print("! Change file ended without @z");
  346.  
  347. buffer[0]= 64;buffer[1]= 122;limit= buffer+2;
  348. }
  349. if(limit>buffer+1)
  350. if(buffer[0]==64){
  351. /*9:*/
  352. #line 182 "examples/wmerge.w"
  353.  
  354. if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;
  355.  
  356. #line 96 "examples/wmerge-p.ch"
  357. /*:9*/
  358. #line 395 "examples/wmerge.w"
  359. ;
  360. #line 397 "examples/wmerge.w"
  361. if(buffer[1]==120||buffer[1]==121){
  362. loc= buffer+2;err_print("! Where is the matching @z?");
  363.  
  364. }
  365. else if(buffer[1]==122){
  366. prime_the_change_buffer();changing= !changing;print_where= 1;
  367. }
  368. }
  369. }
  370.  
  371. /*:21*/
  372. #line 318 "examples/wmerge.w"
  373. ;
  374. if(!changing){
  375. changed_module[module_count]= 1;goto restart;
  376. }
  377. }
  378. loc= buffer;*limit= 32;
  379. if(*buffer==64&&(*(buffer+1)==105||*(buffer+1)==73))
  380. /*19:*/
  381. #line 345 "examples/wmerge.w"
  382. {
  383. ASCII*k,*j;
  384. loc= buffer+2;
  385. while(loc<=limit&&(*loc==32||*loc==9||*loc==34))loc++;
  386. if(loc>=limit)err_print("! Include file name not given");
  387.  
  388. else{
  389. if(++include_depth<max_include_depth){
  390. k= cur_file_name;j= loc;
  391. while(*loc!=32&&*loc!=9&&*loc!=34)*k++= *loc++;
  392. *k= '\0';
  393. if((cur_file= fopen(cur_file_name,"r"))==NULL){
  394. loc= j;
  395. include_depth--;
  396. err_print("! Cannot open include file");
  397.  
  398. }
  399. else{cur_line= 0;print_where= 1;}
  400. }
  401. else{
  402. include_depth--;
  403. err_print("! Too many nested includes");
  404.  
  405. }
  406. }
  407. goto restart;
  408. }
  409.  
  410. /*:19*/
  411. #line 325 "examples/wmerge.w"
  412. ;
  413. return(!input_has_ended);
  414. }
  415.  
  416. #line 119 "examples/wmerge-p.ch"
  417. put_line()
  418. {
  419. char*ptr= buffer;
  420. while(ptr<limit)
  421. {
  422. putchar(*ptr);
  423. *ptr++;
  424. }
  425. putchar('\n');
  426. }
  427. #line 335 "examples/wmerge.w"
  428.  
  429. /*:18*//*22:*/
  430. #line 410 "examples/wmerge.w"
  431.  
  432. check_complete(){
  433. if(change_limit!=change_buffer){
  434. strncpy(buffer,change_buffer,change_limit-change_buffer+1);
  435. limit= change_limit-change_buffer+buffer;
  436. changing= 1;loc= change_limit;
  437. err_print("! Change file entry did not match");
  438.  
  439. }
  440. }
  441.  
  442. /*:22*//*24:*/
  443. #line 452 "examples/wmerge.w"
  444.  
  445. err_print(s)
  446. char*s;
  447. {
  448. ASCII*k,*l;
  449. fprintf(stderr,"\n%s",s);
  450. /*25:*/
  451. #line 471 "examples/wmerge.w"
  452.  
  453. if(changing)fprintf(stderr,". (l. %d of change file)\n",change_line);
  454. else if(include_depth==0)fprintf(stderr,". (l. %d)\n",cur_line);
  455. else fprintf(stderr,". (l. %d of include file %s)\n",cur_line,cur_file_name);
  456. l= (loc>=limit?limit:loc);
  457. if(l>buffer){
  458. for(k= buffer;k<l;k++)
  459. if(*k=='\t')putc(' ',stderr);
  460. else putc(*k,stderr);
  461. putc('\n',stderr);
  462. for(k= buffer;k<l;k++)putc(' ',stderr);
  463. }
  464. for(k= l;k<limit;k++)putc(*k,stderr);
  465. if(*limit==124)putc('|',stderr);
  466. putc(' ',stderr);
  467.  
  468. /*:25*/
  469. #line 458 "examples/wmerge.w"
  470. ;
  471. fflush(stdout);mark_error;
  472. }
  473.  
  474. /*:24*//*29:*/
  475. #line 517 "examples/wmerge.w"
  476.  
  477. wrap_up(){
  478. putc('\n',stderr);
  479. /*30:*/
  480. #line 525 "examples/wmerge.w"
  481.  
  482. switch(history){
  483. case spotless:fprintf(stderr,"(No errors were found.)\n");break;
  484. case harmless_message:
  485. fprintf(stderr,"(Did you see the warning message above?)\n");break;
  486. case error_message:
  487. fprintf(stderr,"(Pardon me, but I think I spotted something wrong.)\n");
  488. break;
  489. case fatal_message:fprintf(stderr,"(That was a fatal error, my friend.)\n");
  490. }
  491.  
  492. /*:30*/
  493. #line 520 "examples/wmerge.w"
  494. ;
  495. if(history>harmless_message)exit(1);
  496. else exit(0);
  497. }
  498.  
  499. /*:29*//*31:*/
  500. #line 549 "examples/wmerge.w"
  501.  
  502. #line 550 "examples/wmerge.w"
  503. scan_args(argc,argv)
  504. char**argv;
  505. {
  506. #line 151 "examples/wmerge-p.ch"
  507. char*dot_pos;
  508. #line 554 "examples/wmerge.w"
  509. boolean found_web= 0,found_change= 0;
  510. while(--argc>0){
  511. ++argv;
  512. if(!found_web)/*32:*/
  513. #line 570 "examples/wmerge.w"
  514.  
  515. {
  516. if(strlen(*argv)>max_file_name_length-5)
  517. /*36:*/
  518. #line 600 "examples/wmerge.w"
  519. fatal("! Filename %s too long\n",*argv);
  520.  
  521. /*:36*/
  522. #line 573 "examples/wmerge.w"
  523. ;
  524. #line 158 "examples/wmerge-p.ch"
  525. if((dot_pos= strchr(*argv,'.'))==NULL)
  526. #line 575 "examples/wmerge.w"
  527. sprintf(web_file_name,"%s.w",*argv);
  528. else{
  529. sprintf(web_file_name,"%s",*argv);
  530. *dot_pos= 0;
  531. }
  532. found_web= 1;
  533. }
  534.  
  535. /*:32*/
  536. #line 557 "examples/wmerge.w"
  537.  
  538. else if(!found_change)/*33:*/
  539. #line 583 "examples/wmerge.w"
  540.  
  541. {
  542. if(strlen(*argv)>max_file_name_length-5)
  543. /*36:*/
  544. #line 600 "examples/wmerge.w"
  545. fatal("! Filename %s too long\n",*argv);
  546.  
  547. /*:36*/
  548. #line 586 "examples/wmerge.w"
  549. ;
  550. #line 164 "examples/wmerge-p.ch"
  551. if((dot_pos= strchr(*argv,'.'))==NULL)
  552. #line 588 "examples/wmerge.w"
  553. sprintf(change_file_name,"%s.ch",*argv);
  554. else sprintf(change_file_name,"%s",*argv);
  555. found_change= 1;
  556. }
  557.  
  558. #line 170 "examples/wmerge-p.ch"
  559. /*:33*/
  560. #line 558 "examples/wmerge.w"
  561.  
  562. else/*35:*/
  563. #line 595 "examples/wmerge.w"
  564.  
  565. {
  566. fatal("! Usage: wmerge webfile[.w] [changefile[.ch]]\n","")
  567. }
  568.  
  569. /*:35*/
  570. #line 559 "examples/wmerge.w"
  571. ;
  572. }
  573. if(!found_web)/*35:*/
  574. #line 595 "examples/wmerge.w"
  575.  
  576. {
  577. fatal("! Usage: wmerge webfile[.w] [changefile[.ch]]\n","")
  578. }
  579.  
  580. /*:35*/
  581. #line 561 "examples/wmerge.w"
  582. ;
  583. if(!found_change)/*34:*/
  584. #line 170 "examples/wmerge-p.ch"
  585.  
  586. #if defined( __TURBOC__ )
  587. strcpy(change_file_name,"nul");
  588. #elif defined( __SASC )
  589. strcpy(change_file_name,"NIL:");
  590. #else
  591. strcpy(change_file_name,"/dev/null");
  592. #endif
  593. #line 594 "examples/wmerge.w"
  594.  
  595. /*:34*/
  596. #line 562 "examples/wmerge.w"
  597. ;
  598. }
  599.  
  600. /*:31*/
  601. #line 62 "examples/wmerge-p.ch"
  602.  
  603. #line 16 "examples/wmerge.w"
  604. main(argc,argv)
  605. char**argv;
  606. {
  607. scan_args(argc,argv);
  608. reset_input();
  609. while(get_line())
  610. put_line();
  611. wrap_up();
  612. }
  613.  
  614. #line 71 "examples/wmerge-p.ch"
  615. /*:1*/
  616.