void #line 366 "./cwebdir/ctang-w2c.ch" skip_limbo P1H(void) #line 1481 "./cwebdir/ctangle.w" { 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:/*93:*/ #line 1507 "./cwebdir/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'; } } /*:93*/ #line 1491 "./cwebdir/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"); } } } }
eight_bits #line 317 "./cwebdir/ctang-w2c.ch" get_next P1H(void) #line 903 "./cwebdir/ctangle.w" { 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; /*76:*/ #line 1225 "./cwebdir/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);} /*:76*/ #line 912 "./cwebdir/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=='.')/*65:*/ #line 978 "./cwebdir/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); } /*:65*/ #line 924 "./cwebdir/ctangle.w" else if(c=='\''||c=='"'||(c=='L'&&(*loc=='\''||*loc=='"'))) /*66:*/ #line 1006 "./cwebdir/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); } /*:66*/ #line 926 "./cwebdir/ctangle.w" else if(isalpha(c)||isxalpha(c)||ishigh(c)) /*64:*/ #line 972 "./cwebdir/ctangle.w" { id_first= --loc; while(isalpha(*++loc)||isdigit(*loc)||isxalpha(*loc)||ishigh(*loc)); id_loc= loc;return(identifier); } /*:64*/ #line 928 "./cwebdir/ctangle.w" else if(c=='@')/*67:*/ #line 1050 "./cwebdir/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); /*69:*/ #line 1098 "./cwebdir/ctangle.w" { char*k; /*71:*/ #line 1118 "./cwebdir/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; /*72:*/ #line 1142 "./cwebdir/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++; } /*:72*/ #line 1127 "./cwebdir/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--; /*:71*/ #line 1100 "./cwebdir/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=='(') /*39:*/ #line 516 "./cwebdir/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"); } } } /*:39*/ #line 1106 "./cwebdir/ctangle.w" ; return(section_name); } /*:69*/ #line 1064 "./cwebdir/ctangle.w" ; case string:/*73:*/ #line 1164 "./cwebdir/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); } /*:73*/ #line 1065 "./cwebdir/ctangle.w" ; case ord:/*68:*/ #line 1077 "./cwebdir/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); /*:68*/ #line 1066 "./cwebdir/ctangle.w" ; default:return(c); } } /*:67*/ #line 929 "./cwebdir/ctangle.w" else if(xisspace(c)){ if(!preprocessing||loc> limit)continue; else return(' '); } else if(c=='#'&&loc==buffer+1)preprocessing= 1; mistake:/*63:*/ #line 950 "./cwebdir/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; } /*:63*/ #line 936 "./cwebdir/ctangle.w" return(c); } }
/* * variable_set() * * ustawia warto¶æ podanej zmiennej. je¶li to zmienna liczbowa lub boolowska, * zmienia ci±g na liczbê. w przypadku boolowskich, rozumie zwroty typu `on', * `off', `yes', `no' itp. je¶li dana zmienna jest bitmap±, akceptuje warto¶æ * w postaci listy flag oraz konstrukcje `+flaga' i `-flaga'. * * - name - nazwa zmiennej, * - value - nowa warto¶æ, * - allow_foreign - czy ma pozwalaæ dopisywaæ obce zmienne. */ int variable_set(const char *name, const char *value, int allow_foreign) { struct variable *v = variable_find(name); if (!v && allow_foreign) { variable_add(name, "##", VAR_FOREIGN, 2, xstrdup(value), NULL, NULL, NULL); return -1; } if (!v && !allow_foreign) return -1; switch (v->type) { case VAR_INT: case VAR_MAP: { const char *p = value; int hex, tmp; if (!value) return -2; if (v->map && v->type == VAR_INT && !xisdigit(*p)) { int i; for (i = 0; v->map[i].label; i++) if (!strcasecmp(v->map[i].label, value)) value = itoa(v->map[i].value); } if (v->map && v->type == VAR_MAP && !xisdigit(*p)) { int i, k = *(int*)(v->ptr); int mode = 0; /* 0 set, 1 add, 2 remove */ char **args; if (*p == '+') { mode = 1; p++; } else if (*p == '-') { mode = 2; p++; } if (!mode) k = 0; args = array_make(p, ",", 0, 1, 0); for (i = 0; args[i]; i++) { int j, found = 0; for (j = 0; v->map[j].label; j++) { if (!strcasecmp(args[i], v->map[j].label)) { found = 1; if (mode == 2) k &= ~(v->map[j].value); if (mode == 1) k &= ~(v->map[j].conflicts); if (mode == 1 || !mode) k |= v->map[j].value; } } if (!found) { array_free(args); return -2; } } array_free(args); value = itoa(k); } p = value; if ((hex = !strncasecmp(p, "0x", 2))) p += 2; while (*p && *p != ' ') { if (hex && !xisxdigit(*p)) return -2; if (!hex && !xisdigit(*p)) return -2; p++; } tmp = strtol(value, NULL, 0); if (v->map) { int i; for (i = 0; v->map[i].label; i++) { if ((tmp & v->map[i].value) && (tmp & v->map[i].conflicts)) return -2; } } *(int*)(v->ptr) = tmp; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } case VAR_BOOL: { int tmp; if (!value) return -2; if ((tmp = on_off(value)) == -1) return -2; *(int*)(v->ptr) = tmp; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } case VAR_STR: { char **tmp = (char**)(v->ptr); xfree(*tmp); if (value) { if (*value == 1) *tmp = base64_decode(value + 1); else *tmp = xstrdup(value); } else *tmp = NULL; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } } return -1; }
void #line 326 "./cwebdir/ctang-w2c.ch" scan_repl P1C(eight_bits,t) #line 1203 "./cwebdir/ctangle.w" { sixteen_bits a; if(t==section_name){/*76:*/ #line 1225 "./cwebdir/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);} /*:76*/ #line 1205 "./cwebdir/ctangle.w" ;} while(1)switch(a= get_next()){ /*77:*/ #line 1235 "./cwebdir/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{ /*78:*/ #line 1268 "./cwebdir/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"); } /*:78*/ #line 1241 "./cwebdir/ctangle.w" ; a= cur_section_name-name_dir; app_repl((a/0400)+0250); app_repl(a%0400); /*76:*/ #line 1225 "./cwebdir/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);} /*:76*/ #line 1245 "./cwebdir/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); /*76:*/ #line 1225 "./cwebdir/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);} /*:76*/ #line 1254 "./cwebdir/ctangle.w" ; } break; case constant:case string: /*79:*/ #line 1279 "./cwebdir/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; /*:79*/ #line 1258 "./cwebdir/ctangle.w" ; case ord: /*80:*/ #line 1295 "./cwebdir/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; /*:80*/ #line 1260 "./cwebdir/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; /*:77*/ #line 1210 "./cwebdir/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; }
/* * variable_set() * * ustawia warto¶æ podanej zmiennej. je¶li to zmienna liczbowa lub boolowska, * zmienia ci±g na liczbê. w przypadku boolowskich, rozumie zwroty typu `on', * `off', `yes', `no' itp. je¶li dana zmienna jest bitmap±, akceptuje warto¶æ * w postaci listy flag oraz konstrukcje `+flaga' i `-flaga'. * * - name - nazwa zmiennej, * - value - nowa warto¶æ, */ int variable_set(const char *name, const char *value) { variable_t *v = variable_find(name); char *tmpname; int changed = 0; if (!v) return -1; switch (v->type) { case VAR_INT: case VAR_MAP: { const char *p = value; int hex, tmp; if (!value) return -2; if (v->map && v->type == VAR_INT && !xisdigit(*p)) { int i; for (i = 0; v->map[i].label; i++) if (!xstrcasecmp(v->map[i].label, value)) value = ekg_itoa(v->map[i].value); } if (v->map && v->type == VAR_MAP && !xisdigit(*p)) { int i, k = *(int*)(v->ptr); int mode = 0; /* 0 set, 1 add, 2 remove */ char **args; if (*p == '+') { mode = 1; p++; } else if (*p == '-') { mode = 2; p++; } if (!mode) k = 0; args = array_make(p, ",", 0, 1, 0); for (i = 0; args[i]; i++) { int j, found = 0; for (j = 0; v->map[j].label; j++) { if (!xstrcasecmp(args[i], v->map[j].label)) { found = 1; if (mode == 2) k &= ~(v->map[j].value); if (mode == 1) k &= ~(v->map[j].conflicts); if (mode == 1 || !mode) k |= v->map[j].value; } } if (!found) { g_strfreev(args); return -2; } } g_strfreev(args); value = ekg_itoa(k); } p = value; if ((hex = !xstrncasecmp(p, "0x", 2))) p += 2; while (*p && *p != ' ') { if (hex && !xisxdigit(*p)) return -2; if (!hex && !xisdigit(*p)) return -2; p++; } tmp = strtol(value, NULL, 0); if (v->map) { int i; for (i = 0; v->map[i].label; i++) { if ((tmp & v->map[i].value) && (tmp & v->map[i].conflicts)) return -2; } } changed = (*(int*)(v->ptr) != tmp); *(int*)(v->ptr) = tmp; break; } case VAR_BOOL: { int tmp; if (!value) return -2; if ((tmp = on_off(value)) == -1) return -2; changed = (*(int*)(v->ptr) != tmp); *(int*)(v->ptr) = tmp; break; } case VAR_THEME: case VAR_FILE: case VAR_DIR: case VAR_STR: { char **tmp = (char**)(v->ptr); char *oldval = *tmp; if (value) { if (*value == 1) *tmp = base64_decode(value + 1); else *tmp = xstrdup(value); } else *tmp = NULL; changed = xstrcmp(oldval, *tmp); xfree(oldval); break; } default: return -1; } if (v->notify) (v->notify)(v->name); if (!changed) return 1; tmpname = xstrdup(v->name); query_emit(NULL, "variable-changed", &tmpname); xfree(tmpname); return 0; }