⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctangle.c

📁 著名算法大师高爷爷设计的语言。此语言结合了Tex和C
💻 C
📖 第 1 页 / 共 2 页
字号:
case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;case minus_gt:C_putc('-');C_putc('>');out_state= normal;break;case gt_gt:C_putc('>');C_putc('>');out_state= normal;break;case eq_eq:C_putc('=');C_putc('=');out_state= normal;break;case lt_lt:C_putc('<');C_putc('<');out_state= normal;break;case gt_eq:C_putc('>');C_putc('=');out_state= normal;break;case lt_eq:C_putc('<');C_putc('=');out_state= normal;break;case not_eq:C_putc('!');C_putc('=');out_state= normal;break;case and_and:C_putc('&');C_putc('&');out_state= normal;break;case or_or:C_putc('|');C_putc('|');out_state= normal;break;case dot_dot_dot:C_putc('.');C_putc('.');C_putc('.');out_state= normal;break;case colon_colon:C_putc(':');C_putc(':');out_state= normal;break;case period_ast:C_putc('.');C_putc('*');out_state= normal;break;case minus_gt_ast:C_putc('-');C_putc('>');C_putc('*');out_state= normal;break;/*:50*/#line 664 "./ctangle.w";case'=':case'>':C_putc(cur_char);C_putc(' ');out_state= normal;break;case join:out_state= unbreakable;break;case constant:if(out_state==verbatim){out_state= num_or_id;break;}if(out_state==num_or_id)C_putc(' ');out_state= verbatim;break;case string:if(out_state==verbatim)out_state= normal;else out_state= verbatim;break;case'/':C_putc('/');out_state= post_slash;break;case'*':if(out_state==post_slash)C_putc(' ');default:C_putc(cur_char);out_state= normal;break;}}/*:49*//*58:*/#line 813 "./ctangle.w"eight_bitsskip_ahead(){eight_bits c;while(1){if(loc> limit&&(get_line()==0))return(new_section);*(limit+1)= '@';while(*loc!='@')loc++;if(loc<=limit){loc++;c= ccode[(eight_bits)*loc];loc++;if(c!=ignore||*(loc-1)=='>')return(c);}}}/*:58*//*60:*/#line 848 "./ctangle.w"int skip_comment(is_long_comment)boolean is_long_comment;{char c;while(1){if(loc> limit){if(is_long_comment){if(get_line())return(comment_continues= 1);else{err_print("! Input ended in mid-comment");return(comment_continues= 0);}}else return(comment_continues= 0);}c= *(loc++);if(is_long_comment&&c=='*'&&*loc=='/'){loc++;return(comment_continues= 0);}if(c=='@'){if(ccode[(eight_bits)*loc]==new_section){err_print("! Section name ended in mid-comment");loc--;return(comment_continues= 0);}else loc++;}}}/*:60*//*63:*/#line 900 "./ctangle.w"eight_bitsget_next(){static int preprocessing= 0;eight_bits c;while(1){if(loc> limit){if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;if(get_line()==0)return(new_section);else if(print_where&&!no_where){print_where= 0;/*77:*/#line 1225 "./ctangle.w"store_two_bytes(0150000);if(changing)id_first= change_file_name;else id_first= cur_file_name;id_loc= id_first+strlen(id_first);if(changing)store_two_bytes((sixteen_bits)change_line);else store_two_bytes((sixteen_bits)cur_line);{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);app_repl(a%0400);}/*:77*/#line 912 "./ctangle.w";}else return('\n');}c= *loc;if(comment_continues||(c=='/'&&(*(loc+1)=='*'||*(loc+1)=='/'))){skip_comment(comment_continues||*(loc+1)=='*');if(comment_continues)return('\n');else continue;}loc++;if(xisdigit(c)||c=='.')/*66:*/#line 978 "./ctangle.w"{id_first= loc-1;if(*id_first=='.'&&!xisdigit(*loc))goto mistake;if(*id_first=='0'){if(*loc=='x'||*loc=='X'){loc++;while(xisxdigit(*loc))loc++;goto found;}}while(xisdigit(*loc))loc++;if(*loc=='.'){loc++;while(xisdigit(*loc))loc++;}if(*loc=='e'||*loc=='E'){if(*++loc=='+'||*loc=='-')loc++;while(xisdigit(*loc))loc++;}found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'||*loc=='f'||*loc=='F')loc++;id_loc= loc;return(constant);}/*:66*/#line 924 "./ctangle.w"else if(c=='\''||c=='"'||(c=='L'&&(*loc=='\''||*loc=='"')))/*67:*/#line 1006 "./ctangle.w"{char delim= c;id_first= section_text+1;id_loc= section_text;*++id_loc= delim;if(delim=='L'){delim= *loc++;*++id_loc= delim;}while(1){if(loc>=limit){if(*(limit-1)!='\\'){err_print("! String didn't end");loc= limit;break;}if(get_line()==0){err_print("! Input ended in middle of string");loc= buffer;break;}else if(++id_loc<=section_text_end)*id_loc= '\n';}if((c= *loc++)==delim){if(++id_loc<=section_text_end)*id_loc= c;break;}if(c=='\\'){if(loc>=limit)continue;if(++id_loc<=section_text_end)*id_loc= '\\';c= *loc++;}if(++id_loc<=section_text_end)*id_loc= c;}if(id_loc>=section_text_end){printf("\n! String too long: ");term_write(section_text+1,25);err_print("...");}id_loc++;return(string);}/*:67*/#line 926 "./ctangle.w"else if(isalpha(c)||isxalpha(c)||ishigh(c))/*65:*/#line 972 "./ctangle.w"{id_first= --loc;while(isalpha(*++loc)||isdigit(*loc)||isxalpha(*loc)||ishigh(*loc));id_loc= loc;return(identifier);}/*:65*/#line 928 "./ctangle.w"else if(c=='@')/*68:*/#line 1050 "./ctangle.w"{c= ccode[(eight_bits)*loc++];switch(c){case ignore:continue;case translit_code:err_print("! Use @l in limbo only");continue;case control_text:while((c= skip_ahead())=='@');if(*(loc-1)!='>')err_print("! Double @ should be used in control text");continue;case section_name:cur_section_name_char= *(loc-1);/*70:*/#line 1098 "./ctangle.w"{char*k;/*72:*/#line 1118 "./ctangle.w"k= section_text;while(1){if(loc> limit&&get_line()==0){err_print("! Input ended in section name");loc= buffer+1;break;}c= *loc;/*73:*/#line 1142 "./ctangle.w"if(c=='@'){c= *(loc+1);if(c=='>'){loc+= 2;break;}if(ccode[(eight_bits)c]==new_section){err_print("! Section name didn't end");break;}if(ccode[(eight_bits)c]==section_name){err_print("! Nesting of section names not allowed");break;}*(++k)= '@';loc++;}/*:73*/#line 1127 "./ctangle.w";loc++;if(k<section_text_end)k++;if(xisspace(c)){c= ' ';if(*(k-1)==' ')k--;}*k= c;}if(k>=section_text_end){printf("\n! Section name too long: ");term_write(section_text+1,25);printf("...");mark_harmless;}if(*k==' '&&k> section_text)k--;/*:72*/#line 1100 "./ctangle.w";if(k-section_text> 3&&strncmp(k-2,"...",3)==0)cur_section_name= section_lookup(section_text+1,k-3,1);else cur_section_name= section_lookup(section_text+1,k,0);if(cur_section_name_char=='(')/*40:*/#line 516 "./ctangle.w"{for(an_output_file= cur_out_file;an_output_file<end_output_files;an_output_file++)if(*an_output_file==cur_section_name)break;if(an_output_file==end_output_files){if(cur_out_file> output_files)*--cur_out_file= cur_section_name;else{overflow("output files");}}}/*:40*/#line 1106 "./ctangle.w";return(section_name);}/*:70*/#line 1064 "./ctangle.w";case string:/*74:*/#line 1164 "./ctangle.w"{id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';while(*loc!='@'||*(loc+1)!='>')loc++;if(loc>=limit)err_print("! Verbatim string didn't end");id_loc= loc;loc+= 2;return(string);}/*:74*/#line 1065 "./ctangle.w";case ord:/*69:*/#line 1077 "./ctangle.w"id_first= loc;if(*loc=='\\'){if(*++loc=='\'')loc++;}while(*loc!='\''){if(*loc=='@'){if(*(loc+1)!='@')err_print("! Double @ should be used in ASCII constant");else loc++;}loc++;if(loc> limit){err_print("! String didn't end");loc= limit-1;break;}}loc++;return(ord);/*:69*/#line 1066 "./ctangle.w";default:return(c);}}/*:68*/#line 929 "./ctangle.w"else if(xisspace(c)){if(!preprocessing||loc> limit)continue;else return(' ');}else if(c=='#'&&loc==buffer+1)preprocessing= 1;mistake:/*64:*/#line 950 "./ctangle.w"switch(c){case'+':if(*loc=='+')compress(plus_plus);break;case'-':if(*loc=='-'){compress(minus_minus);}else if(*loc=='>')if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}else compress(minus_gt);break;case'.':if(*loc=='*'){compress(period_ast);}else if(*loc=='.'&&*(loc+1)=='.'){loc++;compress(dot_dot_dot);}break;case':':if(*loc==':')compress(colon_colon);break;case'=':if(*loc=='=')compress(eq_eq);break;case'>':if(*loc=='='){compress(gt_eq);}else if(*loc=='>')compress(gt_gt);break;case'<':if(*loc=='='){compress(lt_eq);}else if(*loc=='<')compress(lt_lt);break;case'&':if(*loc=='&')compress(and_and);break;case'|':if(*loc=='|')compress(or_or);break;case'!':if(*loc=='=')compress(not_eq);break;}/*:64*/#line 936 "./ctangle.w"return(c);}}/*:63*//*76:*/#line 1199 "./ctangle.w"voidscan_repl(t)eight_bits t;{sixteen_bits a;if(t==section_name){/*77:*/#line 1225 "./ctangle.w"store_two_bytes(0150000);if(changing)id_first= change_file_name;else id_first= cur_file_name;id_loc= id_first+strlen(id_first);if(changing)store_two_bytes((sixteen_bits)change_line);else store_two_bytes((sixteen_bits)cur_line);{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);app_repl(a%0400);}/*:77*/#line 1205 "./ctangle.w";}while(1)switch(a= get_next()){/*78:*/#line 1235 "./ctangle.w"case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);app_repl(a%0400);break;case section_name:if(t!=section_name)goto done;else{/*79:*/#line 1268 "./ctangle.w"{char*try_loc= loc;while(*try_loc==' '&&try_loc<limit)try_loc++;if(*try_loc=='+'&&try_loc<limit)try_loc++;while(*try_loc==' '&&try_loc<limit)try_loc++;if(*try_loc=='=')err_print("! Missing `@ ' before a named section");}/*:79*/#line 1241 "./ctangle.w";a= cur_section_name-name_dir;app_repl((a/0400)+0250);app_repl(a%0400);/*77:*/#line 1225 "./ctangle.w"store_two_bytes(0150000);if(changing)id_first= change_file_name;else id_first= cur_file_name;id_loc= id_first+strlen(id_first);if(changing)store_two_bytes((sixteen_bits)change_line);else store_two_bytes((sixteen_bits)cur_line);{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);app_repl(a%0400);}/*:77*/#line 1245 "./ctangle.w";break;}case output_defs_code:if(t!=section_name)err_print("! Misplaced @h");else{output_defs_seen= 1;a= output_defs_flag;app_repl((a/0400)+0200);app_repl(a%0400);/*77:*/#line 1225 "./ctangle.w"store_two_bytes(0150000);if(changing)id_first= change_file_name;else id_first= cur_file_name;id_loc= id_first+strlen(id_first);if(changing)store_two_bytes((sixteen_bits)change_line);else store_two_bytes((sixteen_bits)cur_line);{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);app_repl(a%0400);}/*:77*/#line 1254 "./ctangle.w";}break;case constant:case string:/*80:*/#line 1279 "./ctangle.w"app_repl(a);while(id_first<id_loc){if(*id_first=='@'){if(*(id_first+1)=='@')id_first++;else err_print("! Double @ should be used in string");}app_repl(*id_first++);}app_repl(a);break;/*:80*/#line 1258 "./ctangle.w";case ord:/*81:*/#line 1295 "./ctangle.w"{int c= (eight_bits)*id_first;if(c=='\\'){c= *++id_first;if(c>='0'&&c<='7'){c-= '0';if(*(id_first+1)>='0'&&*(id_first+1)<='7'){c= 8*c+*(++id_first)-'0';if(*(id_first+1)>='0'&&*(id_first+1)<='7'&&c<32)c= 8*c+*(++id_first)-'0';}}else switch(c){case't':c= '\t';break;case'n':c= '\n';break;case'b':c= '\b';break;case'f':c= '\f';break;case'v':c= '\v';break;case'r':c= '\r';break;case'a':c= '\7';break;case'?':c= '?';break;case'x':if(xisdigit(*(id_first+1)))c= *(++id_first)-'0';else if(xisxdigit(*(id_first+1))){++id_first;c= toupper(*id_first)-'A'+10;}if(xisdigit(*(id_first+1)))c= 16*c+*(++id_first)-'0';else if(xisxdigit(*(id_first+1))){++id_first;c= 16*c+toupper(*id_first)-'A'+10;}break;case'\\':c= '\\';break;case'\'':c= '\'';break;case'\"':c= '\"';break;default:err_print("! Unrecognized escape sequence");}}app_repl(constant);if(c>=100)app_repl('0'+c/100);if(c>=10)app_repl('0'+(c/10)%10);app_repl('0'+c%10);app_repl(constant);}break;/*:81*/#line 1260 "./ctangle.w";case definition:case format_code:case begin_C:if(t!=section_name)goto done;else{err_print("! @d, @f and @c are ignored in C text");continue;}case new_section:goto done;/*:78*/#line 1210 "./ctangle.w"case')':app_repl(a);if(t==macro)app_repl(' ');break;default:app_repl(a);}done:next_control= (eight_bits)a;if(text_ptr> text_info_end)overflow("text");cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;}/*:76*//*83:*/#line 1357 "./ctangle.w"voidscan_section(){name_pointer p;text_pointer q;sixteen_bits a;section_count++;no_where= 1;if(*(loc-1)=='*'&&show_progress){printf("*%d",section_count);update_terminal;}next_control= 0;while(1){/*84:*/#line 1396 "./ctangle.w"while(next_control<definition)if((next_control= skip_ahead())==section_name){loc-= 2;next_control= get_next();}/*:84*/#line 1371 "./ctangle.w";if(next_control==definition){/*85:*/#line 1403 "./ctangle.w"{while((next_control= get_next())=='\n');if(next_control!=identifier){err_print("! Definition flushed, must start with identifier");continue;}app_repl(((a= id_lookup(id_first,id_loc,0)-name_dir)/0400)+0200);app_repl(a%0400);if(*loc!='('){app_repl(string);app_repl(' ');app_repl(string);}scan_repl(macro);cur_text->text_link= 0;}/*:85*/#line 1373 "./ctangle.w"continue;}if(next_control==begin_C){p= name_dir;break;}if(next_control==section_name){p= cur_section_name;/*86:*/#line 1428 "./ctangle.w"while((next_control= get_next())=='+');if(next_control!='='&&next_control!=eq_eq)continue;/*:86*/#line 1381 "./ctangle.w";break;}return;}no_where= print_where= 0;/*87:*/#line 1433 "./ctangle.w"/*88:*/#line 1438 "./ctangle.w"store_two_bytes((sixteen_bits)(0150000+section_count));/*:88*/#line 1434 "./ctangle.w";scan_repl(section_name);/*89:*/#line 1442 "./ctangle.w"if(p==name_dir||p==0){(last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;}else if(p->equiv==(char*)text_info)p->equiv= (char*)cur_text;else{q= (text_pointer)p->equiv;while(q->text_link<section_flag)q= q->text_link+text_info;q->text_link= cur_text-text_info;}cur_text->text_link= section_flag;/*:89*/#line 1436 "./ctangle.w";/*:87*/#line 1387 "./ctangle.w";}/*:83*//*91:*/#line 1460 "./ctangle.w"voidphase_one(){phase= 1;section_count= 0;reset_input();skip_limbo();while(!input_has_ended)scan_section();check_complete();phase= 2;}/*:91*//*93:*/#line 1478 "./ctangle.w"voidskip_limbo(){char c;while(1){if(loc> limit&&get_line()==0)return;*(limit+1)= '@';while(*loc!='@')loc++;if(loc++<=limit){c= *loc++;if(ccode[(eight_bits)c]==new_section)break;switch(ccode[(eight_bits)c]){case translit_code:/*94:*/#line 1507 "./ctangle.w"while(xisspace(*loc)&&loc<limit)loc++;loc+= 3;if(loc> limit||!xisxdigit(*(loc-3))||!xisxdigit(*(loc-2))||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))err_print("! Improper hex number following @l");else{unsigned i;char*beg;sscanf(loc-3,"%x",&i);while(xisspace(*loc)&&loc<limit)loc++;beg= loc;while(loc<limit&&(xisalpha(*loc)||xisdigit(*loc)||*loc=='_'))loc++;if(loc-beg>=translit_length)err_print("! Replacement string in @l too long");else{strncpy(translit[i-0200],beg,loc-beg);translit[i-0200][loc-beg]= '\0';}}/*:94*/#line 1491 "./ctangle.w";break;case format_code:case'@':break;case control_text:if(c=='q'||c=='Q'){while((c= skip_ahead())=='@');if(*(loc-1)!='>')err_print("! Double @ should be used in control text");break;}default:err_print("! Double @ should be used in limbo");}}}}/*:93*//*95:*/#line 1533 "./ctangle.w"voidprint_stats(){printf("\nMemory usage statistics:\n");printf("%ld names (out of %ld)\n",(long)(name_ptr-name_dir),(long)max_names);printf("%ld replacement texts (out of %ld)\n",(long)(text_ptr-text_info),(long)max_texts);printf("%ld bytes (out of %ld)\n",(long)(byte_ptr-byte_mem),(long)max_bytes);printf("%ld tokens (out of %ld)\n",(long)(tok_ptr-tok_mem),(long)max_toks);}/*:95*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -