📄 mkmake.y
字号:
same_t *tmp; if (token == 0) { return 0; } if ((tmp = token->nexttoken) == token) { tmp = 0; } token->lasttoken->nexttoken = token->nexttoken; token->nexttoken->lasttoken = token->lasttoken; token->nexttoken = token->lasttoken = token; return tmp;}voidsame_replace(old, new)same_t *old, *new;{ new->lasttoken->nexttoken = old->nexttoken; old->nexttoken->lasttoken = new->lasttoken; new->lasttoken = old->lasttoken; /* rather than * old->lasttoken->nexttoken = new * we update in place (for the case where there isn't anything else) */ *old = *new;}same_t *same_char(ch)char ch;{ char buffer[2]; buffer[0] = ch; buffer[1] = 0; return same_item(string_lookup(buffer));}voidadd_target(target, actions)same_t *target, *actions;{ same_t *ptr; if ((ptr = same_search(targets, target)) == 0) { targets = same_cat(targets, target); ptr = target; } else { ptr->depend_list = same_cat(ptr->depend_list, target->depend_list); } if (actions) { if (ptr->action_list) { same_free(ptr->action_list); } ptr->action_list = same_copy(actions); }}same_t *add_targets_actions(target, actions)same_t *target, *actions;{ same_t *ptr; if (target == 0) { return 0; } do { ptr = same_unlink(target); add_target(target, actions); target = ptr; } while (target); same_free(actions); return 0;}same_t *add_depends(target, depends)same_t *target, *depends;{ same_t *original = target; depends = same_cat(depends, same_copy(blank)); /* Separator */ for (visit(original, target); !visited(target); visit_next(target)) { target->depend_list = same_cat(target->depend_list, same_copy(depends)); } visit_end(); same_free(depends); return original;}/* * We know that variable is a singleton */voidassign(variable, value)same_t *variable, *value;{ same_t *ptr; if ((ptr = same_search(variables, variable)) != 0) { same_free(ptr->value_list); variables = same_unlink(ptr); same_free(ptr); } variable->value_list = value; variables = same_cat(variables, variable);}same_t *value_of(variable)same_t *variable;{ same_t *ptr = same_search(variables, variable); if (ptr == 0) { return same_copy(null); } else { return same_copy(ptr->value_list); }}same_t *expand_variables(token, free)same_t *token;int free;{ same_t *head = 0; if (!free) { token = same_copy(token); /* Get our private copy */ } while (token) { char *string = token->string->string; same_t *tmp = same_unlink(token); if ((string[0] == '$') && (string[1] == '{')) { /* Expand time */ int len = strlen(string); string[len-1] = 0; head = same_cat(head, expand_variables( value_of(same_item(string_lookup(string+2))), 1)); string[len-1] = '}'; } else { head = same_cat(head, token); } token = tmp; } return head;}same_t *ws_merge(list)same_t *list;{ same_t *newlist = 0, *item; int what = 0; while (list) { switch (what) { case 0: if (isspace(list->string->string[0])) { ; } else { item = same_item(list->string); what = 1; } break; case 1: if (isspace(list->string->string[0])) { newlist = same_cat(newlist, item); item = 0; what = 0; } else { item = same_merge(item, same_item(list->string)); what = 1; } break; } list = same_unlink(list); } return same_cat(newlist, item);}same_t *variable(var_name)same_t *var_name;{ int length = strlen(var_name->string->string); same_t *resolved; char *newname; if ((newname = malloc(length+1+3)) == 0) { fprintf("Out of space for a variable name.\n"); exit(1); } newname[0] = '$'; newname[1] = '{'; strcpy(newname+2, var_name->string->string); strcat(newname, "}"); resolved = same_item(string_lookup(newname)); free(newname); return resolved;}same_t *shell_variable(var_name)same_t *var_name;{ int length = strlen(var_name->string->string); same_t *resolved; char *newname; if ((newname = malloc(length+1+2)) == 0) { fprintf("Out of space for a variable name.\n"); exit(1); } newname[0] = '$'; newname[1] = '$'; strcpy(newname+2, var_name->string->string); resolved = same_item(string_lookup(newname)); free(newname); return resolved;}same_t *for_statement(special, variable, list)same_t *special, *variable, *list;{ variable->shell_item = special; variable->value_list = list; return variable;}same_t *do_command(forlist, commands)same_t *forlist, *commands;{ same_t *special, *command_list = 0, *new_commands, *tmp, *shell_item, *value_list = forlist->value_list; char *tmpstr, *variable_name = forlist->string->string; special = forlist->shell_item; if (same_unlink(forlist->shell_item) != 0) { yyerror("Unexpected second item in special part of do_command"); exit(1); } while ((shell_item = value_list) != 0) { value_list = same_unlink(shell_item); /* Visit each item in commands. For each shell variable which * matches ours, replace it with ours. */ new_commands = same_copy(commands); for (visit(new_commands, tmp); !visited(tmp); visit_next(tmp)) { tmpstr = tmp->string->string; if ((tmpstr[0] == '$') && (tmpstr[1] == '$')) { if (strcmp(tmpstr+2, variable_name) == 0) { same_replace(tmp, same_copy(shell_item)); } } } visit_end(); command_list = same_cat(command_list, new_commands); } return same_cat(command_list, same_copy(newline));}intGetchar(){ if (last_saved) { last_saved = 0; return last_char; } else { int c; c = getchar(); switch (c) { case '\n': lineno++; column = 0; break; default: column++; } return c; }}inttoken_type(string)char *string;{ switch (string[0]) { case 'f': if (strcmp(string, "for") == 0) { return FOR; } break; case 'd': if (string[1] == 'o') { if (strcmp(string, "do") == 0) { return DO; } else if (strcmp(string, "done") == 0) { return DONE; } } break; case 'i': if (strcmp(string, "in") == 0) { return IN; } break; default: break; } return TOKEN;}yylex(){#define ret_token(c) if (bufptr != buffer) { \ save(c); \ *bufptr = 0; \ bufptr = buffer; \ yylval.string = string_lookup(buffer); \ return token_type(buffer); \ }#define save(c) { last_char = c; last_saved = 1; }#if defined(YYDEBUG)#define Return(c) if (yydebug) { \ printf("[%d]", c); \ fflush(stdout); \ } \ yyval.intval = c; \ return c;#else /* defined(YYDEBUG) */#define Return(y,c) { yylval.intval = c; return y; }#endif /* defined(YYDEBUG) */ static char buffer[500], *bufptr = buffer; static int eof_found = 0; int c; if (eof_found != 0) { eof_found++; if (eof_found > 2) { fprintf(stderr, "End of file ignored.\n"); exit(1); } Return(EOF,0); } while ((c = Getchar()) != EOF) { switch (c) { case '#': ret_token(c); while (((c = Getchar()) != EOF) && (c != '\n')) { ; } save(c); break; case '<': case '?': ret_token(c); Return(MACRO_CHAR, c); case '\t': case ' ': ret_token(c); Return(WHITE_SPACE, c); case '-': case '@': case ':': case ';': case '=': case '$': case '{': case '}': case '(': case ')': ret_token(c); Return(c,c); case '\'': case '"': if (bufptr != buffer) { if (bufptr[-1] == '\\') { bufptr[-1] = c; } break; } else { int newc; ret_token(c); *bufptr++ = c; while (((newc = Getchar()) != EOF) && (newc != c)) { *bufptr++ = newc; } *bufptr++ = c; *bufptr = 0; bufptr = buffer; yylval.string = string_lookup(buffer); return QUOTED_STRING; } case '\n': if (bufptr != buffer) { if (bufptr[-1] == '\\') { bufptr--; if ((c = Getchar()) != '\t') { yyerror("continuation line doesn't begin with a tab"); save(c); } ret_token(c); Return(WHITE_SPACE, c); } } ret_token(c); Return(NL, 0); default: *bufptr++ = c; break; } } eof_found = 1; ret_token(' '); Return(EOF, 0);}main(){#define YYDEBUG extern int yydebug; null = same_item(string_lookup("")); newline = same_item(string_lookup("\n")); blank = same_item(string_lookup(" ")); cwd_line = same_cat(same_copy(newline), same_cat(same_item(string_lookup("cd ${CWD}")), same_copy(newline))); yyparse(); do_dump(); return 0;}#if defined(YYDEBUG)dump_same(same)same_t *same;{ same_t *same2; for (visit(same, same2); !visited(same2); visit_next(same2)) { printf(same2->string->string); } visit_end();}#endif /* YYDEBUG */do_dump(){ string_t *string; same_t *same, *same2; if (yydebug > 1) { printf("strings...\n"); for (string = strings; string; string = string->next) { printf("\t%s\n", string->string); } } printf("# variables...\n"); for (visit(variables, same); !visited(same); visit_next(same)) { printf("%s =\t", same->string->string); for (visit(same->value_list, same2); !visited(same2); visit_next(same2)) { printf(same2->string->string); } visit_end(); printf("\n"); } visit_end(); printf("\n\n#targets...\n"); for (visit(targets, same); !visited(same); visit_next(same)) { printf("\n%s:\t", same->string->string); for (visit(same->depend_list, same2); !visited(same2); visit_next(same2)) { printf(same2->string->string); } visit_end(); printf("\n\t"); for (visit(same->action_list, same2); !visited(same2); visit_next(same2)) { printf(same2->string->string); if (same2->string->string[0] == '\n') { printf("\t"); } } visit_end(); printf("\n"); } visit_end();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -