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

📄 mkmake.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
    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 + -