📄 chew.c
字号:
idx+=2; } else { catchar(&out, at(tos, idx)); idx++; } } delete_string(tos); *tos = out; pc++; }/* A command is all upper case,and alone on a line */static int DEFUN( iscommand,(ptr, idx), string_type *ptr AND unsigned int idx){ unsigned int len = 0; while (at(ptr,idx)) { if (isupper(at(ptr,idx)) || at(ptr,idx) == ' ' || at(ptr,idx) == '_') { len++; idx++; } else if(at(ptr,idx) == '\n') { if (len >4) return 1; return 0; } else return 0; } return 0;}DEFUN(copy_past_newline,(ptr, idx, dst), string_type *ptr AND unsigned int idx AND string_type *dst){ while (at(ptr, idx) && at(ptr, idx) != '\n') { catchar(dst, at(ptr, idx)); idx++; } catchar(dst, at(ptr, idx)); idx++; return idx;}WORD(icopy_past_newline){ tos++; init_string(tos); idx = copy_past_newline(ptr, idx, tos); pc++; }/* indent Take the string at the top of the stack, do some prettying */WORD(kill_bogus_lines){ int sl ; int nl = 0; int idx = 0; int c; int dot = 0 ; string_type out; init_string(&out); /* Drop leading nl */ while (at(tos,idx) == '\n') { idx++; } c = idx; /* Find the last char */ while (at(tos,idx)) { idx++; } /* find the last non white before the nl */ idx--; while (idx && isspace(at(tos,idx))) idx--; idx++; /* Copy buffer upto last char, but blank lines before and after dots don't count */ sl = 1; while (c < idx) { if (at(tos,c) == '\n' && at(tos,c+1) == '\n' && at(tos,c+2) == '.') { /* Ignore two newlines before a dot*/ c++; } else if (at(tos,c) == '.' && sl) { /* remember that this line started with a dot */ dot=2; } else if (at(tos,c) == '\n' && at(tos,c+1) == '\n' && dot) { c++; /* Ignore two newlines when last line was dot */ } catchar(&out, at(tos,c)); if (at(tos,c) == '\n') { sl = 1; if (dot == 2)dot=1;else dot = 0; } c++; } /* Append nl*/ catchar(&out, '\n'); pc++; delete_string(tos); *tos = out; }WORD(indent){ string_type out; int tab = 0; int idx = 0; int ol =0; init_string(&out); while (at(tos,idx)) { switch (at(tos,idx)) { case '\n': cattext(&out,"\n"); idx++; if (tab) { cattext(&out," "); } ol = 0; break; case '(': tab++; if (ol == 0) cattext(&out," "); idx++; cattext(&out,"("); ol = 1; break; case ')': tab--; cattext(&out,")"); idx++; ol=1; break; default: catchar(&out,at(tos,idx)); ol=1; idx++; break; } } pc++; delete_string(tos); *tos = out;}WORD(get_stuff_in_command){ tos++; init_string(tos); while (at(ptr, idx)) { if (iscommand(ptr, idx)) break; idx = copy_past_newline(ptr, idx, tos); }pc++; }WORD(swap){ string_type t; t = tos[0]; tos[0] = tos[-1]; tos[-1] =t; pc++; }WORD(other_dup){ tos++; init_string(tos); catstr(tos, tos-1); pc++; }WORD(icatstr){ catstr(tos-1, tos); delete_string(tos); tos--; pc++; }WORD(skip_past_newline){ while (at(ptr,idx) && at(ptr,idx) != '\n') idx++; idx++; pc++;}WORD(internalmode){ internal_mode = *(isp); isp--; pc++;}WORD(maybecatstr){ if (internal_wanted == internal_mode) { catstr(tos-1, tos); } delete_string(tos); tos--; pc++; }char *DEFUN(nextword,(string, word), char *string AND char **word){ char *word_start; int idx; char *dst; char *src; int length = 0; while (isspace(*string) || *string == '-') { if (*string == '-') { while (*string && *string != '\n') string++; } else { string++; } } if (!*string) return 0; word_start = string; if (*string == '"') { string++; length++; while (*string != '"') { string++; length++; } } else { while (!isspace(*string)) { string++; length++; } } *word = malloc(length + 1); dst = *word; src = word_start; for (idx= 0; idx < length; idx++) { if (src[idx] == '\\' && src[idx+1] == 'n') { *dst++ = '\n'; idx++; } else *dst++ = src[idx]; } *dst++ = 0; if(*string) return string + 1; else return 0; }dict_type *root;dict_type *DEFUN(lookup_word,(word), char *word){ dict_type *ptr = root; while (ptr) { if (strcmp(ptr->word, word) == 0) return ptr; ptr = ptr->next; } if (warning) fprintf(stderr,"Can't find %s\n",word); return 0; }static void DEFUN_VOID(perform){ tos = stack; while (at(ptr, idx)) { /* It's worth looking through the command list */ if (iscommand(ptr, idx)) { unsigned int i; int found = 0; char *next; dict_type *word ; (void) nextword(addr(ptr, idx), &next); word = lookup_word(next); if (word) { exec(word); } else { if (warning) fprintf(stderr,"warning, %s is not recognised\n", next); skip_past_newline(); } } else skip_past_newline(); }}dict_type *DEFUN(newentry,(word), char *word){ dict_type *new = (dict_type *)malloc(sizeof(dict_type)); new->word = word; new->next = root; root = new; new->code = (stinst_type *)malloc(sizeof(stinst_type )); new->code_length = 1; new->code_end = 0; return new; }unsigned intDEFUN(add_to_definition,(entry, word), dict_type *entry AND stinst_type word){ if (entry->code_end == entry->code_length) { entry->code_length += 2; entry->code = (stinst_type *) realloc((char *)(entry->code), entry->code_length *sizeof(word_type)); } entry->code[entry->code_end] = word; return entry->code_end++; }voidDEFUN(add_intrinsic,(name, func), char *name AND void (*func)()){ dict_type *new = newentry(name); add_to_definition(new, func); add_to_definition(new, 0);}WORD(push_addr){ }voidDEFUN(add_var,(name), char *name){ dict_type *new = newentry(name); add_to_definition(new, push_number); add_to_definition(new, (stinst_type)(&(new->var))); add_to_definition(new,0); } void DEFUN(compile, (string), char *string){ int jstack[STACK]; int *jptr = jstack; /* add words to the dictionary */ char *word; string = nextword(string, &word); while (string && *string && word[0]) { if (strcmp(word,"var")==0) { string=nextword(string, &word); add_var(word); string=nextword(string, &word); }else if (word[0] == ':') { dict_type *ptr; /* Compile a word and add to dictionary */ string = nextword(string, &word); ptr = newentry(word); string = nextword(string, &word); while (word[0] != ';' ) { switch (word[0]) { case '"': /* got a string, embed magic push string function */ add_to_definition(ptr, push_text); add_to_definition(ptr, (stinst_type)(word+1)); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* Got a number, embedd the magic push number function */ add_to_definition(ptr, push_number); add_to_definition(ptr, atol(word)); break; default: add_to_definition(ptr, call); add_to_definition(ptr, lookup_word(word)); } string = nextword(string, &word); } add_to_definition(ptr,0); string = nextword(string, &word); } else { fprintf(stderr,"syntax error at %s\n",string-1); } }} static void DEFUN_VOID(bang){*(int *)((isp[0])) = isp[-1];isp-=2;pc++;}WORD(atsign){ isp[0] = *(int *)(isp[0]); pc++;}WORD(hello){ printf("hello\n"); pc++; }static void DEFUN(read_in, (str, file), string_type *str AND FILE *file){ char buff[10000]; unsigned int r; do { r = fread(buff, 1, sizeof(buff), file); catbuf(str, buff, r); } while (r); buff[0] = 0; catbuf(str, buff,1); }static void DEFUN_VOID(usage){ fprintf(stderr,"usage: -[d|i|g] <file >file\n"); exit(33); }int DEFUN(main,(ac,av),int ac ANDchar *av[]){ unsigned int i; string_type buffer; string_type pptr; init_string(&buffer); init_string(&pptr); init_string(stack+0); tos=stack+1; ptr = &pptr; add_intrinsic("push_text", push_text); add_intrinsic("!", bang); add_intrinsic("@", atsign); add_intrinsic("hello",hello); add_intrinsic("skip_past_newline", skip_past_newline ); add_intrinsic("catstr", icatstr ); add_intrinsic("copy_past_newline", icopy_past_newline ); add_intrinsic("dup", other_dup ); add_intrinsic("remchar", remchar ); add_intrinsic("get_stuff_in_command", get_stuff_in_command ); add_intrinsic("do_fancy_stuff", do_fancy_stuff ); add_intrinsic("bulletize", bulletize ); add_intrinsic("courierize", courierize ); /* If the following line gives an error, exit() is not declared in the ../hosts/foo.h file for this host. Fix it there, not here! */ add_intrinsic("exit", exit ); add_intrinsic("swap", swap ); add_intrinsic("outputdots", outputdots ); add_intrinsic("exfunstuff", exfunstuff ); add_intrinsic("maybecatstr", maybecatstr ); add_intrinsic("translatecomments", translatecomments ); add_intrinsic("kill_bogus_lines", kill_bogus_lines); add_intrinsic("indent", indent); add_intrinsic("internalmode", internalmode); /* Put a nl at the start */ catchar(&buffer,'\n'); read_in(&buffer, stdin); remove_noncomments(&buffer, ptr); for (i= 1; i < ac; i++) { if (av[i][0] == '-') { if (av[i][1] == 'f') { string_type b; FILE *f; init_string(&b); f = fopen(av[i+1],"r"); if (!f) { fprintf(stderr,"Can't open the input file %s\n",av[i+1]); return 33; } read_in(&b, f); compile(b.ptr); perform(); } else if (av[i][1] == 'i') { internal_wanted = 1; } else if (av[i][1] == 'w') { warning = 1; } } } write_buffer(stack+0); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -