home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 1 / FFMCD01.bin / bbs / libdisks / d800t899 / disk848.lha / CWeb / CWeb27.lha / common.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  22.1 KB  |  1,178 lines

  1. #define tangle 0
  2. #define weave 1 \
  3.  
  4. #define and_and 04
  5. #define lt_lt 020
  6. #define gt_gt 021
  7. #define plus_plus 013
  8. #define minus_minus 01
  9. #define minus_gt 031
  10. #define not_eq 032
  11. #define lt_eq 034
  12. #define gt_eq 035
  13. #define eq_eq 036
  14. #define or_or 037 \
  15.  
  16. #define buf_size 100
  17. #define long_buf_size 500 \
  18.  
  19. #define max_include_depth 10 \
  20.  
  21. #define max_file_name_length 60
  22. #define cur_file file[include_depth]
  23. #define cur_file_name file_name[include_depth]
  24. #define cur_line line[include_depth]
  25. #define web_file file[0]
  26. #define web_file_name file_name[0] \
  27.  
  28. #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
  29. strncmp(buffer,change_buffer,limit-buffer)) \
  30.  
  31. #define if_module_start_make_pending(b){*limit= '!'; \
  32. for(loc= buffer;isspace(*loc);loc++); \
  33. *limit= ' '; \
  34. if(*loc=='@'&&(isspace(*(loc+1))||*(loc+1)=='*'))change_pending= b; \
  35. } \
  36.  
  37. #define max_modules 2000 \
  38.  \
  39.  
  40. #define max_bytes 90000 \
  41.  
  42. #define max_names 4000 \
  43.  \
  44.  
  45. #define length(c)(c+1)->byte_start-(c)->byte_start
  46. #define print_id(c)term_write((c)->byte_start,length((c))) \
  47.  \
  48.  
  49. #define hash_size 353 \
  50.  
  51. #define llink link
  52. #define rlink dummy.Rlink
  53. #define root name_dir->rlink \
  54.  \
  55.  
  56. #define less 0
  57. #define equal 1
  58. #define greater 2
  59. #define prefix 3
  60. #define extension 4 \
  61.  
  62. #line 709 "common.w"
  63.  
  64. #define spotless 0
  65. #define harmless_message 1
  66. #define error_message 2
  67. #define fatal_message 3
  68. #define mark_harmless {if(history==spotless)history= harmless_message;}
  69. #define mark_error history= error_message \
  70.  
  71. #define fatal(s,t){ \
  72. printf(s);err_print(t); \
  73. history= fatal_message;wrap_up(); \
  74. } \
  75.  
  76. #define confusion(s)fatal("! This can't happen: ",s) \
  77.  \
  78.  
  79. #define overflow(t){ \
  80. printf("\n! Sorry, %s capacity exceeded",t);fatal("",""); \
  81. } \
  82.  \
  83.  
  84. #define show_banner flags['b']
  85. #define show_progress flags['p']
  86. #define show_stats flags['s']
  87. #define show_happiness flags['h']
  88. #define use_amiga_keywords flags['a']
  89. #define use_german_macros flags['g']
  90. #line 951 "common.w"
  91.  
  92. #define update_terminal fflush(stdout) \
  93.  
  94. #define new_line putchar('\n')
  95. #define putxchar putchar
  96. #define term_write(a,b)fflush(stdout),write(1,a,b)
  97. #define line_write(c)write(fileno(C_file),c)
  98. #define C_printf(c,a)fprintf(C_file,c,a)
  99. #define C_putc(c)putc(c,C_file) \
  100.  
  101. #line 485 "common-p.ch"
  102.  
  103. /*1:*/
  104. #line 56 "common.w"
  105.  
  106. #line 119 "common-p.ch"
  107. /*5:*/
  108. #line 98 "common.w"
  109.  
  110. #include <ctype.h>
  111.  
  112. /*:5*//*8:*/
  113. #line 154 "common.w"
  114.  
  115. #include <stdio.h>
  116.  
  117. /*:8*//*68:*/
  118. #line 504 "common-p.ch"
  119.  
  120. #ifdef __TURBOC__
  121. #include <alloc.h>
  122. #endif
  123.  
  124. /*:68*//*72:*/
  125. #line 566 "common-p.ch"
  126.  
  127. #include <stdlib.h>
  128. #include <string.h>
  129.  
  130. /*:72*/
  131. #line 119 "common-p.ch"
  132.  
  133. /*69:*/
  134. #line 516 "common-p.ch"
  135.  
  136. #ifdef __TURBOC__
  137. #define HUGE huge
  138. #else
  139. #define HUGE
  140. #endif
  141.  
  142.  
  143. /*:69*/
  144. #line 120 "common-p.ch"
  145.  
  146. #line 58 "common.w"
  147. /*2:*/
  148. #line 70 "common.w"
  149.  
  150. typedef short boolean;
  151. boolean program;
  152.  
  153. /*:2*//*7:*/
  154. #line 148 "common.w"
  155.  
  156. char buffer[long_buf_size];
  157. char*buffer_end= buffer+buf_size-2;
  158. char*limit= buffer;
  159. char*loc= buffer;
  160.  
  161. /*:7*//*10:*/
  162. #line 203 "common.w"
  163.  
  164. int include_depth;
  165. FILE*file[max_include_depth];
  166. FILE*change_file;
  167. char file_name[max_include_depth][max_file_name_length];
  168.  
  169. char change_file_name[max_file_name_length];
  170. char alt_web_file_name[max_file_name_length];
  171. int line[max_include_depth];
  172. int change_line;
  173. boolean input_has_ended;
  174. boolean changing;
  175. boolean web_file_open= 0;
  176.  
  177. /*:10*//*21:*/
  178. #line 412 "common.w"
  179.  
  180. typedef unsigned short sixteen_bits;
  181. sixteen_bits module_count;
  182. boolean changed_module[max_modules];
  183. boolean change_pending;
  184.  
  185. boolean print_where= 0;
  186.  
  187. /*:21*//*27:*/
  188. #line 553 "common.w"
  189.  
  190. typedef struct name_info{
  191. #line 227 "common-p.ch"
  192. char HUGE*byte_start;
  193. #line 556 "common.w"
  194. /*31:*/
  195. #line 591 "common.w"
  196.  
  197. #line 272 "common-p.ch"
  198. struct name_info HUGE*link;
  199. #line 593 "common.w"
  200.  
  201. /*:31*//*38:*/
  202. #line 681 "common.w"
  203.  
  204. union{
  205. #line 293 "common-p.ch"
  206. struct name_info HUGE*Rlink;
  207.  
  208. #line 300 "common-p.ch"
  209. char Ilk;
  210. #line 686 "common.w"
  211. }dummy;
  212.  
  213. /*:38*//*45:*/
  214. #line 821 "common.w"
  215.  
  216. #line 363 "common-p.ch"
  217. char HUGE*equiv_or_xref;
  218. #line 823 "common.w"
  219.  
  220. /*:45*/
  221. #line 556 "common.w"
  222.  
  223. }name_info;
  224. #line 237 "common-p.ch"
  225. typedef name_info HUGE*name_pointer;
  226. #ifdef __TURBOC__
  227. char HUGE*byte_mem;
  228. char HUGE*byte_mem_end;
  229. name_info HUGE*name_dir;
  230. name_pointer name_dir_end;
  231. #else
  232. char byte_mem[max_bytes];
  233. char*byte_mem_end= byte_mem+max_bytes-1;
  234. name_info name_dir[max_names];
  235. name_pointer name_dir_end= name_dir+max_names-1;
  236. #endif
  237. #line 563 "common.w"
  238.  
  239. /*:27*//*29:*/
  240. #line 577 "common.w"
  241.  
  242. name_pointer name_ptr;
  243. #line 254 "common-p.ch"
  244. char HUGE*byte_ptr;
  245. #line 580 "common.w"
  246.  
  247. /*:29*//*32:*/
  248. #line 604 "common.w"
  249.  
  250. typedef name_pointer*hash_pointer;
  251. name_pointer hash[hash_size];
  252. hash_pointer hash_end= hash+hash_size-1;
  253. hash_pointer h;
  254.  
  255. /*:32*//*46:*/
  256. #line 841 "common.w"
  257.  
  258. int history= spotless;
  259.  
  260. /*:46*//*54:*/
  261. #line 952 "common.w"
  262.  
  263. int argc;
  264. char**argv;
  265. char C_file_name[max_file_name_length];
  266. char tex_file_name[max_file_name_length];
  267. #line 397 "common-p.ch"
  268. boolean flags[256];
  269. #line 958 "common.w"
  270.  
  271. /*:54*//*63:*/
  272. #line 1082 "common.w"
  273.  
  274. FILE*C_file;
  275. FILE*tex_file;
  276.  
  277. /*:63*/
  278. #line 58 "common.w"
  279.  
  280. /*3:*/
  281. #line 80 "common.w"
  282. int phase;
  283.  
  284. /*:3*//*11:*/
  285. #line 228 "common.w"
  286.  
  287. char change_buffer[buf_size];
  288. char*change_limit;
  289.  
  290. /*:11*//*70:*/
  291. #line 528 "common-p.ch"
  292.  
  293. #ifdef __SASC 
  294. typedef unsigned char eight_bits;
  295. #else
  296. typedef char unsigned eight_bits;
  297. #endif
  298. void common_init(void);
  299. extern void print_stats(void);
  300. name_pointer id_lookup(char*first,char*last,char t);
  301. name_pointer mod_lookup(char*k,char*l);
  302. name_pointer prefix_lookup(char*k,char*l);
  303. extern boolean names_match(name_pointer p,char*first,int l,eight_bits t);
  304. extern void init_p(name_pointer p,eight_bits t);
  305. extern void init_node(name_pointer p);
  306. void err_print(char*s);
  307. void wrap_up(void);
  308. void reset_input(void);
  309. boolean get_line(void);
  310. void check_complete(void);
  311. #ifdef __TURBOC__
  312. static void far*allocsafe(unsigned long nunits,unsigned long unitsz);
  313.  
  314. #endif
  315.  
  316. /*:70*//*71:*/
  317. #line 554 "common-p.ch"
  318.  
  319. static boolean input_ln(FILE*fp);
  320. static void prime_the_change_buffer(void);
  321. static void check_change(void);
  322. static name_pointer install_node(name_pointer parent,int c,char*j,int name_len);
  323. static short web_strcmp(char*j,char*j1,char HUGE*k,char HUGE*k1);
  324. static void scan_args(void);
  325.  
  326. /*:71*/
  327. #line 59 "common.w"
  328.  
  329. #line 127 "common-p.ch"
  330. /*4:*/
  331. #line 86 "common.w"
  332.  
  333. #line 133 "common-p.ch"
  334. void common_init(void)
  335. #line 88 "common.w"
  336. {
  337. /*30:*/
  338. #line 581 "common.w"
  339.  
  340. #line 260 "common-p.ch"
  341. #ifdef __TURBOC__
  342. byte_mem= allocsafe(max_bytes,sizeof(*byte_mem));
  343. byte_mem_end= byte_mem+max_bytes-1;
  344. name_dir= allocsafe(max_names,sizeof(*name_dir));
  345. name_dir_end= name_dir+max_names-1;
  346. #endif
  347. name_dir->byte_start= byte_ptr= byte_mem;
  348. #line 583 "common.w"
  349. name_ptr= name_dir+1;
  350. name_ptr->byte_start= byte_mem;
  351.  
  352. /*:30*//*33:*/
  353. #line 612 "common.w"
  354.  
  355. for(h= hash;h<=hash_end;*h++= NULL);
  356.  
  357. /*:33*//*39:*/
  358. #line 688 "common.w"
  359.  
  360. root= NULL;
  361.  
  362. /*:39*/
  363. #line 89 "common.w"
  364. ;
  365. /*55:*/
  366. #line 404 "common-p.ch"
  367.  
  368. #line 405 "common-p.ch"
  369. show_banner= show_happiness= show_progress= 
  370. #ifdef __SASC
  371. use_amiga_keywords= 
  372. #endif
  373. use_german_macros= 1;
  374. #line 965 "common.w"
  375.  
  376. /*:55*/
  377. #line 90 "common.w"
  378. ;
  379. /*64:*/
  380. #line 1086 "common.w"
  381.  
  382. scan_args();
  383. if(program==tangle){
  384. if((C_file= fopen(C_file_name,"w"))==NULL)
  385. fatal("! Cannot open output file ",C_file_name);
  386.  
  387. }
  388. else{
  389. if((tex_file= fopen(tex_file_name,"w"))==NULL)
  390. fatal("! Cannot open output file ",tex_file_name);
  391. }
  392.  
  393. /*:64*/
  394. #line 91 "common.w"
  395. ;
  396. }
  397.  
  398. /*:4*//*9:*/
  399. #line 161 "common.w"
  400.  
  401. #line 140 "common-p.ch"
  402. static boolean input_ln(FILE*fp)
  403.  
  404. #line 164 "common.w"
  405. {
  406. register int c;
  407. register char*k;
  408. if(feof(fp))return(0);
  409. limit= k= buffer;
  410. while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
  411. if((*(k++)= c)!=' ')limit= k;
  412. if(k>buffer_end)
  413. if((c= getc(fp))!=EOF&&c!='\n'){
  414. ungetc(c,fp);loc= buffer;err_print("! Input line too long");
  415.  
  416. }
  417. if(c==EOF&&limit==buffer)return(0);
  418.  
  419. return(1);
  420. }
  421.  
  422. /*:9*//*12:*/
  423. #line 238 "common.w"
  424.  
  425. #line 147 "common-p.ch"
  426. static void prime_the_change_buffer(void)
  427. #line 240 "common.w"
  428. {
  429. change_limit= change_buffer;
  430. /*13:*/
  431. #line 252 "common.w"
  432.  
  433. while(1){
  434. change_line++;
  435. if(!input_ln(change_file))return;
  436. if(limit<buffer+2)continue;
  437. if(buffer[0]!='@')continue;
  438. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  439. /*14:*/
  440. #line 270 "common.w"
  441. {
  442. #line 271 "common.w"
  443. if(buffer[1]=='i'){
  444. loc= buffer+2;
  445. err_print("! No includes allowed in change file");
  446.  
  447. }
  448. }
  449.  
  450. /*:14*/
  451. #line 259 "common.w"
  452. ;
  453. if(buffer[1]=='x')break;
  454. if(buffer[1]=='y'||buffer[1]=='z'){
  455. loc= buffer+2;
  456. err_print("! Where is the matching @x?");
  457.  
  458. }
  459. }
  460.  
  461. #line 153 "common-p.ch"
  462. /*:13*/
  463. #line 242 "common.w"
  464. ;
  465. /*15:*/
  466. #line 280 "common.w"
  467.  
  468. do{
  469. change_line++;
  470. if(!input_ln(change_file)){
  471. err_print("! Change file ended after @x");
  472.  
  473. return;
  474. }
  475. }while(limit==buffer);
  476.  
  477. /*:15*/
  478. #line 243 "common.w"
  479. ;
  480. /*16:*/
  481. #line 290 "common.w"
  482.  
  483. {
  484. change_limit= change_buffer-buffer+limit;
  485. strncpy(change_buffer,buffer,limit-buffer+1);
  486. }
  487.  
  488. /*:16*/
  489. #line 244 "common.w"
  490. ;
  491. }
  492.  
  493. /*:12*//*17:*/
  494. #line 318 "common.w"
  495.  
  496. #line 161 "common-p.ch"
  497. static void check_change(void)
  498. #line 320 "common.w"
  499. {
  500. int n= 0;
  501. if(lines_dont_match)return;
  502. change_pending= 0;
  503. if(!changed_module[module_count]){
  504. if_module_start_make_pending(1);
  505. if(!change_pending)changed_module[module_count]= 1;
  506. }
  507. while(1){
  508. changing= 1;print_where= 1;change_line++;
  509. if(!input_ln(change_file)){
  510. err_print("! Change file ended before @y");
  511.  
  512. change_limit= change_buffer;changing= 0;
  513. return;
  514. }
  515. if(limit>buffer+1&&buffer[0]=='@'){
  516. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  517. /*18:*/
  518. #line 355 "common.w"
  519.  
  520. if(buffer[1]=='x'||buffer[1]=='z'){
  521. loc= buffer+2;err_print("! Where is the matching @y?");
  522.  
  523. }
  524. else if(buffer[1]=='y'){
  525. if(n>0){
  526. loc= buffer+2;
  527. printf("\n! Hmm... %d ",n);
  528. err_print("of the preceding lines failed to match");
  529.  
  530. }
  531. return;
  532. }
  533.  
  534. /*:18*/
  535. #line 339 "common.w"
  536. ;
  537. }
  538. /*16:*/
  539. #line 290 "common.w"
  540.  
  541. {
  542. change_limit= change_buffer-buffer+limit;
  543. strncpy(change_buffer,buffer,limit-buffer+1);
  544. }
  545.  
  546. /*:16*/
  547. #line 341 "common.w"
  548. ;
  549. changing= 0;cur_line++;
  550. while(!input_ln(cur_file)){
  551. if(include_depth==0){
  552. err_print("! WEB file ended during a change");
  553.  
  554. input_has_ended= 1;return;
  555. }
  556. include_depth--;cur_line++;
  557. }
  558. if(lines_dont_match)n++;
  559. }
  560. }
  561.  
  562. /*:17*//*19:*/
  563. #line 374 "common.w"
  564.  
  565. #line 167 "common-p.ch"
  566. void reset_input(void)
  567. #line 376 "common.w"
  568. {
  569. limit= buffer;loc= buffer+1;buffer[0]= ' ';
  570. /*20:*/
  571. #line 387 "common.w"
  572.  
  573. if((web_file= fopen(web_file_name,"r"))==NULL){
  574. strcpy(web_file_name,alt_web_file_name);
  575. if((web_file= fopen(web_file_name,"r"))==NULL)
  576. fatal("! Cannot open input file ",web_file_name);
  577. }
  578.  
  579.  
  580. web_file_open= 1;
  581. if((change_file= fopen(change_file_name,"r"))==NULL)
  582. fatal("! Cannot open change file ",change_file_name);
  583.  
  584. /*:20*/
  585. #line 378 "common.w"
  586. ;
  587. include_depth= 0;cur_line= 0;change_line= 0;
  588. changing= 1;prime_the_change_buffer();changing= !changing;
  589. limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
  590. }
  591.  
  592. /*:19*//*22:*/
  593. #line 420 "common.w"
  594.  
  595. #line 173 "common-p.ch"
  596. boolean get_line(void)
  597. #line 422 "common.w"
  598. {
  599. restart:
  600. if(changing)/*25:*/
  601. #line 497 "common.w"
  602. {
  603. change_line++;
  604. if(!input_ln(change_file)){
  605. err_print("! Change file ended without @z");
  606.  
  607. buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
  608. }
  609. if(limit>buffer){
  610. if(change_pending){
  611. if_module_start_make_pending(0);
  612. if(change_pending){
  613. changed_module[module_count]= 1;change_pending= 0;
  614. }
  615. }
  616. *limit= ' ';
  617. if(buffer[0]=='@'){
  618. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  619. #line 515 "common.w"
  620. if(buffer[1]=='x'||buffer[1]=='y'){
  621. loc= buffer+2;err_print("! Where is the matching @z?");
  622.  
  623. }
  624. else if(buffer[1]=='z'){
  625. prime_the_change_buffer();changing= !changing;print_where= 1;
  626. }
  627. }
  628. }
  629. }
  630.  
  631. /*:25*/
  632. #line 424 "common.w"
  633. ;
  634. if(!changing){
  635. /*24:*/
  636. #line 484 "common.w"
  637. {
  638. cur_line++;
  639. while(!input_ln(cur_file)){
  640. print_where= 1;
  641. if(include_depth==0){input_has_ended= 1;break;}
  642. else{fclose(cur_file);include_depth--;cur_line++;}
  643. }
  644. if(!input_has_ended)
  645. if(limit==change_limit-change_buffer+buffer)
  646. if(buffer[0]==change_buffer[0])
  647. if(change_limit>change_buffer)check_change();
  648. }
  649.  
  650. /*:24*/
  651. #line 426 "common.w"
  652. ;
  653. if(changing)goto restart;
  654. }
  655. loc= buffer;*limit= ' ';
  656. if(*buffer=='@'&&(*(buffer+1)=='i'||*(buffer+1)=='I'))
  657. /*23:*/
  658. #line 446 "common.w"
  659. {
  660. #line 447 "common.w"
  661. char*k,*j;
  662. loc= buffer+2;
  663. while(loc<=limit&&(*loc==' '||*loc=='\t'||*loc=='"'))loc++;
  664. if(loc>=limit)err_print("! Include file name not given");
  665.  
  666. else{
  667. if(++include_depth<max_include_depth){
  668. k= cur_file_name;j= loc;
  669. while(*loc!=' '&&*loc!='\t'&&*loc!='"')*k++= *loc++;
  670. *k= '\0';
  671. if((cur_file= fopen(cur_file_name,"r"))==NULL){
  672. #ifdef INCLUDEDIR
  673. #line 194 "common-p.ch"
  674.  strcpy(cur_file_name,getenv("CWEBINCLUDE"));
  675. #line 460 "common.w"
  676. k= cur_file_name+strlen(cur_file_name);
  677. while(*j!=' '&&*j!='\t'&&*j!='"')*k++= *j++;
  678. *k= '\0';
  679. if((cur_file= fopen(cur_file_name,"r"))==NULL){
  680. #line 202 "common-p.ch"
  681. #endif 
  682. #line 465 "common.w"
  683. include_depth--;
  684. err_print("! Cannot open include file");
  685.  
  686. }
  687. #ifdef INCLUDEDIR
  688. else{cur_line= 0;print_where= 1;}
  689. }
  690. #line 209 "common-p.ch"
  691. #endif 
  692. #line 473 "common.w"
  693. else{cur_line= 0;print_where= 1;}
  694. }
  695. else{
  696. include_depth--;
  697. err_print("! Too many nested includes");
  698.  
  699. }
  700. }
  701. goto restart;
  702. }
  703.  
  704. /*:23*/
  705. #line 431 "common.w"
  706. ;
  707. #line 179 "common-p.ch"
  708. return((boolean)!input_has_ended);
  709. #line 433 "common.w"
  710. }
  711.  
  712. /*:22*//*26:*/
  713. #line 529 "common.w"
  714.  
  715. #line 221 "common-p.ch"
  716. void check_complete(void){
  717. #line 531 "common.w"
  718. if(change_limit!=change_buffer){
  719. strncpy(buffer,change_buffer,change_limit-change_buffer+1);
  720. limit= change_limit-change_buffer+buffer;
  721. changing= 1;loc= buffer;
  722. err_print("! Change file entry did not match");
  723.  
  724. }
  725. }
  726.  
  727. /*:26*//*47:*/
  728. #line 851 "common.w"
  729.  
  730. #line 370 "common-p.ch"
  731. void err_print(char*s)
  732. #line 854 "common.w"
  733. {
  734. char*k,*l;
  735. printf(*s=='!'?"\n%s":"%s",s);
  736. if(web_file_open)/*48:*/
  737. #line 870 "common.w"
  738.  
  739. {if(changing)printf(". (l. %d of change file)\n",change_line);
  740. else if(include_depth==0)printf(". (l. %d)\n",cur_line);
  741. else printf(". (l. %d of include file %s)\n",cur_line,cur_file_name);
  742. l= (loc>=limit?limit:loc);
  743. if(l>buffer){
  744. for(k= buffer;k<l;k++)
  745. if(*k=='\t')putchar(' ');
  746. else putchar(*k);
  747. putchar('\n');
  748. for(k= buffer;k<l;k++)putchar(' ');
  749. }
  750. for(k= l;k<limit;k++)putchar(*k);
  751. if(*limit=='|')putchar('|');
  752. putchar(' ');
  753. }
  754.  
  755. /*:48*/
  756. #line 857 "common.w"
  757. ;
  758. update_terminal;mark_error;
  759. }
  760.  
  761. /*:47*//*52:*/
  762. #line 917 "common.w"
  763.  
  764. #line 376 "common-p.ch"
  765. void wrap_up(void){
  766. #line 919 "common.w"
  767. putchar('\n');
  768. #ifdef STAT
  769. if(show_stats)print_stats();
  770. #endif
  771. /*53:*/
  772. #line 928 "common.w"
  773.  
  774. switch(history){
  775. case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
  776. case harmless_message:
  777. printf("(Did you see the warning message above?)\n");break;
  778. case error_message:
  779. printf("(Pardon me, but I think I spotted something wrong.)\n");break;
  780. case fatal_message:printf("(That was a fatal error, my friend.)\n");
  781. }
  782.  
  783. /*:53*/
  784. #line 923 "common.w"
  785. ;
  786. if(history>harmless_message)exit(1);
  787. else exit(0);
  788. }
  789.  
  790. /*:52*//*56:*/
  791. #line 981 "common.w"
  792.  
  793. #line 423 "common-p.ch"
  794. static void scan_args(void)
  795. #line 983 "common.w"
  796. {
  797. char*dot_pos;
  798. char*name_pos;
  799. register char*s;
  800. boolean found_web= 0,found_change= 0,found_out= 0;
  801.  
  802. boolean flag_change;
  803.  
  804. while(--argc>0){
  805. if(**(++argv)=='-'||**argv=='+')/*60:*/
  806. #line 1058 "common.w"
  807.  
  808. {
  809. if(**argv=='-')flag_change= 0;
  810. else flag_change= 1;
  811. for(dot_pos= *argv+1;*dot_pos>'\0';dot_pos++)
  812. flags[*dot_pos]= flag_change;
  813. }
  814.  
  815. /*:60*/
  816. #line 992 "common.w"
  817.  
  818. else{
  819. s= name_pos= *argv;dot_pos= NULL;
  820. while(*s){
  821. if(*s=='.')dot_pos= s++;
  822. else if(*s=='/')dot_pos= NULL,name_pos= ++s;
  823. else s++;
  824. }
  825. if(!found_web)/*57:*/
  826. #line 1018 "common.w"
  827.  
  828. {
  829. if(s-*argv>max_file_name_length-5)
  830. /*62:*/
  831. #line 1077 "common.w"
  832. fatal("! Filename too long\n",*argv);
  833.  
  834. /*:62*/
  835. #line 1021 "common.w"
  836. ;
  837. if(dot_pos==NULL)
  838. sprintf(web_file_name,"%s.w",*argv);
  839. else{
  840. strcpy(web_file_name,*argv);
  841. *dot_pos= 0;
  842. }
  843. sprintf(alt_web_file_name,"%s.web",*argv);
  844. sprintf(tex_file_name,"%s.tex",name_pos);
  845. sprintf(C_file_name,"%s.c",name_pos);
  846. found_web= 1;
  847. }
  848.  
  849. /*:57*/
  850. #line 1001 "common.w"
  851.  
  852. else if(!found_change)/*58:*/
  853. #line 1034 "common.w"
  854.  
  855. {
  856. if(s-*argv>max_file_name_length-4)
  857. /*62:*/
  858. #line 1077 "common.w"
  859. fatal("! Filename too long\n",*argv);
  860.  
  861. /*:62*/
  862. #line 1037 "common.w"
  863. ;
  864. if(dot_pos==NULL)
  865. sprintf(change_file_name,"%s.ch",*argv);
  866. else strcpy(change_file_name,*argv);
  867. found_change= 1;
  868. }
  869.  
  870. /*:58*/
  871. #line 1002 "common.w"
  872.  
  873. else if(!found_out)/*59:*/
  874. #line 1044 "common.w"
  875.  
  876. {
  877. if(s-*argv>max_file_name_length-5)
  878. /*62:*/
  879. #line 1077 "common.w"
  880. fatal("! Filename too long\n",*argv);
  881.  
  882. /*:62*/
  883. #line 1047 "common.w"
  884. ;
  885. if(dot_pos==NULL){
  886. sprintf(tex_file_name,"%s.tex",*argv);
  887. sprintf(C_file_name,"%s.c",*argv);
  888. }else{
  889. strcpy(tex_file_name,*argv);
  890. strcpy(C_file_name,*argv);
  891. }
  892. found_out= 1;
  893. }
  894.  
  895. /*:59*/
  896. #line 1003 "common.w"
  897.  
  898. else/*61:*/
  899. #line 1066 "common.w"
  900.  
  901. {
  902. if(program==tangle)
  903. #line 446 "common-p.ch"
  904. fatal(
  905. "! Usage: ctangle [options] webfile[.w] [changefile[.ch] [outfile[.c]]]\n"
  906. "Options are (+ turns on, - turns off, default in brackets):\n"
  907. "b print banner line [+]\n"
  908. "h print happy message [+]\n"
  909. "p give progress reports [+]\n"
  910. "s show statistics (only when compiled with STAT defined) [-]\n"
  911. ,"")
  912. #ifdef __SASC
  913. else fatal(
  914. "! Usage: cweave [options] webfile[.w] [changefile[.ch] [outfile[.tex]]]\n"
  915. "Options are (+ turns on, - turns off, default in brackets):\n"
  916. "b print banner line [+]\n"
  917. "f force line breaks [+]\n"
  918. "h print happy message [+]\n"
  919. "p give progress reports [+]\n"
  920. "a use AMIGA specific keywords [+]\n"
  921. "g use German macros as of ccwebmacg.tex [+]\n"
  922. "s show statistics (only when compiled with STAT defined) [-]\n"
  923. "x include indexes and table of contents [+]\n"
  924. ,"");
  925. #else
  926. else fatal(
  927. "! Usage: cweave [options] webfile[.w] [changefile[.ch] [outfile[.tex]]]\n"
  928. "Options are (+ turns on, - turns off, default in brackets):\n"
  929. "b print banner line [+]\n"
  930. "f force line breaks [+]\n"
  931. "h print happy message [+]\n"
  932. "p give progress reports [+]\n"
  933. "g use German macros as of ccwebmacg.tex [+]\n"
  934. "s show statistics (only when compiled with STAT defined) [-]\n"
  935. "x include indexes and table of contents [+]\n"
  936. ,"");
  937. #endif
  938. #line 1075 "common.w"
  939. }
  940.  
  941. /*:61*/
  942. #line 1004 "common.w"
  943. ;
  944. }
  945. }
  946. if(!found_web)/*61:*/
  947. #line 1066 "common.w"
  948.  
  949. {
  950. if(program==tangle)
  951. #line 446 "common-p.ch"
  952. fatal(
  953. "! Usage: ctangle [options] webfile[.w] [changefile[.ch] [outfile[.c]]]\n"
  954. "Options are (+ turns on, - turns off, default in brackets):\n"
  955. "b print banner line [+]\n"
  956. "h print happy message [+]\n"
  957. "p give progress reports [+]\n"
  958. "s show statistics (only when compiled with STAT defined) [-]\n"
  959. ,"")
  960. #ifdef __SASC
  961. else fatal(
  962. "! Usage: cweave [options] webfile[.w] [changefile[.ch] [outfile[.tex]]]\n"
  963. "Options are (+ turns on, - turns off, default in brackets):\n"
  964. "b print banner line [+]\n"
  965. "f force line breaks [+]\n"
  966. "h print happy message [+]\n"
  967. "p give progress reports [+]\n"
  968. "a use AMIGA specific keywords [+]\n"
  969. "g use German macros as of ccwebmacg.tex [+]\n"
  970. "s show statistics (only when compiled with STAT defined) [-]\n"
  971. "x include indexes and table of contents [+]\n"
  972. ,"");
  973. #else
  974. else fatal(
  975. "! Usage: cweave [options] webfile[.w] [changefile[.ch] [outfile[.tex]]]\n"
  976. "Options are (+ turns on, - turns off, default in brackets):\n"
  977. "b print banner line [+]\n"
  978. "f force line breaks [+]\n"
  979. "h print happy message [+]\n"
  980. "p give progress reports [+]\n"
  981. "g use German macros as of ccwebmacg.tex [+]\n"
  982. "s show statistics (only when compiled with STAT defined) [-]\n"
  983. "x include indexes and table of contents [+]\n"
  984. ,"");
  985. #endif
  986. #line 1075 "common.w"
  987. }
  988.  
  989. /*:61*/
  990. #line 1007 "common.w"
  991. ;
  992. #line 429 "common-p.ch"
  993. #if defined( __TURBOC__ )
  994. if(!found_change)strcpy(change_file_name,"nul");
  995. #elif defined( __SASC )
  996. if(!found_change)strcpy(change_file_name,"NIL:");
  997. #else
  998. if(!found_change)strcpy(change_file_name,"/dev/null");
  999. #endif
  1000. #line 1009 "common.w"
  1001. }
  1002.  
  1003. /*:56*//*67:*/
  1004. #line 493 "common-p.ch"
  1005.  
  1006. #ifdef __TURBOC__
  1007. void far*allocsafe(unsigned long nunits,unsigned long unitsz)
  1008. {
  1009. void far*p= farcalloc(nunits,unitsz);
  1010. if(p==NULL)fatal("","! Memory allocation failure");
  1011.  
  1012. return p;
  1013. }
  1014. #endif
  1015.  
  1016. /*:67*/
  1017. #line 127 "common-p.ch"
  1018.  
  1019. #line 61 "common.w"
  1020.  
  1021. /*:1*//*34:*/
  1022. #line 617 "common.w"
  1023. name_pointer
  1024. #line 283 "common-p.ch"
  1025.  id_lookup(char*first,char*last,char t)
  1026.  
  1027.  
  1028.  
  1029.  
  1030. #line 622 "common.w"
  1031. {
  1032. char*i= first;
  1033. int h;
  1034. int l;
  1035. name_pointer p;
  1036. if(last==NULL)for(last= first;*last!='\0';last++);
  1037. l= last-first;
  1038. /*35:*/
  1039. #line 639 "common.w"
  1040.  
  1041. h= *i;while(++i<last)h= (h+h+*i)%hash_size;
  1042.  
  1043. /*:35*/
  1044. #line 629 "common.w"
  1045. ;
  1046. /*36:*/
  1047. #line 645 "common.w"
  1048.  
  1049. p= hash[h];
  1050. while(p&&!names_match(p,first,l,t))p= p->link;
  1051. if(p==NULL){
  1052. p= name_ptr;
  1053. p->link= hash[h];hash[h]= p;
  1054. }
  1055.  
  1056. /*:36*/
  1057. #line 630 "common.w"
  1058. ;
  1059. if(p==name_ptr)/*37:*/
  1060. #line 657 "common.w"
  1061. {
  1062. if(byte_ptr+l>byte_mem_end)overflow("byte memory");
  1063. if(name_ptr>=name_dir_end)overflow("name");
  1064. strncpy(byte_ptr,first,l);
  1065. (++name_ptr)->byte_start= byte_ptr+= l;
  1066. if(program==weave)init_p(p,t);
  1067. }
  1068.  
  1069. /*:37*/
  1070. #line 631 "common.w"
  1071. ;
  1072. return(p);
  1073. }
  1074.  
  1075. /*:34*//*41:*/
  1076. #line 710 "common.w"
  1077. name_pointer
  1078. #line 315 "common-p.ch"
  1079.  mod_lookup(char*k,char*l)
  1080.  
  1081.  
  1082. #line 714 "common.w"
  1083. {
  1084. short c= greater;
  1085. name_pointer p= root;
  1086. name_pointer q= name_dir;
  1087. while(p){
  1088. c= web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start);
  1089. q= p;
  1090. switch(c){
  1091. case less:p= p->llink;continue;
  1092. case greater:p= p->rlink;continue;
  1093. case equal:return p;
  1094. default:err_print("! Incompatible section names");return name_dir;
  1095.  
  1096. }
  1097. }
  1098. return(install_node(q,c,k,l-k+1));
  1099. }
  1100.  
  1101. /*:41*//*42:*/
  1102. #line 735 "common.w"
  1103.  
  1104. #line 327 "common-p.ch"
  1105. static short web_strcmp(char*j,char*j1,char HUGE*k,char HUGE*k1)
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111. #line 741 "common.w"
  1112. {
  1113. while(k<k1&&j<j1&&*j==*k)k++,j++;
  1114. if(k==k1)if(j==j1)return equal;
  1115. else return extension;
  1116. else if(j==j1)return prefix;
  1117. else if(*j<*k)return less;
  1118. else return greater;
  1119. }
  1120.  
  1121. /*:42*//*43:*/
  1122. #line 758 "common.w"
  1123. name_pointer
  1124. #line 342 "common-p.ch"
  1125.  static install_node(name_pointer parent,int c,char*j,int name_len)
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131. #line 764 "common.w"
  1132. {
  1133. name_pointer node= name_ptr;
  1134. if(byte_ptr+name_len>byte_mem_end)overflow("byte memory");
  1135. if(name_ptr==name_dir_end)overflow("name");
  1136. if(c==less)parent->llink= node;else parent->rlink= node;
  1137. node->llink= NULL;node->rlink= NULL;
  1138. init_node(node);
  1139. strncpy(byte_ptr,j,name_len);
  1140. (++name_ptr)->byte_start= byte_ptr+= name_len;
  1141. return(node);
  1142. }
  1143.  
  1144. /*:43*//*44:*/
  1145. #line 782 "common.w"
  1146. name_pointer
  1147. #line 355 "common-p.ch"
  1148.  prefix_lookup(char*k,char*l)
  1149.  
  1150.  
  1151. #line 786 "common.w"
  1152. {
  1153. short c= greater;
  1154. short count= 0;
  1155. name_pointer p= root;
  1156. name_pointer q= NULL;
  1157.  
  1158. name_pointer r= name_dir;
  1159. while(p){
  1160. c= web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start);
  1161. switch(c){
  1162. case less:p= p->llink;break;
  1163. case greater:p= p->rlink;break;
  1164. default:r= p;count++;q= p->rlink;p= p->llink;
  1165. }
  1166. if(p==NULL){
  1167. p= q;q= NULL;
  1168. }
  1169. }
  1170. if(count==0)err_print("! Name does not match");
  1171.  
  1172. if(count>1)err_print("! Ambiguous prefix");
  1173.  
  1174. return(r);
  1175. }
  1176.  
  1177. /*:44*/
  1178.