ctangle.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:29k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*1:*/
  2. #line 61 "ctangle.w"
  3. /*6:*/
  4. #line 35 "common.h"
  5. #include <stdio.h>
  6. /*:6*//*62:*/
  7. #line 881 "ctangle.w"
  8. #include <ctype.h> 
  9. #include <stdlib.h> 
  10. /*:62*/
  11. #line 62 "ctangle.w"
  12. #define banner "This is CTANGLE (Version 3.4)n" 
  13. #define max_bytes 90000 
  14. #define max_toks 270000
  15. #define max_names 4000 
  16. #define max_texts 2500
  17. #define hash_size 353
  18. #define longest_name 1000
  19. #define stack_size 50
  20. #define buf_size 100 
  21. #define ctangle 0
  22. #define cweave 1 
  23. #define and_and 04
  24. #define lt_lt 020
  25. #define gt_gt 021
  26. #define plus_plus 013
  27. #define minus_minus 01
  28. #define minus_gt 031
  29. #define not_eq 032
  30. #define lt_eq 034
  31. #define gt_eq 035
  32. #define eq_eq 036
  33. #define or_or 037
  34. #define dot_dot_dot 016
  35. #define colon_colon 06
  36. #define period_ast 026
  37. #define minus_gt_ast 027 
  38. #define xisalpha(c) (isalpha(c) &&((eight_bits) c<0200) ) 
  39. #define xisdigit(c) (isdigit(c) &&((eight_bits) c<0200) ) 
  40. #define xisspace(c) (isspace(c) &&((eight_bits) c<0200) ) 
  41. #define xislower(c) (islower(c) &&((eight_bits) c<0200) ) 
  42. #define xisupper(c) (isupper(c) &&((eight_bits) c<0200) ) 
  43. #define xisxdigit(c) (isxdigit(c) &&((eight_bits) c<0200) )  
  44. #define length(c) (c+1) ->byte_start-(c) ->byte_start
  45. #define print_id(c) term_write((c) ->byte_start,length((c) ) ) 
  46. #define llink link
  47. #define rlink dummy.Rlink
  48. #define root name_dir->rlink 
  49. #define chunk_marker 0 
  50. #define spotless 0
  51. #define harmless_message 1
  52. #define error_message 2
  53. #define fatal_message 3
  54. #define mark_harmless {if(history==spotless) history= harmless_message;}
  55. #define mark_error history= error_message
  56. #define confusion(s) fatal("! This can't happen: ",s)  
  57. #define max_file_name_length 60
  58. #define cur_file file[include_depth]
  59. #define cur_file_name file_name[include_depth]
  60. #define web_file_name file_name[0]
  61. #define cur_line line[include_depth] 
  62. #define show_banner flags['b']
  63. #define show_progress flags['p']
  64. #define show_happiness flags['h'] 
  65. #define update_terminal fflush(stdout) 
  66. #define new_line putchar('n') 
  67. #define putxchar putchar
  68. #define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
  69. #define C_printf(c,a) fprintf(C_file,c,a) 
  70. #define C_putc(c) putc(c,C_file)  
  71. #define equiv equiv_or_xref 
  72. #define section_flag max_texts 
  73. #define string 02
  74. #define join 0177
  75. #define output_defs_flag (2*024000-1)  
  76. #define cur_end cur_state.end_field
  77. #define cur_byte cur_state.byte_field
  78. #define cur_name cur_state.name_field
  79. #define cur_repl cur_state.repl_field
  80. #define cur_section cur_state.section_field 
  81. #define section_number 0201
  82. #define identifier 0202 
  83. #define normal 0
  84. #define num_or_id 1
  85. #define post_slash 2
  86. #define unbreakable 3
  87. #define verbatim 4 
  88. #define max_files 256
  89. #define translit_length 10 
  90. #define ignore 0
  91. #define ord 0302
  92. #define control_text 0303
  93. #define translit_code 0304
  94. #define output_defs_code 0305
  95. #define format_code 0306
  96. #define definition 0307
  97. #define begin_C 0310
  98. #define section_name 0311
  99. #define new_section 0312 
  100. #define constant 03 
  101. #define isxalpha(c) ((c) =='_') 
  102. #define ishigh(c) ((unsigned char) (c) >0177)  
  103.  
  104. #define compress(c) if(loc++<=limit) return(c)  
  105. #define macro 0
  106. #define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} 
  107. #line 63 "ctangle.w"
  108. /*5:*/
  109. #line 29 "common.h"
  110. typedef short boolean;
  111. typedef char unsigned eight_bits;
  112. extern boolean program;
  113. extern int phase;
  114. /*:5*//*7:*/
  115. #line 57 "common.h"
  116. char section_text[longest_name+1];
  117. char*section_text_end= section_text+longest_name;
  118. char*id_first;
  119. char*id_loc;
  120. /*:7*//*8:*/
  121. #line 72 "common.h"
  122. extern char buffer[];
  123. extern char*buffer_end;
  124. extern char*loc;
  125. extern char*limit;
  126. /*:8*//*9:*/
  127. #line 87 "common.h"
  128. typedef struct name_info{
  129. char*byte_start;
  130. struct name_info*link;
  131. union{
  132. struct name_info*Rlink;
  133. char Ilk;
  134. }dummy;
  135. char*equiv_or_xref;
  136. }name_info;
  137. typedef name_info*name_pointer;
  138. typedef name_pointer*hash_pointer;
  139. extern char byte_mem[];
  140. extern char*byte_mem_end;
  141. extern name_info name_dir[];
  142. extern name_pointer name_dir_end;
  143. extern name_pointer name_ptr;
  144. extern char*byte_ptr;
  145. extern name_pointer hash[];
  146. extern hash_pointer hash_end;
  147. extern hash_pointer h;
  148. extern name_pointer id_lookup();
  149. extern name_pointer section_lookup();
  150. extern void print_section_name(),sprint_section_name();
  151. /*:9*//*10:*/
  152. #line 122 "common.h"
  153. extern history;
  154. extern err_print();
  155. extern wrap_up();
  156. extern void fatal();
  157. extern void overflow();
  158. /*:10*//*11:*/
  159. #line 137 "common.h"
  160. extern include_depth;
  161. extern FILE*file[];
  162. extern FILE*change_file;
  163. extern char C_file_name[];
  164. extern char tex_file_name[];
  165. extern char idx_file_name[];
  166. extern char scn_file_name[];
  167. extern char file_name[][max_file_name_length];
  168. extern char change_file_name[];
  169. extern line[];
  170. extern change_line;
  171. extern boolean input_has_ended;
  172. extern boolean changing;
  173. extern boolean web_file_open;
  174. extern reset_input();
  175. extern get_line();
  176. extern check_complete();
  177. /*:11*//*12:*/
  178. #line 158 "common.h"
  179. typedef unsigned short sixteen_bits;
  180. extern sixteen_bits section_count;
  181. extern boolean changed_section[];
  182. extern boolean change_pending;
  183. extern boolean print_where;
  184. /*:12*//*13:*/
  185. #line 170 "common.h"
  186. extern int argc;
  187. extern char**argv;
  188. extern boolean flags[];
  189. /*:13*//*14:*/
  190. #line 182 "common.h"
  191. extern FILE*C_file;
  192. extern FILE*tex_file;
  193. extern FILE*idx_file;
  194. extern FILE*scn_file;
  195. extern FILE*active_file;
  196. /*:14*//*15:*/
  197. #line 191 "common.h"
  198. extern void common_init();
  199. #line 125 "ctangle.w"
  200. /*:15*/
  201. #line 64 "ctangle.w"
  202. /*16:*/
  203. #line 149 "ctangle.w"
  204. typedef struct{
  205. eight_bits*tok_start;
  206. sixteen_bits text_link;
  207. }text;
  208. typedef text*text_pointer;
  209. /*:16*//*27:*/
  210. #line 293 "ctangle.w"
  211. typedef struct{
  212. eight_bits*end_field;
  213. eight_bits*byte_field;
  214. name_pointer name_field;
  215. text_pointer repl_field;
  216. sixteen_bits section_field;
  217. }output_state;
  218. typedef output_state*stack_pointer;
  219. /*:27*/
  220. #line 65 "ctangle.w"
  221. /*17:*/
  222. #line 156 "ctangle.w"
  223. text text_info[max_texts];
  224. text_pointer text_info_end= text_info+max_texts-1;
  225. text_pointer text_ptr;
  226. eight_bits tok_mem[max_toks];
  227. eight_bits*tok_mem_end= tok_mem+max_toks-1;
  228. eight_bits*tok_ptr;
  229. /*:17*//*23:*/
  230. #line 224 "ctangle.w"
  231. text_pointer last_unnamed;
  232. /*:23*//*28:*/
  233. #line 309 "ctangle.w"
  234. output_state cur_state;
  235. output_state stack[stack_size+1];
  236. stack_pointer stack_ptr;
  237. stack_pointer stack_end= stack+stack_size;
  238. /*:28*//*32:*/
  239. #line 381 "ctangle.w"
  240. int cur_val;
  241. /*:32*//*36:*/
  242. #line 470 "ctangle.w"
  243. eight_bits out_state;
  244. boolean protect;
  245. /*:36*//*38:*/
  246. #line 499 "ctangle.w"
  247. name_pointer output_files[max_files];
  248. name_pointer*cur_out_file,*end_output_files,*an_output_file;
  249. char cur_section_name_char;
  250. char output_file_name[longest_name];
  251. /*:38*//*45:*/
  252. #line 596 "ctangle.w"
  253. boolean output_defs_seen= 0;
  254. /*:45*//*51:*/
  255. #line 706 "ctangle.w"
  256. char translit[128][translit_length];
  257. /*:51*//*56:*/
  258. #line 782 "ctangle.w"
  259. eight_bits ccode[256];
  260. /*:56*//*59:*/
  261. #line 838 "ctangle.w"
  262. boolean comment_continues= 0;
  263. /*:59*//*61:*/
  264. #line 877 "ctangle.w"
  265. name_pointer cur_section_name;
  266. int no_where;
  267. /*:61*//*75:*/
  268. #line 1191 "ctangle.w"
  269. text_pointer cur_text;
  270. eight_bits next_control;
  271. /*:75*//*82:*/
  272. #line 1341 "ctangle.w"
  273. extern sixteen_bits section_count;
  274. /*:82*/
  275. #line 66 "ctangle.w"
  276. /*2:*/
  277. #line 74 "ctangle.w"
  278. extern int strlen();
  279. extern int strcmp();
  280. extern char*strcpy();
  281. extern int strncmp();
  282. extern char*strncpy();
  283. /*:2*//*41:*/
  284. #line 530 "ctangle.w"
  285. void phase_two();
  286. /*:41*//*46:*/
  287. #line 599 "ctangle.w"
  288. void output_defs();
  289. /*:46*//*48:*/
  290. #line 645 "ctangle.w"
  291. static void out_char();
  292. /*:48*//*90:*/
  293. #line 1448 "ctangle.w"
  294. void phase_one();
  295. /*:90*//*92:*/
  296. #line 1466 "ctangle.w"
  297. void skip_limbo();
  298. /*:92*/
  299. #line 67 "ctangle.w"
  300. /*:1*//*3:*/
  301. #line 88 "ctangle.w"
  302. int main(ac,av)
  303. int ac;
  304. char**av;
  305. {
  306. argc= ac;argv= av;
  307. program= ctangle;
  308. /*18:*/
  309. #line 164 "ctangle.w"
  310. text_info->tok_start= tok_ptr= tok_mem;
  311. text_ptr= text_info+1;text_ptr->tok_start= tok_mem;
  312. /*:18*//*20:*/
  313. #line 174 "ctangle.w"
  314. name_dir->equiv= (char*)text_info;
  315. /*:20*//*24:*/
  316. #line 227 "ctangle.w"
  317. last_unnamed= text_info;text_info->text_link= 0;
  318. /*:24*//*39:*/
  319. #line 509 "ctangle.w"
  320. cur_out_file= end_output_files= output_files+max_files;
  321. /*:39*//*52:*/
  322. #line 709 "ctangle.w"
  323. {
  324. int i;
  325. for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned)(128+i));
  326. }
  327. /*:52*//*57:*/
  328. #line 785 "ctangle.w"
  329. {
  330. int c;
  331. for(c= 0;c<256;c++)ccode[c]= ignore;
  332. ccode[' ']= ccode['t']= ccode['n']= ccode['v']= ccode['r']= ccode['f']
  333. = ccode['*']= new_section;
  334. ccode['@']= '@';ccode['=']= string;
  335. ccode['d']= ccode['D']= definition;
  336. ccode['f']= ccode['F']= ccode['s']= ccode['S']= format_code;
  337. ccode['c']= ccode['C']= ccode['p']= ccode['P']= begin_C;
  338. ccode['^']= ccode[':']= ccode['.']= ccode['t']= ccode['T']= 
  339. ccode['q']= ccode['Q']= control_text;
  340. ccode['h']= ccode['H']= output_defs_code;
  341. ccode['l']= ccode['L']= translit_code;
  342. ccode['&']= join;
  343. ccode['<']= ccode['(']= section_name;
  344. ccode[''']= ord;
  345. }
  346. /*:57*//*71:*/
  347. #line 1112 "ctangle.w"
  348. section_text[0]= ' ';
  349. /*:71*/
  350. #line 95 "ctangle.w"
  351. ;
  352. common_init();
  353. if(show_banner)printf(banner);
  354. phase_one();
  355. phase_two();
  356. return wrap_up();
  357. }
  358. /*:3*//*21:*/
  359. #line 180 "ctangle.w"
  360. int names_match(p,first,l)
  361. name_pointer p;
  362. char*first;
  363. int l;
  364. {
  365. if(length(p)!=l)return 0;
  366. return!strncmp(first,p->byte_start,l);
  367. }
  368. /*:21*//*22:*/
  369. #line 195 "ctangle.w"
  370. void
  371. init_node(node)
  372. name_pointer node;
  373. {
  374. node->equiv= (char*)text_info;
  375. }
  376. void
  377. init_p(){}
  378. /*:22*//*26:*/
  379. #line 257 "ctangle.w"
  380. void
  381. store_two_bytes(x)
  382. sixteen_bits x;
  383. {
  384. if(tok_ptr+2>tok_mem_end)overflow("token");
  385. *tok_ptr++= x>>8;
  386. *tok_ptr++= x&0377;
  387. }
  388. /*:26*//*30:*/
  389. #line 333 "ctangle.w"
  390. void
  391. push_level(p)
  392. name_pointer p;
  393. {
  394. if(stack_ptr==stack_end)overflow("stack");
  395. *stack_ptr= cur_state;
  396. stack_ptr++;
  397. if(p!=NULL){
  398. cur_name= p;cur_repl= (text_pointer)p->equiv;
  399. cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;
  400. cur_section= 0;
  401. }
  402. }
  403. /*:30*//*31:*/
  404. #line 352 "ctangle.w"
  405. void
  406. pop_level(flag)
  407. int flag;
  408. {
  409. if(flag&&cur_repl->text_link<section_flag){
  410. cur_repl= cur_repl->text_link+text_info;
  411. cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;
  412. return;
  413. }
  414. stack_ptr--;
  415. if(stack_ptr>stack)cur_state= *stack_ptr;
  416. }
  417. /*:31*//*33:*/
  418. #line 388 "ctangle.w"
  419. void
  420. get_output()
  421. {
  422. sixteen_bits a;
  423. restart:if(stack_ptr==stack)return;
  424. if(cur_byte==cur_end){
  425. cur_val= -((int)cur_section);
  426. pop_level(1);
  427. if(cur_val==0)goto restart;
  428. out_char(section_number);return;
  429. }
  430. a= *cur_byte++;
  431. if(out_state==verbatim&&a!=string&&a!=constant&&a!='n')
  432. C_putc(a);
  433. else if(a<0200)out_char(a);
  434. else{
  435. a= (a-0200)*0400+*cur_byte++;
  436. switch(a/024000){
  437. case 0:cur_val= a;out_char(identifier);break;
  438. case 1:if(a==output_defs_flag)output_defs();
  439. else/*34:*/
  440. #line 420 "ctangle.w"
  441. {
  442. a-= 024000;
  443. if((a+name_dir)->equiv!=(char*)text_info)push_level(a+name_dir);
  444. else if(a!=0){
  445. printf("n! Not present: <");
  446. print_section_name(a+name_dir);err_print(">");
  447. }
  448. goto restart;
  449. }
  450. /*:34*/
  451. #line 409 "ctangle.w"
  452. ;
  453. break;
  454. default:cur_val= a-050000;if(cur_val>0)cur_section= cur_val;
  455. out_char(section_number);
  456. }
  457. }
  458. }
  459. /*:33*//*37:*/
  460. #line 478 "ctangle.w"
  461. void
  462. flush_buffer()
  463. {
  464. C_putc('n');
  465. if(cur_line%100==0&&show_progress){
  466. printf(".");
  467. if(cur_line%500==0)printf("%d",cur_line);
  468. update_terminal;
  469. }
  470. cur_line++;
  471. }
  472. /*:37*//*42:*/
  473. #line 533 "ctangle.w"
  474. void
  475. phase_two(){
  476. web_file_open= 0;
  477. cur_line= 1;
  478. /*29:*/
  479. #line 322 "ctangle.w"
  480. stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
  481. cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
  482. /*:29*/
  483. #line 538 "ctangle.w"
  484. ;
  485. /*44:*/
  486. #line 592 "ctangle.w"
  487. if(!output_defs_seen)
  488. output_defs();
  489. /*:44*/
  490. #line 539 "ctangle.w"
  491. ;
  492. if(text_info->text_link==0&&cur_out_file==end_output_files){
  493. printf("n! No program text was specified.");mark_harmless;
  494. }
  495. else{
  496. if(cur_out_file==end_output_files){
  497. if(show_progress)
  498. printf("nWriting the output file (%s):",C_file_name);
  499. }
  500. else{
  501. if(show_progress){
  502. printf("nWriting the output files:");
  503. printf(" (%s)",C_file_name);
  504. update_terminal;
  505. }
  506. if(text_info->text_link==0)goto writeloop;
  507. }
  508. while(stack_ptr>stack)get_output();
  509. flush_buffer();
  510. writeloop:/*43:*/
  511. #line 569 "ctangle.w"
  512. for(an_output_file= end_output_files;an_output_file>cur_out_file;){
  513. an_output_file--;
  514. sprint_section_name(output_file_name,*an_output_file);
  515. fclose(C_file);
  516. C_file= fopen(output_file_name,"w");
  517. if(C_file==0)fatal("! Cannot open output file:",output_file_name);
  518. printf("n(%s)",output_file_name);update_terminal;
  519. cur_line= 1;
  520. stack_ptr= stack+1;
  521. cur_name= (*an_output_file);
  522. cur_repl= (text_pointer)cur_name->equiv;
  523. cur_byte= cur_repl->tok_start;
  524. cur_end= (cur_repl+1)->tok_start;
  525. while(stack_ptr>stack)get_output();
  526. flush_buffer();
  527. }
  528. /*:43*/
  529. #line 560 "ctangle.w"
  530. ;
  531. if(show_happiness)printf("nDone.");
  532. }
  533. }
  534. /*:42*//*47:*/
  535. #line 602 "ctangle.w"
  536. void
  537. output_defs()
  538. {
  539. sixteen_bits a;
  540. push_level(NULL);
  541. for(cur_text= text_info+1;cur_text<text_ptr;cur_text++)
  542. if(cur_text->text_link==0){
  543. cur_byte= cur_text->tok_start;
  544. cur_end= (cur_text+1)->tok_start;
  545. C_printf("%s","#define ");
  546. out_state= normal;
  547. protect= 1;
  548. while(cur_byte<cur_end){
  549. a= *cur_byte++;
  550. if(cur_byte==cur_end&&a=='n')break;
  551. if(out_state==verbatim&&a!=string&&a!=constant&&a!='n')
  552. C_putc(a);
  553. else if(a<0200)out_char(a);
  554. else{
  555. a= (a-0200)*0400+*cur_byte++;
  556. if(a<024000){
  557. cur_val= a;out_char(identifier);
  558. }
  559. else if(a<050000){confusion("macro defs have strange char");}
  560. else{
  561. cur_val= a-050000;cur_section= cur_val;out_char(section_number);
  562. }
  563. }
  564. }
  565. protect= 0;
  566. flush_buffer();
  567. }
  568. pop_level(0);
  569. }
  570. /*:47*//*49:*/
  571. #line 648 "ctangle.w"
  572. static void
  573. out_char(cur_char)
  574. eight_bits cur_char;
  575. {
  576. char*j,*k;
  577. restart:
  578. switch(cur_char){
  579. case'n':if(protect)C_putc(' ');
  580. if(protect||out_state==verbatim)C_putc('\');
  581. flush_buffer();if(out_state!=verbatim)out_state= normal;break;
  582. /*53:*/
  583. #line 715 "ctangle.w"
  584. case identifier:
  585. if(out_state==num_or_id)C_putc(' ');
  586. j= (cur_val+name_dir)->byte_start;
  587. k= (cur_val+name_dir+1)->byte_start;
  588. while(j<k){
  589. if((unsigned char)(*j)<0200)C_putc(*j);
  590. else C_printf("%s",translit[(unsigned char)(*j)-0200]);
  591. j++;
  592. }
  593. out_state= num_or_id;break;
  594. /*:53*/
  595. #line 659 "ctangle.w"
  596. ;
  597. /*54:*/
  598. #line 728 "ctangle.w"
  599. case section_number:
  600. if(cur_val>0)C_printf("/*%d:*/",cur_val);
  601. else if(cur_val<0)C_printf("/*:%d*/",-cur_val);
  602. else if(protect){
  603. cur_byte+= 4;
  604. cur_char= 'n';
  605. goto restart;
  606. }else{
  607. sixteen_bits a;
  608. a= 0400**cur_byte++;
  609. a+= *cur_byte++;
  610. C_printf("n#line %d "",a);
  611. cur_val= *cur_byte++;
  612. cur_val= 0400*(cur_val-0200)+*cur_byte++;
  613. for(j= (cur_val+name_dir)->byte_start,k= (cur_val+name_dir+1)->byte_start;
  614. j<k;j++)C_putc(*j);
  615. C_printf("%s",""n");
  616. }
  617. break;
  618. /*:54*/
  619. #line 660 "ctangle.w"
  620. ;
  621. /*50:*/
  622. #line 677 "ctangle.w"
  623. case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
  624. case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
  625. case minus_gt:C_putc('-');C_putc('>');out_state= normal;break;
  626. case gt_gt:C_putc('>');C_putc('>');out_state= normal;break;
  627. case eq_eq:C_putc('=');C_putc('=');out_state= normal;break;
  628. case lt_lt:C_putc('<');C_putc('<');out_state= normal;break;
  629. case gt_eq:C_putc('>');C_putc('=');out_state= normal;break;
  630. case lt_eq:C_putc('<');C_putc('=');out_state= normal;break;
  631. case not_eq:C_putc('!');C_putc('=');out_state= normal;break;
  632. case and_and:C_putc('&');C_putc('&');out_state= normal;break;
  633. case or_or:C_putc('|');C_putc('|');out_state= normal;break;
  634. case dot_dot_dot:C_putc('.');C_putc('.');C_putc('.');out_state= normal;
  635. break;
  636. case colon_colon:C_putc(':');C_putc(':');out_state= normal;break;
  637. case period_ast:C_putc('.');C_putc('*');out_state= normal;break;
  638. case minus_gt_ast:C_putc('-');C_putc('>');C_putc('*');out_state= normal;
  639. break;
  640. /*:50*/
  641. #line 661 "ctangle.w"
  642. ;
  643. case'=':C_putc('=');C_putc(' ');out_state= normal;break;
  644. case join:out_state= unbreakable;break;
  645. case constant:if(out_state==verbatim){
  646. out_state= num_or_id;break;
  647. }
  648. if(out_state==num_or_id)C_putc(' ');out_state= verbatim;break;
  649. case string:if(out_state==verbatim)out_state= normal;
  650. else out_state= verbatim;break;
  651. case'/':C_putc('/');out_state= post_slash;break;
  652. case'*':if(out_state==post_slash)C_putc(' ');
  653. default:C_putc(cur_char);out_state= normal;break;
  654. }
  655. }
  656. /*:49*//*58:*/
  657. #line 806 "ctangle.w"
  658. eight_bits
  659. skip_ahead()
  660. {
  661. eight_bits c;
  662. while(1){
  663. if(loc>limit&&(get_line()==0))return(new_section);
  664. *(limit+1)= '@';
  665. while(*loc!='@')loc++;
  666. if(loc<=limit){
  667. loc++;c= ccode[(eight_bits)*loc];loc++;
  668. if(c!=ignore||*(loc-1)=='>')return(c);
  669. }
  670. }
  671. }
  672. /*:58*//*60:*/
  673. #line 841 "ctangle.w"
  674. int skip_comment(is_long_comment)
  675. boolean is_long_comment;
  676. {
  677. char c;
  678. while(1){
  679. if(loc>limit){
  680. if(is_long_comment){
  681. if(get_line())return(comment_continues= 1);
  682. else{
  683. err_print("! Input ended in mid-comment");
  684. return(comment_continues= 0);
  685. }
  686. }
  687. else return(comment_continues= 0);
  688. }
  689. c= *(loc++);
  690. if(is_long_comment&&c=='*'&&*loc=='/'){
  691. loc++;return(comment_continues= 0);
  692. }
  693. if(c=='@'){
  694. if(ccode[(eight_bits)*loc]==new_section){
  695. err_print("! Section name ended in mid-comment");loc--;
  696. return(comment_continues= 0);
  697. }
  698. else loc++;
  699. }
  700. }
  701. }
  702. /*:60*//*63:*/
  703. #line 892 "ctangle.w"
  704. eight_bits
  705. get_next()
  706. {
  707. static int preprocessing= 0;
  708. eight_bits c;
  709. while(1){
  710. if(loc>limit){
  711. if(preprocessing&&*(limit-1)!='\')preprocessing= 0;
  712. if(get_line()==0)return(new_section);
  713. else if(print_where&&!no_where){
  714. print_where= 0;
  715. /*77:*/
  716. #line 1221 "ctangle.w"
  717. store_two_bytes(0150000);
  718. if(changing)id_first= change_file_name;
  719. else id_first= cur_file_name;
  720. id_loc= id_first+strlen(id_first);
  721. if(changing)store_two_bytes((sixteen_bits)change_line);
  722. else store_two_bytes((sixteen_bits)cur_line);
  723. {int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
  724. app_repl(a%0400);}
  725. /*:77*/
  726. #line 904 "ctangle.w"
  727. ;
  728. }
  729. else return('n');
  730. }
  731. c= *loc;
  732. if(comment_continues||(c=='/'&&(*(loc+1)=='*'||*(loc+1)=='/'))){
  733. skip_comment(comment_continues||*(loc+1)=='*');
  734. if(comment_continues)return('n');
  735. else continue;
  736. }
  737. loc++;
  738. if(xisdigit(c)||c=='\'||c=='.')/*66:*/
  739. #line 970 "ctangle.w"
  740. {
  741. id_first= loc-1;
  742. if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
  743. if(*id_first=='\')while(xisdigit(*loc))loc++;
  744. else{
  745. if(*id_first=='0'){
  746. if(*loc=='x'||*loc=='X'){
  747. loc++;while(xisxdigit(*loc))loc++;goto found;
  748. }
  749. }
  750. while(xisdigit(*loc))loc++;
  751. if(*loc=='.'){
  752. loc++;
  753. while(xisdigit(*loc))loc++;
  754. }
  755. if(*loc=='e'||*loc=='E'){
  756. if(*++loc=='+'||*loc=='-')loc++;
  757. while(xisdigit(*loc))loc++;
  758. }
  759. }
  760. found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'
  761. ||*loc=='f'||*loc=='F')loc++;
  762. id_loc= loc;
  763. return(constant);
  764. }
  765. /*:66*/
  766. #line 916 "ctangle.w"
  767. else if(c=='''||c=='"'||(c=='L'&&(*loc=='''||*loc=='"')))
  768. /*67:*/
  769. #line 1001 "ctangle.w"
  770. {
  771. char delim= c;
  772. id_first= section_text+1;
  773. id_loc= section_text;*++id_loc= delim;
  774. if(delim=='L'){
  775. delim= *loc++;*++id_loc= delim;
  776. }
  777. while(1){
  778. if(loc>=limit){
  779. if(*(limit-1)!='\'){
  780. err_print("! String didn't end");loc= limit;break;
  781. }
  782. if(get_line()==0){
  783. err_print("! Input ended in middle of string");loc= buffer;break;
  784. }
  785. else if(++id_loc<=section_text_end)*id_loc= 'n';
  786. }
  787. if((c= *loc++)==delim){
  788. if(++id_loc<=section_text_end)*id_loc= c;
  789. break;
  790. }
  791. if(c=='\'){
  792. if(loc>=limit)continue;
  793. if(++id_loc<=section_text_end)*id_loc= '\';
  794. c= *loc++;
  795. }
  796. if(++id_loc<=section_text_end)*id_loc= c;
  797. }
  798. if(id_loc>=section_text_end){
  799. printf("n! String too long: ");
  800. term_write(section_text+1,25);
  801. err_print("...");
  802. }
  803. id_loc++;
  804. return(string);
  805. }
  806. /*:67*/
  807. #line 918 "ctangle.w"
  808. else if(isalpha(c)||isxalpha(c)||ishigh(c))
  809. /*65:*/
  810. #line 964 "ctangle.w"
  811. {
  812. id_first= --loc;
  813. while(isalpha(*++loc)||isdigit(*loc)||isxalpha(*loc)||ishigh(*loc));
  814. id_loc= loc;return(identifier);
  815. }
  816. /*:65*/
  817. #line 920 "ctangle.w"
  818. else if(c=='@')/*68:*/
  819. #line 1045 "ctangle.w"
  820. {
  821. c= ccode[(eight_bits)*loc++];
  822. switch(c){
  823. case ignore:continue;
  824. case output_defs_code:output_defs_seen= 1;return(c);
  825. case translit_code:err_print("! Use @l in limbo only");continue;
  826. case control_text:while((c= skip_ahead())=='@');
  827. if(*(loc-1)!='>')
  828. err_print("! Double @ should be used in control text");
  829. continue;
  830. case section_name:
  831. cur_section_name_char= *(loc-1);
  832. /*70:*/
  833. #line 1094 "ctangle.w"
  834. {
  835. char*k;
  836. /*72:*/
  837. #line 1114 "ctangle.w"
  838. k= section_text;
  839. while(1){
  840. if(loc>limit&&get_line()==0){
  841. err_print("! Input ended in section name");
  842. loc= buffer+1;break;
  843. }
  844. c= *loc;
  845. /*73:*/
  846. #line 1138 "ctangle.w"
  847. if(c=='@'){
  848. c= *(loc+1);
  849. if(c=='>'){
  850. loc+= 2;break;
  851. }
  852. if(ccode[(eight_bits)c]==new_section){
  853. err_print("! Section name didn't end");break;
  854. }
  855. if(ccode[(eight_bits)c]==section_name){
  856. err_print("! Nesting of section names not allowed");break;
  857. }
  858. *(++k)= '@';loc++;
  859. }
  860. /*:73*/
  861. #line 1123 "ctangle.w"
  862. ;
  863. loc++;if(k<section_text_end)k++;
  864. if(xisspace(c)){
  865. c= ' ';if(*(k-1)==' ')k--;
  866. }
  867. *k= c;
  868. }
  869. if(k>=section_text_end){
  870. printf("n! Section name too long: ");
  871. term_write(section_text+1,25);
  872. printf("...");mark_harmless;
  873. }
  874. if(*k==' '&&k>section_text)k--;
  875. /*:72*/
  876. #line 1096 "ctangle.w"
  877. ;
  878. if(k-section_text>3&&strncmp(k-2,"...",3)==0)
  879. cur_section_name= section_lookup(section_text+1,k-3,1);
  880. else cur_section_name= section_lookup(section_text+1,k,0);
  881. if(cur_section_name_char=='(')
  882. /*40:*/
  883. #line 513 "ctangle.w"
  884. {
  885. for(an_output_file= cur_out_file;
  886. an_output_file<end_output_files;an_output_file++)
  887. if(*an_output_file==cur_section_name)break;
  888. if(an_output_file==end_output_files){
  889. if(cur_out_file>output_files)
  890. *--cur_out_file= cur_section_name;
  891. else{
  892. overflow("output files");
  893. }
  894. }
  895. }
  896. /*:40*/
  897. #line 1102 "ctangle.w"
  898. ;
  899. return(section_name);
  900. }
  901. /*:70*/
  902. #line 1060 "ctangle.w"
  903. ;
  904. case string:/*74:*/
  905. #line 1160 "ctangle.w"
  906. {
  907. id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
  908. while(*loc!='@'||*(loc+1)!='>')loc++;
  909. if(loc>=limit)err_print("! Verbatim string didn't end");
  910. id_loc= loc;loc+= 2;
  911. return(string);
  912. }
  913. /*:74*/
  914. #line 1061 "ctangle.w"
  915. ;
  916. case ord:/*69:*/
  917. #line 1073 "ctangle.w"
  918. id_first= loc;
  919. if(*loc=='\'){
  920. if(*++loc==''')loc++;
  921. }
  922. while(*loc!='''){
  923. if(*loc=='@'){
  924. if(*(loc+1)!='@')
  925. err_print("! Double @ should be used in ASCII constant");
  926. else loc++;
  927. }
  928. loc++;
  929. if(loc>limit){
  930. err_print("! String didn't end");loc= limit-1;break;
  931. }
  932. }
  933. loc++;
  934. return(ord);
  935. /*:69*/
  936. #line 1062 "ctangle.w"
  937. ;
  938. default:return(c);
  939. }
  940. }
  941. /*:68*/
  942. #line 921 "ctangle.w"
  943. else if(xisspace(c)){
  944. if(!preprocessing||loc>limit)continue;
  945. else return(' ');
  946. }
  947. else if(c=='#'&&loc==buffer+1)preprocessing= 1;
  948. mistake:/*64:*/
  949. #line 942 "ctangle.w"
  950. switch(c){
  951. case'+':if(*loc=='+')compress(plus_plus);break;
  952. case'-':if(*loc=='-'){compress(minus_minus);}
  953. else if(*loc=='>')if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
  954. else compress(minus_gt);break;
  955. case'.':if(*loc=='*'){compress(period_ast);}
  956. else if(*loc=='.'&&*(loc+1)=='.'){
  957. loc++;compress(dot_dot_dot);
  958. }
  959. break;
  960. case':':if(*loc==':')compress(colon_colon);break;
  961. case'=':if(*loc=='=')compress(eq_eq);break;
  962. case'>':if(*loc=='='){compress(gt_eq);}
  963. else if(*loc=='>')compress(gt_gt);break;
  964. case'<':if(*loc=='='){compress(lt_eq);}
  965. else if(*loc=='<')compress(lt_lt);break;
  966. case'&':if(*loc=='&')compress(and_and);break;
  967. case'|':if(*loc=='|')compress(or_or);break;
  968. case'!':if(*loc=='=')compress(not_eq);break;
  969. }
  970. /*:64*/
  971. #line 928 "ctangle.w"
  972. return(c);
  973. }
  974. }
  975. /*:63*//*76:*/
  976. #line 1195 "ctangle.w"
  977. void
  978. scan_repl(t)
  979. eight_bits t;
  980. {
  981. sixteen_bits a;
  982. if(t==section_name){/*77:*/
  983. #line 1221 "ctangle.w"
  984. store_two_bytes(0150000);
  985. if(changing)id_first= change_file_name;
  986. else id_first= cur_file_name;
  987. id_loc= id_first+strlen(id_first);
  988. if(changing)store_two_bytes((sixteen_bits)change_line);
  989. else store_two_bytes((sixteen_bits)cur_line);
  990. {int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
  991. app_repl(a%0400);}
  992. /*:77*/
  993. #line 1201 "ctangle.w"
  994. ;}
  995. while(1)switch(a= get_next()){
  996. /*78:*/
  997. #line 1231 "ctangle.w"
  998. case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
  999. app_repl((a/0400)+0200);
  1000. app_repl(a%0400);break;
  1001. case section_name:if(t!=section_name)goto done;
  1002. else{
  1003. /*79:*/
  1004. #line 1259 "ctangle.w"
  1005. {
  1006. char*try_loc= loc;
  1007. while(*try_loc==' '&&try_loc<limit)try_loc++;
  1008. if(*try_loc=='+'&&try_loc<limit)try_loc++;
  1009. while(*try_loc==' '&&try_loc<limit)try_loc++;
  1010. if(*try_loc=='=')err_print("! Missing `@ ' before a named section");
  1011. }
  1012. /*:79*/
  1013. #line 1237 "ctangle.w"
  1014. ;
  1015. a= cur_section_name-name_dir;
  1016. app_repl((a/0400)+0250);
  1017. app_repl(a%0400);
  1018. /*77:*/
  1019. #line 1221 "ctangle.w"
  1020. store_two_bytes(0150000);
  1021. if(changing)id_first= change_file_name;
  1022. else id_first= cur_file_name;
  1023. id_loc= id_first+strlen(id_first);
  1024. if(changing)store_two_bytes((sixteen_bits)change_line);
  1025. else store_two_bytes((sixteen_bits)cur_line);
  1026. {int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
  1027. app_repl(a%0400);}
  1028. /*:77*/
  1029. #line 1241 "ctangle.w"
  1030. ;break;
  1031. }
  1032. case output_defs_code:
  1033. a= output_defs_flag;
  1034. app_repl((a/0400)+0200);
  1035. app_repl(a%0400);
  1036. /*77:*/
  1037. #line 1221 "ctangle.w"
  1038. store_two_bytes(0150000);
  1039. if(changing)id_first= change_file_name;
  1040. else id_first= cur_file_name;
  1041. id_loc= id_first+strlen(id_first);
  1042. if(changing)store_two_bytes((sixteen_bits)change_line);
  1043. else store_two_bytes((sixteen_bits)cur_line);
  1044. {int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
  1045. app_repl(a%0400);}
  1046. /*:77*/
  1047. #line 1247 "ctangle.w"
  1048. ;break;
  1049. case constant:case string:
  1050. /*80:*/
  1051. #line 1270 "ctangle.w"
  1052. app_repl(a);
  1053. while(id_first<id_loc){
  1054. if(*id_first=='@'){
  1055. if(*(id_first+1)=='@')id_first++;
  1056. else err_print("! Double @ should be used in string");
  1057. }
  1058. app_repl(*id_first++);
  1059. }
  1060. app_repl(a);break;
  1061. /*:80*/
  1062. #line 1249 "ctangle.w"
  1063. ;
  1064. case ord:
  1065. /*81:*/
  1066. #line 1286 "ctangle.w"
  1067. {
  1068. int c= (eight_bits)*id_first;
  1069. if(c=='\'){
  1070. c= *++id_first;
  1071. if(c>='0'&&c<='7'){
  1072. c-= '0';
  1073. if(*(id_first+1)>='0'&&*(id_first+1)<='7'){
  1074. c= 8*c+*(++id_first)-'0';
  1075. if(*(id_first+1)>='0'&&*(id_first+1)<='7'&&c<32)
  1076. c= 8*c+*(++id_first)-'0';
  1077. }
  1078. }
  1079. else switch(c){
  1080. case't':c= 't';break;
  1081. case'n':c= 'n';break;
  1082. case'b':c= 'b';break;
  1083. case'f':c= 'f';break;
  1084. case'v':c= 'v';break;
  1085. case'r':c= 'r';break;
  1086. case'a':c= '7';break;
  1087. case'?':c= '?';break;
  1088. case'x':
  1089. if(xisdigit(*(id_first+1)))c= *(++id_first)-'0';
  1090. else if(xisxdigit(*(id_first+1))){
  1091. ++id_first;
  1092. c= toupper(*id_first)-'A'+10;
  1093. }
  1094. if(xisdigit(*(id_first+1)))c= 16*c+*(++id_first)-'0';
  1095. else if(xisxdigit(*(id_first+1))){
  1096. ++id_first;
  1097. c= 16*c+toupper(*id_first)-'A'+10;
  1098. }
  1099. break;
  1100. case'\':c= '\';break;
  1101. case''':c= ''';break;
  1102. case'"':c= '"';break;
  1103. default:err_print("! Unrecognized escape sequence");
  1104. }
  1105. }
  1106. app_repl(constant);
  1107. if(c>=100)app_repl('0'+c/100);
  1108. if(c>=10)app_repl('0'+(c/10)%10);
  1109. app_repl('0'+c%10);
  1110. app_repl(constant);
  1111. }
  1112. break;
  1113. /*:81*/
  1114. #line 1251 "ctangle.w"
  1115. ;
  1116. case definition:case format_code:case begin_C:if(t!=section_name)goto done;
  1117. else{
  1118. err_print("! @d, @f and @c are ignored in C text");continue;
  1119. }
  1120. case new_section:goto done;
  1121. /*:78*/
  1122. #line 1206 "ctangle.w"
  1123. case')':app_repl(a);
  1124. if(t==macro)app_repl(' ');
  1125. break;
  1126. default:app_repl(a);
  1127. }
  1128. done:next_control= (eight_bits)a;
  1129. if(text_ptr>text_info_end)overflow("text");
  1130. cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
  1131. }
  1132. /*:76*//*83:*/
  1133. #line 1348 "ctangle.w"
  1134. void
  1135. scan_section()
  1136. {
  1137. name_pointer p;
  1138. text_pointer q;
  1139. sixteen_bits a;
  1140. section_count++;no_where= 1;
  1141. if(*(loc-1)=='*'&&show_progress){
  1142. printf("*%d",section_count);update_terminal;
  1143. }
  1144. next_control= 0;
  1145. while(1){
  1146. /*84:*/
  1147. #line 1387 "ctangle.w"
  1148. while(next_control<definition)
  1149. if((next_control= skip_ahead())==section_name){
  1150. loc-= 2;next_control= get_next();
  1151. }
  1152. /*:84*/
  1153. #line 1362 "ctangle.w"
  1154. ;
  1155. if(next_control==definition){
  1156. /*85:*/
  1157. #line 1394 "ctangle.w"
  1158. {
  1159. while((next_control= get_next())=='n');
  1160. if(next_control!=identifier){
  1161. err_print("! Definition flushed, must start with identifier");
  1162. continue;
  1163. }
  1164. app_repl(((a= id_lookup(id_first,id_loc,0)-name_dir)/0400)+0200);
  1165. app_repl(a%0400);
  1166. if(*loc!='('){
  1167. app_repl(string);app_repl(' ');app_repl(string);
  1168. }
  1169. scan_repl(macro);
  1170. cur_text->text_link= 0;
  1171. }
  1172. /*:85*/
  1173. #line 1364 "ctangle.w"
  1174. continue;
  1175. }
  1176. if(next_control==begin_C){
  1177. p= name_dir;break;
  1178. }
  1179. if(next_control==section_name){
  1180. p= cur_section_name;
  1181. /*86:*/
  1182. #line 1419 "ctangle.w"
  1183. while((next_control= get_next())=='+');
  1184. if(next_control!='='&&next_control!=eq_eq)
  1185. continue;
  1186. /*:86*/
  1187. #line 1372 "ctangle.w"
  1188. ;
  1189. break;
  1190. }
  1191. return;
  1192. }
  1193. no_where= print_where= 0;
  1194. /*87:*/
  1195. #line 1424 "ctangle.w"
  1196. /*88:*/
  1197. #line 1429 "ctangle.w"
  1198. store_two_bytes((sixteen_bits)(0150000+section_count));
  1199. /*:88*/
  1200. #line 1425 "ctangle.w"
  1201. ;
  1202. scan_repl(section_name);
  1203. /*89:*/
  1204. #line 1433 "ctangle.w"
  1205. if(p==name_dir||p==0){
  1206. (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
  1207. }
  1208. else if(p->equiv==(char*)text_info)p->equiv= (char*)cur_text;
  1209. else{
  1210. q= (text_pointer)p->equiv;
  1211. while(q->text_link<section_flag)
  1212. q= q->text_link+text_info;
  1213. q->text_link= cur_text-text_info;
  1214. }
  1215. cur_text->text_link= section_flag;
  1216. /*:89*/
  1217. #line 1427 "ctangle.w"
  1218. ;
  1219. /*:87*/
  1220. #line 1378 "ctangle.w"
  1221. ;
  1222. }
  1223. /*:83*//*91:*/
  1224. #line 1451 "ctangle.w"
  1225. void
  1226. phase_one(){
  1227. phase= 1;
  1228. section_count= 0;
  1229. reset_input();
  1230. skip_limbo();
  1231. while(!input_has_ended)scan_section();
  1232. check_complete();
  1233. phase= 2;
  1234. }
  1235. /*:91*//*93:*/
  1236. #line 1469 "ctangle.w"
  1237. void
  1238. skip_limbo()
  1239. {
  1240. char c;
  1241. while(1){
  1242. if(loc>limit&&get_line()==0)return;
  1243. *(limit+1)= '@';
  1244. while(*loc!='@')loc++;
  1245. if(loc++<=limit){
  1246. c= *loc++;
  1247. if(ccode[(eight_bits)c]==new_section)break;
  1248. switch(ccode[(eight_bits)c]){
  1249. case translit_code:/*94:*/
  1250. #line 1498 "ctangle.w"
  1251. while(xisspace(*loc)&&loc<limit)loc++;
  1252. loc+= 3;
  1253. if(loc>limit||!xisxdigit(*(loc-3))||!xisxdigit(*(loc-2))
  1254. ||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))
  1255. err_print("! Improper hex number following @l");
  1256. else{
  1257. unsigned i;
  1258. char*beg;
  1259. sscanf(loc-3,"%x",&i);
  1260. while(xisspace(*loc)&&loc<limit)loc++;
  1261. beg= loc;
  1262. while(loc<limit&&(xisalpha(*loc)||xisdigit(*loc)||*loc=='_'))loc++;
  1263. if(loc-beg>=translit_length)
  1264. err_print("! Replacement string in @l too long");
  1265. else{
  1266. strncpy(translit[i-0200],beg,loc-beg);
  1267. translit[i-0200][loc-beg]= '';
  1268. }
  1269. }
  1270. /*:94*/
  1271. #line 1482 "ctangle.w"
  1272. ;break;
  1273. case format_code:case'@':break;
  1274. case control_text:if(c=='q'||c=='Q'){
  1275. while((c= skip_ahead())=='@');
  1276. if(*(loc-1)!='>')
  1277. err_print("! Double @ should be used in control text");
  1278. break;
  1279. }
  1280. default:err_print("! Double @ should be used in limbo");
  1281. }
  1282. }
  1283. }
  1284. }
  1285. /*:93*//*95:*/
  1286. #line 1524 "ctangle.w"
  1287. void
  1288. print_stats(){
  1289. printf("nMemory usage statistics:n");
  1290. printf("%ld names (out of %ld)n",
  1291. (long)(name_ptr-name_dir),(long)max_names);
  1292. printf("%ld replacement texts (out of %ld)n",
  1293. (long)(text_ptr-text_info),(long)max_texts);
  1294. printf("%ld bytes (out of %ld)n",
  1295. (long)(byte_ptr-byte_mem),(long)max_bytes);
  1296. printf("%ld tokens (out of %ld)n",
  1297. (long)(tok_ptr-tok_mem),(long)max_toks);
  1298. }
  1299. /*:95*/