home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d551 / cweb.lha / CWeb / cweb2.lzh / cweb / SAVEcommon.c < prev    next >
C/C++ Source or Header  |  1990-12-14  |  16KB  |  920 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 max_modules 2000 \
  32.  \
  33.  
  34. #define max_bytes 90000 \
  35.  
  36. #define max_names 4000 \
  37.  \
  38.  
  39. #define length(c)(c+1)->byte_start-(c)->byte_start
  40. #define print_id(c)term_write((c)->byte_start,length((c))) \
  41.  \
  42.  
  43. #define hash_size 353 \
  44.  
  45. #define llink link
  46. #define rlink dummy.Rlink
  47. #define root name_dir->rlink \
  48.  \
  49.  
  50. #define less 0
  51. #define equal 1
  52. #define greater 2
  53. #define prefix 3
  54. #define extension 4 \
  55.  
  56. #define spotless 0
  57. #define harmless_message 1
  58. #define error_message 2
  59. #define fatal_message 3
  60. #define mark_harmless {if(history==spotless)history= harmless_message;}
  61. #define mark_error history= error_message \
  62.  
  63. #define fatal(s,t){ \
  64. printf(s);err_print(t); \
  65. history= fatal_message;wrap_up(); \
  66. } \
  67.  
  68. #define confusion(s)fatal("! This can't happen: ",s) \
  69.  \
  70.  
  71. #define overflow(t){ \
  72. printf("\n! Sorry, %s capacity exceeded",t);fatal("",""); \
  73. } \
  74.  \
  75.  
  76. #define show_banner flags['b']
  77. #define show_progress flags['p']
  78. #define show_stats flags['s']
  79. #define show_happiness flags['h'] \
  80.  
  81. #define update_terminal fflush(stdout) \
  82.  
  83. #define new_line putchar('\n')
  84. #define putxchar putchar
  85. #define term_write(a,b)fflush(stdout),write(1,a,b)
  86. #define line_write(c)write(fileno(C_file),c)
  87. #define C_printf(c,a)fprintf(C_file,c,a)
  88. #define C_putc(c)putc(c,C_file) \
  89.  
  90. /*1:*/
  91. #line 59 "common.w"
  92.  
  93. /*5:*/
  94. #line 101 "common.w"
  95.  
  96. #include <ctype.h>
  97.  
  98. /*:5*//*8:*/
  99. #line 157 "common.w"
  100.  
  101. #include <stdio.h>
  102.  
  103. /*:8*/
  104. #line 60 "common.w"
  105.  
  106. /*2:*/
  107. #line 73 "common.w"
  108.  
  109. typedef short boolean;
  110. boolean program;
  111.  
  112. /*:2*//*7:*/
  113. #line 151 "common.w"
  114.  
  115. char buffer[long_buf_size];
  116. char*buffer_end= buffer+buf_size-2;
  117. char*limit= buffer;
  118. char*loc= buffer;
  119.  
  120. /*:7*//*10:*/
  121. #line 206 "common.w"
  122.  
  123. int include_depth;
  124. FILE*file[max_include_depth];
  125. FILE*change_file;
  126. char file_name[max_include_depth][max_file_name_length];
  127.  
  128. char change_file_name[max_file_name_length];
  129. char alt_web_file_name[max_file_name_length];
  130. int line[max_include_depth];
  131. int change_line;
  132. boolean input_has_ended;
  133. boolean changing;
  134. boolean web_file_open= 0;
  135.  
  136. /*:10*//*21:*/
  137. #line 401 "common.w"
  138.  
  139. typedef unsigned short sixteen_bits;
  140. sixteen_bits module_count;
  141. boolean changed_module[max_modules];
  142. boolean print_where= 0;
  143.  
  144. /*:21*//*27:*/
  145. #line 522 "common.w"
  146.  
  147. typedef struct name_info{
  148. char*byte_start;
  149. /*31:*/
  150. #line 560 "common.w"
  151.  
  152. struct name_info*link;
  153.  
  154. /*:31*//*38:*/
  155. #line 650 "common.w"
  156.  
  157. union{
  158. struct name_info*Rlink;
  159.  
  160. sixteen_bits Ilk;
  161. }dummy;
  162.  
  163. /*:38*//*45:*/
  164. #line 790 "common.w"
  165.  
  166. char*equiv_or_xref;
  167.  
  168. /*:45*/
  169. #line 525 "common.w"
  170.  
  171. }name_info;
  172. typedef name_info*name_pointer;
  173. char byte_mem[max_bytes];
  174. char*byte_mem_end= byte_mem+max_bytes-1;
  175. name_info name_dir[max_names];
  176. name_pointer name_dir_end= name_dir+max_names-1;
  177.  
  178. /*:27*//*29:*/
  179. #line 546 "common.w"
  180.  
  181. name_pointer name_ptr;
  182. char*byte_ptr;
  183.  
  184. /*:29*//*32:*/
  185. #line 573 "common.w"
  186.  
  187. typedef name_pointer*hash_pointer;
  188. name_pointer hash[hash_size];
  189. hash_pointer hash_end= hash+hash_size-1;
  190. hash_pointer h;
  191.  
  192. /*:32*//*46:*/
  193. #line 810 "common.w"
  194.  
  195. int history= spotless;
  196.  
  197. /*:46*//*54:*/
  198. #line 921 "common.w"
  199.  
  200. int argc;
  201. char**argv;
  202. char C_file_name[max_file_name_length];
  203. char tex_file_name[max_file_name_length];
  204. boolean flags[128];
  205.  
  206. /*:54*//*63:*/
  207. #line 1033 "common.w"
  208.  
  209. FILE*C_file;
  210. FILE*tex_file;
  211.  
  212. /*:63*/
  213. #line 61 "common.w"
  214.  
  215. /*3:*/
  216. #line 83 "common.w"
  217. int phase;
  218.  
  219. /*:3*//*11:*/
  220. #line 231 "common.w"
  221.  
  222. char change_buffer[buf_size];
  223. char*change_limit;
  224.  
  225. /*:11*//*40:*/
  226. #line 676 "common.w"
  227.  
  228. name_pointer install_node();
  229.  
  230. /*:40*/
  231. #line 62 "common.w"
  232.  
  233. /*4:*/
  234. #line 89 "common.w"
  235.  
  236. common_init()
  237. {
  238. /*30:*/
  239. #line 550 "common.w"
  240.  
  241. name_dir->byte_start= byte_ptr= byte_mem;
  242. name_ptr= name_dir+1;
  243. name_ptr->byte_start= byte_mem;
  244.  
  245. /*:30*//*33:*/
  246. #line 581 "common.w"
  247.  
  248. for(h= hash;h<=hash_end;*h++= NULL);
  249.  
  250. /*:33*//*39:*/
  251. #line 657 "common.w"
  252.  
  253. root= NULL;
  254.  
  255. /*:39*/
  256. #line 92 "common.w"
  257. ;
  258. /*55:*/
  259. #line 932 "common.w"
  260.  
  261. show_banner= show_happiness= show_progress= 1;
  262.  
  263. /*:55*/
  264. #line 93 "common.w"
  265. ;
  266. /*64:*/
  267. #line 1037 "common.w"
  268.  
  269. scan_args();
  270. if(program==tangle){
  271. if((C_file= fopen(C_file_name,"w"))==NULL)
  272. fatal("! Cannot open output file ",C_file_name);
  273.  
  274. }
  275. else{
  276. if((tex_file= fopen(tex_file_name,"w"))==NULL)
  277. fatal("! Cannot open output file ",tex_file_name);
  278. }
  279.  
  280. /*:64*/
  281. #line 94 "common.w"
  282. ;
  283. }
  284.  
  285. /*:4*//*9:*/
  286. #line 164 "common.w"
  287.  
  288. input_ln(fp)
  289. FILE*fp;
  290. {
  291. register int c;
  292. register char*k;
  293. if(feof(fp))return(0);
  294. limit= k= buffer;
  295. while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
  296. if((*(k++)= c)!=' ')limit= k;
  297. if(k>buffer_end)
  298. if((c= getc(fp))!=EOF&&c!='\n'){
  299. ungetc(c,fp);loc= buffer;err_print("! Input line too long");
  300.  
  301. }
  302. if(c==EOF&&limit==buffer)return(0);
  303.  
  304. return(1);
  305. }
  306.  
  307. /*:9*//*12:*/
  308. #line 241 "common.w"
  309.  
  310. prime_the_change_buffer()
  311. {
  312. change_limit= change_buffer;
  313. /*13:*/
  314. #line 255 "common.w"
  315.  
  316. while(1){
  317. change_line++;
  318. if(!input_ln(change_file))return;
  319. if(limit<buffer+2)continue;
  320. if(buffer[0]!='@')continue;
  321. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  322. /*14:*/
  323. #line 273 "common.w"
  324. {
  325. if(buffer[1]=='i'){
  326. loc= buffer+2;
  327. err_print("! No includes allowed in change file");
  328.  
  329. }
  330. }
  331.  
  332. /*:14*/
  333. #line 262 "common.w"
  334. ;
  335. if(buffer[1]=='x')break;
  336. if(buffer[1]=='y'||buffer[1]=='z'){
  337. loc= buffer+2;
  338. err_print("! Where is the matching @x?");
  339.  
  340. }
  341. }
  342.  
  343. /*:13*/
  344. #line 245 "common.w"
  345. ;
  346. /*15:*/
  347. #line 283 "common.w"
  348.  
  349. do{
  350. change_line++;
  351. if(!input_ln(change_file)){
  352. err_print("! Change file ended after @x");
  353.  
  354. return;
  355. }
  356. }while(limit==buffer);
  357.  
  358. /*:15*/
  359. #line 246 "common.w"
  360. ;
  361. /*16:*/
  362. #line 293 "common.w"
  363.  
  364. {
  365. change_limit= change_buffer-buffer+limit;
  366. strncpy(change_buffer,buffer,limit-buffer+1);
  367. }
  368.  
  369. /*:16*/
  370. #line 247 "common.w"
  371. ;
  372. }
  373.  
  374. /*:12*//*17:*/
  375. #line 311 "common.w"
  376.  
  377. check_change()
  378. {
  379. int n= 0;
  380. if(lines_dont_match)return;
  381. while(1){
  382. changing= 1;print_where= 1;change_line++;
  383. if(!input_ln(change_file)){
  384. err_print("! Change file ended before @y");
  385.  
  386. change_limit= change_buffer;changing= 0;
  387. return;
  388. }
  389. if(limit>buffer+1&&buffer[0]=='@'){
  390. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  391. /*14:*/
  392. #line 273 "common.w"
  393. {
  394. if(buffer[1]=='i'){
  395. loc= buffer+2;
  396. err_print("! No includes allowed in change file");
  397.  
  398. }
  399. }
  400.  
  401. /*:14*/
  402. #line 326 "common.w"
  403. ;
  404. /*18:*/
  405. #line 344 "common.w"
  406.  
  407. if(buffer[1]=='x'||buffer[1]=='z'){
  408. loc= buffer+2;err_print("! Where is the matching @y?");
  409.  
  410. }
  411. else if(buffer[1]=='y'){
  412. if(n>0){
  413. loc= buffer+2;
  414. printf("\n! Hmm... %d ",n);
  415. err_print("of the preceding lines failed to match");
  416.  
  417. }
  418. return;
  419. }
  420.  
  421. /*:18*/
  422. #line 328 "common.w"
  423. ;
  424. }
  425. /*16:*/
  426. #line 293 "common.w"
  427.  
  428. {
  429. change_limit= change_buffer-buffer+limit;
  430. strncpy(change_buffer,buffer,limit-buffer+1);
  431. }
  432.  
  433. /*:16*/
  434. #line 330 "common.w"
  435. ;
  436. changing= 0;cur_line++;
  437. while(!input_ln(cur_file)){
  438. if(include_depth==0){
  439. err_print("! WEB file ended during a change");
  440.  
  441. input_has_ended= 1;return;
  442. }
  443. include_depth--;cur_line++;
  444. }
  445. if(lines_dont_match)n++;
  446. }
  447. }
  448.  
  449. /*:17*//*19:*/
  450. #line 363 "common.w"
  451.  
  452. reset_input()
  453. {
  454. limit= buffer;loc= buffer+1;buffer[0]= ' ';
  455. /*20:*/
  456. #line 376 "common.w"
  457.  
  458. if((web_file= fopen(web_file_name,"r"))==NULL){
  459. strcpy(web_file_name,alt_web_file_name);
  460. if((web_file= fopen(web_file_name,"r"))==NULL)
  461. fatal("! Cannot open input file ",web_file_name);
  462. }
  463.  
  464.  
  465. web_file_open= 1;
  466. if((change_file= fopen(change_file_name,"r"))==NULL)
  467. fatal("! Cannot open change file ",change_file_name);
  468.  
  469. /*:20*/
  470. #line 367 "common.w"
  471. ;
  472. cur_line= 0;change_line= 0;include_depth= 0;
  473. changing= 1;prime_the_change_buffer();changing= !changing;
  474. limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
  475. }
  476.  
  477. /*:19*//*22:*/
  478. #line 407 "common.w"
  479.  
  480. get_line()
  481. {
  482. restart:
  483. if(changing)changed_module[module_count]= 1;
  484. else/*24:*/
  485. #line 461 "common.w"
  486. {
  487. cur_line++;
  488. while(!input_ln(cur_file)){
  489. print_where= 1;
  490. if(include_depth==0){input_has_ended= 1;break;}
  491. else{fclose(cur_file);include_depth--;cur_line++;}
  492. }
  493. if(!input_has_ended)
  494. if(limit==change_limit-change_buffer+buffer)
  495. if(buffer[0]==change_buffer[0])
  496. if(change_limit>change_buffer)check_change();
  497. }
  498.  
  499. /*:24*/
  500. #line 412 "common.w"
  501. ;
  502. if(changing){
  503. /*25:*/
  504. #line 474 "common.w"
  505. {
  506. change_line++;
  507. if(!input_ln(change_file)){
  508. err_print("! Change file ended without @z");
  509.  
  510. buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
  511. }
  512. if(limit>buffer+1)
  513. if(buffer[0]=='@'){
  514. if(isupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  515. /*14:*/
  516. #line 273 "common.w"
  517. {
  518. if(buffer[1]=='i'){
  519. loc= buffer+2;
  520. err_print("! No includes allowed in change file");
  521.  
  522. }
  523. }
  524.  
  525. /*:14*/
  526. #line 484 "common.w"
  527. ;
  528. if(buffer[1]=='x'||buffer[1]=='y'){
  529. loc= buffer+2;err_print("! Where is the matching @z?");
  530.  
  531. }
  532. else if(buffer[1]=='z'){
  533. prime_the_change_buffer();changing= !changing;print_where= 1;
  534. }
  535. }
  536. }
  537.  
  538. /*:25*/
  539. #line 414 "common.w"
  540. ;
  541. if(!changing){
  542. changed_module[module_count]= 1;goto restart;
  543. }
  544. }
  545. loc= buffer;*limit= ' ';
  546. if(*buffer=='@'&&(*(buffer+1)=='i'||*(buffer+1)=='I'))
  547. /*23:*/
  548. #line 434 "common.w"
  549. {
  550. char*k,*j;
  551. loc= buffer+2;
  552. while(loc<=limit&&(*loc==' '||*loc=='\t'||*loc=='"'))loc++;
  553. if(loc>=limit)err_print("! Include file name not given");
  554.  
  555. else{
  556. if(++include_depth<max_include_depth){
  557. k= cur_file_name;j= loc;
  558. while(*loc!=' '&&*loc!='\t'&&*loc!='"')*k++= *loc++;
  559. *k= '\0';
  560. if((cur_file= fopen(cur_file_name,"r"))==NULL){
  561. include_depth--;
  562. err_print("! Cannot open include file");
  563.  
  564. }
  565. else{cur_line= 0;print_where= 1;}
  566. }
  567. else{
  568. include_depth--;
  569. err_print("! Too many nested includes");
  570.  
  571. }
  572. }
  573. goto restart;
  574. }
  575.  
  576. /*:23*/
  577. #line 421 "common.w"
  578. ;
  579. return(!input_has_ended);
  580. }
  581.  
  582. /*:22*//*26:*/
  583. #line 498 "common.w"
  584.  
  585. check_complete(){
  586. if(change_limit!=change_buffer){
  587. strncpy(buffer,change_buffer,change_limit-change_buffer+1);
  588. limit= change_limit-change_buffer+buffer;
  589. changing= 1;loc= buffer;
  590. err_print("! Change file entry did not match");
  591.  
  592. }
  593. }
  594.  
  595. /*:26*//*47:*/
  596. #line 820 "common.w"
  597.  
  598. err_print(s)
  599. char*s;
  600. {
  601. char*k,*l;
  602. printf(*s=='!'?"\n%s":"%s",s);
  603. if(web_file_open)/*48:*/
  604. #line 839 "common.w"
  605.  
  606. {if(changing)printf(". (l. %d of change file)\n",change_line);
  607. else if(include_depth==0)printf(". (l. %d)\n",cur_line);
  608. else printf(". (l. %d of include file %s)\n",cur_line,cur_file_name);
  609. l= (loc>=limit?limit:loc);
  610. if(l>buffer){
  611. for(k= buffer;k<l;k++)
  612. if(*k=='\t')putchar(' ');
  613. else putchar(*k);
  614. putchar('\n');
  615. for(k= buffer;k<l;k++)putchar(' ');
  616. }
  617. for(k= l;k<limit;k++)putchar(*k);
  618. if(*limit=='|')putchar('|');
  619. putchar(' ');
  620. }
  621.  
  622. /*:48*/
  623. #line 826 "common.w"
  624. ;
  625. update_terminal;mark_error;
  626. }
  627.  
  628. /*:47*//*52:*/
  629. #line 886 "common.w"
  630.  
  631. wrap_up(){
  632. putchar('\n');
  633. #ifdef STAT
  634. if(show_stats)print_stats();
  635. #endif
  636. /*53:*/
  637. #line 897 "common.w"
  638.  
  639. switch(history){
  640. case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
  641. case harmless_message:
  642. printf("(Did you see the warning message above?)\n");break;
  643. case error_message:
  644. printf("(Pardon me, but I think I spotted something wrong.)\n");break;
  645. case fatal_message:printf("(That was a fatal error, my friend.)\n");
  646. }
  647.  
  648. /*:53*/
  649. #line 892 "common.w"
  650. ;
  651. if(history>harmless_message)exit(1);
  652. else exit(0);
  653. }
  654.  
  655. /*:52*//*56:*/
  656. #line 948 "common.w"
  657.  
  658. char*index(s,c)
  659. char*s;
  660. char c;
  661. {
  662. while(*s!=c&&*s!='\0')
  663. s++;
  664. if(*s=='\0')return NULL;
  665. return s;
  666. }
  667.  
  668. scan_args()
  669. {
  670. char*dot_pos;
  671. boolean found_web= 0,found_change= 0;
  672. boolean flag_change;
  673.  
  674. while(--argc>0){
  675. if(**(++argv)!='-'&&**argv!='+'){
  676. if(!found_web)/*57:*/
  677. #line 985 "common.w"
  678.  
  679. {
  680. if(strlen(*argv)>max_file_name_length-5)
  681. /*62:*/
  682. #line 1028 "common.w"
  683. fatal("! Filename too long\n",*argv);
  684.  
  685. /*:62*/
  686. #line 988 "common.w"
  687. ;
  688. if((dot_pos= index(*argv,'.'))==NULL)
  689. sprintf(web_file_name,"%s.w",*argv);
  690. else{
  691. sprintf(web_file_name,"%s",*argv);
  692. *dot_pos= 0;
  693. }
  694. sprintf(alt_web_file_name,"%s.web",*argv);
  695. sprintf(tex_file_name,"%s.tex",*argv);
  696. sprintf(C_file_name,"%s.c",*argv);
  697. found_web= 1;
  698. }
  699.  
  700. /*:57*/
  701. #line 968 "common.w"
  702.  
  703. else if(!found_change)/*58:*/
  704. #line 1001 "common.w"
  705.  
  706. {
  707. if(strlen(*argv)>max_file_name_length-5)
  708. /*62:*/
  709. #line 1028 "common.w"
  710. fatal("! Filename too long\n",*argv);
  711.  
  712. /*:62*/
  713. #line 1004 "common.w"
  714. ;
  715. if((dot_pos= index(*argv,'.'))==NULL)
  716. sprintf(change_file_name,"%s.ch",*argv);
  717. else sprintf(change_file_name,"%s",*argv);
  718. found_change= 1;
  719. }
  720.  
  721. /*:58*/
  722. #line 969 "common.w"
  723.  
  724. else/*61:*/
  725. #line 1021 "common.w"
  726.  
  727. {
  728. if(program==tangle)
  729. fatal("! Usage: tangle [options] webfile[.w] [changefile[.ch]]\n","")
  730. else fatal("! Usage: weave [options] webfile[.w] [changefile[.ch]]\n","");
  731. }
  732.  
  733. /*:61*/
  734. #line 970 "common.w"
  735. ;
  736. }
  737. else/*60:*/
  738. #line 1013 "common.w"
  739.  
  740. {
  741. if(**argv=='-')flag_change= 0;
  742. else flag_change= 1;
  743. for(dot_pos= *argv+1;*dot_pos>'\0';dot_pos++)
  744. flags[*dot_pos]= flag_change;
  745. }
  746.  
  747. /*:60*/
  748. #line 972 "common.w"
  749. ;
  750. }
  751. if(!found_web)/*61:*/
  752. #line 1021 "common.w"
  753.  
  754. {
  755. if(program==tangle)
  756. fatal("! Usage: tangle [options] webfile[.w] [changefile[.ch]]\n","")
  757. else fatal("! Usage: weave [options] webfile[.w] [changefile[.ch]]\n","");
  758. }
  759.  
  760. /*:61*/
  761. #line 974 "common.w"
  762. ;
  763. if(!found_change)/*59:*/
  764. #line 1011 "common.w"
  765. strcpy(change_file_name,"/dev/null");
  766.  
  767. /*:59*/
  768. #line 975 "common.w"
  769. ;
  770. }
  771.  
  772. /*:56*/
  773. #line 63 "common.w"
  774. ;
  775.  
  776. /*:1*//*34:*/
  777. #line 586 "common.w"
  778. name_pointer
  779. id_lookup(first,last,t)
  780. char*first;
  781. char*last;
  782. sixteen_bits t;
  783. {
  784. char*i= first;
  785. int h;
  786. int l;
  787. name_pointer p;
  788. if(last==NULL)for(last= first;*last!='\0';last++);
  789. l= last-first;
  790. /*35:*/
  791. #line 608 "common.w"
  792.  
  793. h= *i;while(++i<last)h= (h+h+*i)%hash_size;
  794.  
  795. /*:35*/
  796. #line 598 "common.w"
  797. ;
  798. /*36:*/
  799. #line 614 "common.w"
  800.  
  801. p= hash[h];
  802. while(p&&!names_match(p,first,l,t))p= p->link;
  803. if(p==NULL){
  804. p= name_ptr;
  805. p->link= hash[h];hash[h]= p;
  806. }
  807.  
  808. /*:36*/
  809. #line 599 "common.w"
  810. ;
  811. if(p==name_ptr)/*37:*/
  812. #line 626 "common.w"
  813. {
  814. if(byte_ptr+l>byte_mem_end)overflow("byte memory");
  815. if(name_ptr>=name_dir_end)overflow("name");
  816. strncpy(byte_ptr,first,l);
  817. (++name_ptr)->byte_start= byte_ptr+= l;
  818. if(program==weave)init_p(p,t);
  819. }
  820.  
  821. /*:37*/
  822. #line 600 "common.w"
  823. ;
  824. return(p);
  825. }
  826.  
  827. /*:34*//*41:*/
  828. #line 679 "common.w"
  829. name_pointer
  830. mod_lookup(k,l)
  831. char*k;
  832. char*l;
  833. {
  834. short c= greater;
  835. name_pointer p= root;
  836. name_pointer q= name_dir;
  837. while(p){
  838. c= web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start);
  839. q= p;
  840. switch(c){
  841. case less:p= p->llink;continue;
  842. case greater:p= p->rlink;continue;
  843. case equal:return p;
  844. default:err_print("! Incompatible section names");return name_dir;
  845.  
  846. }
  847. }
  848. return(install_node(q,c,k,l-k+1));
  849. }
  850.  
  851. /*:41*//*42:*/
  852. #line 704 "common.w"
  853.  
  854. web_strcmp(j,j1,k,k1)
  855. char*j;
  856. char*j1;
  857. char*k;
  858. char*k1;
  859. {
  860. while(k<k1&&j<j1&&*j==*k)k++,j++;
  861. if(k==k1)if(j==j1)return equal;
  862. else return extension;
  863. else if(j==j1)return prefix;
  864. else if(*j<*k)return less;
  865. else return greater;
  866. }
  867.  
  868. /*:42*//*43:*/
  869. #line 727 "common.w"
  870. name_pointer
  871. install_node(parent,c,j,name_len)
  872. name_pointer parent;
  873. int c;
  874. char*j;
  875. int name_len;
  876. {
  877. name_pointer node= name_ptr;
  878. if(byte_ptr+name_len>byte_mem_end)overflow("byte memory");
  879. if(name_ptr==name_dir_end)overflow("name");
  880. if(c==less)parent->llink= node;else parent->rlink= node;
  881. node->llink= NULL;node->rlink= NULL;
  882. init_node(node);
  883. strncpy(byte_ptr,j,name_len);
  884. (++name_ptr)->byte_start= byte_ptr+= name_len;
  885. return(node);
  886. }
  887.  
  888. /*:43*//*44:*/
  889. #line 751 "common.w"
  890. name_pointer
  891. prefix_lookup(k,l)
  892. char*k;
  893. char*l;
  894. {
  895. short c= greater;
  896. short count= 0;
  897. name_pointer p= root;
  898. name_pointer q= NULL;
  899.  
  900. name_pointer r= name_dir;
  901. while(p){
  902. c= web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start);
  903. switch(c){
  904. case less:p= p->llink;break;
  905. case greater:p= p->rlink;break;
  906. default:r= p;count++;q= p->rlink;p= p->llink;
  907. }
  908. if(p==NULL){
  909. p= q;q= NULL;
  910. }
  911. }
  912. if(count==0)err_print("! Name does not match");
  913.  
  914. if(count>1)err_print("! Ambiguous prefix");
  915.  
  916. return(r);
  917. }
  918.  
  919. /*:44*/
  920.