Annotation of 43BSDReno/usr.bin/tn3270/tools/mkmake.y, revision 1.1

1.1     ! root        1: %{
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 1988 Regents of the University of California.
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms are permitted
        !             8:  * provided that the above copyright notice and this paragraph are
        !             9:  * duplicated in all such forms and that any documentation,
        !            10:  * advertising materials, and other materials related to such
        !            11:  * distribution and use acknowledge that the software was developed
        !            12:  * by the University of California, Berkeley.  The name of the
        !            13:  * University may not be used to endorse or promote products derived
        !            14:  * from this software without specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            16:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            17:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  *
        !            19:  *     @(#)mkmake.y    4.1 (Berkeley) 12/4/88
        !            20:  */
        !            21: 
        !            22: typedef struct string {
        !            23:     int
        !            24:        hashval,
        !            25:        length;
        !            26:     char
        !            27:        *string;
        !            28:     struct string
        !            29:        *next;
        !            30: } string_t;
        !            31: 
        !            32: /*
        !            33:  * The deal with these is that they exist on various lists.
        !            34:  *
        !            35:  * First off, they are on a temporary list during the time they
        !            36:  * are in the active focus of the parser.
        !            37:  *
        !            38:  * Secondly, they live on one of three queues:
        !            39:  *     1.  Variables
        !            40:  *     2.  Targets
        !            41:  *     3.  Actions
        !            42:  * (and, we restrict any given one to live on one and only one such list)
        !            43:  *
        !            44:  * Also, they may live on the list of values for someone else's variable,
        !            45:  * or as someone's dependancy.
        !            46:  */
        !            47: 
        !            48: typedef struct same {
        !            49:     string_t
        !            50:        *string;                        /* My name */
        !            51:     struct same
        !            52:        *nexttoken,                     /* Next pointer */
        !            53:        *lasttoken,                     /* Back pointer */
        !            54:        *depend_list,                   /* If target, dependancies */
        !            55:        *action_list,                   /* If target, actions */
        !            56:        *value_list,                    /* If variable, value list */
        !            57:        *shell_item;                    /* If a shell variable, current value */
        !            58: } same_t;
        !            59: 
        !            60: %}
        !            61: 
        !            62: %union {
        !            63:     string_t *string;
        !            64:     same_t *same;
        !            65:     int        intval;
        !            66:     }
        !            67: 
        !            68: %start makefile
        !            69: %token <string> TOKEN QUOTED_STRING
        !            70: %token <intval>        FOR IN DO DONE
        !            71: %token <intval> MACRO_CHAR NL WHITE_SPACE
        !            72: %token <intval> ':' '=' '$' '{' '}' ';' '-' '@' '(' ')' ' ' '\t'
        !            73: %type <same> target target1 assignment assign1 actions action
        !            74: %type <same> command_list list list_element
        !            75: %type <same> for_statement maybe_at_minus tokens token
        !            76: %type <same> maybe_white_space
        !            77: %type <intval> white_space macro_char
        !            78: %%
        !            79: 
        !            80: makefile : lines;
        !            81: 
        !            82: lines : line
        !            83:     | lines line
        !            84:     ;
        !            85: 
        !            86: line : NL
        !            87:     | assignment
        !            88:     | target_action
        !            89:     ;
        !            90: 
        !            91: assignment : assign1 tokens NL
        !            92:     {
        !            93:        assign($1, $2);
        !            94:     }
        !            95:     | assign1 NL
        !            96:     {
        !            97:        assign($1, same_copy(null));
        !            98:     }
        !            99:     ;
        !           100: 
        !           101: assign1: token maybe_white_space '=' maybe_white_space
        !           102:     ;
        !           103: 
        !           104: target_action: target actions
        !           105:     {
        !           106:        add_targets_actions($1, $2);
        !           107:     }
        !           108:     | target
        !           109:     {
        !           110:        add_targets_actions($1, 0);
        !           111:     }
        !           112:     ;
        !           113: 
        !           114: target : target1 tokens NL
        !           115:     {
        !           116:        $$ = add_depends($1, $2);
        !           117:     }
        !           118:     | target1 NL
        !           119:     {
        !           120:        $$ = add_depends($1, same_copy(null));
        !           121:     }
        !           122:     ;
        !           123: 
        !           124: target1: tokens maybe_white_space ':' maybe_white_space
        !           125:     {
        !           126:        $$ = ws_merge($1);
        !           127:     }
        !           128:     ;
        !           129: 
        !           130: actions: action
        !           131:     | actions action
        !           132:     {
        !           133:        $$ = same_cat(same_cat($1, same_copy(newline)), $2);
        !           134:     }
        !           135:     ;
        !           136: 
        !           137: action:        white_space command_list NL
        !           138:     {
        !           139:        $$ = $2;
        !           140:     }
        !           141:     | white_space for_statement do command_list semi_colon done NL
        !           142:     {
        !           143:        $$ = do_command($2, $4);
        !           144:     }
        !           145:     ;
        !           146: 
        !           147: for_statement: maybe_at_minus FOR white_space token
        !           148:                in tokens semi_colon
        !           149:     {
        !           150:        $$ = for_statement($1, $4, ws_merge(expand_variables($6, 0)));
        !           151:     }
        !           152:     ;
        !           153: 
        !           154: in:    white_space IN white_space
        !           155: do:    white_space DO white_space
        !           156:     ;
        !           157: 
        !           158: done:  white_space DONE
        !           159:     ;
        !           160: 
        !           161: semi_colon:    ';'
        !           162:     ;
        !           163: 
        !           164: command_list: list
        !           165:     | '(' list maybe_white_space ')'
        !           166:     {
        !           167:        $$ = same_cat($2, same_copy(cwd_line));
        !           168:     }
        !           169:     ;
        !           170: 
        !           171: list: token
        !           172:     | list list_element
        !           173:     {
        !           174:        $$ = same_cat($1, $2);
        !           175:     }
        !           176:     | list white_space list_element
        !           177:     {
        !           178:        $$ = same_cat($1, same_cat(same_copy(blank), $3));
        !           179:     }
        !           180:     ;
        !           181: 
        !           182: list_element: token
        !           183:     | semi_colon
        !           184:     {
        !           185:        $$ = same_copy(newline);
        !           186:     }
        !           187:     ;
        !           188: 
        !           189: maybe_at_minus: /* empty */
        !           190:     {
        !           191:        $$ = same_copy(null);
        !           192:     }
        !           193:     | '@'
        !           194:     {
        !           195:        char buffer[2];
        !           196: 
        !           197:        buffer[0] = $1;
        !           198:        buffer[1] = 0;
        !           199:        $$ = same_item(string_lookup(buffer));
        !           200:     }
        !           201:     | '-'
        !           202:     {
        !           203:        char buffer[2];
        !           204: 
        !           205:        buffer[0] = $1;
        !           206:        buffer[1] = 0;
        !           207:        $$ = same_item(string_lookup(buffer));
        !           208:     }
        !           209:     ;
        !           210: 
        !           211: tokens : token
        !           212:     | tokens maybe_white_space token
        !           213:     {
        !           214:        $$ = same_cat($1, same_cat($2, $3));
        !           215:     }
        !           216:     ;
        !           217: 
        !           218: token: TOKEN
        !           219:     {
        !           220:        $$ = same_item($1);
        !           221:     }
        !           222:     | QUOTED_STRING
        !           223:     {
        !           224:        $$ = same_item($1);
        !           225:     }
        !           226:     | '$' macro_char
        !           227:     {
        !           228:        char buffer[3];
        !           229: 
        !           230:        buffer[0] = '$';
        !           231:        buffer[1] = $2;
        !           232:        buffer[2] = 0;
        !           233: 
        !           234:        $$ = same_item(string_lookup(buffer));
        !           235:     }
        !           236:     | '$' '$' TOKEN
        !           237:     {
        !           238:        $$ = shell_variable(same_item($3));
        !           239:     }
        !           240:     | MACRO_CHAR
        !           241:     {
        !           242:        $$ = same_char($1);
        !           243:     }
        !           244:     | '$' '{' TOKEN '}'
        !           245:     {
        !           246:        $$ = variable(same_item($3));
        !           247:     }
        !           248:     | '$' '(' TOKEN ')'
        !           249:     {
        !           250:        $$ = variable(same_item($3));
        !           251:     }
        !           252:     | '$' TOKEN
        !           253:     {
        !           254:        $$ = variable(same_item($2));
        !           255:     }
        !           256:     | '-'
        !           257:     {
        !           258:        $$ = same_char('-');
        !           259:     }
        !           260:     | '@'
        !           261:     {
        !           262:        $$ = same_char('@');
        !           263:     }
        !           264:     ;
        !           265: 
        !           266: macro_char: MACRO_CHAR
        !           267:     | '@'
        !           268:     ;
        !           269: 
        !           270: maybe_white_space:
        !           271:     {
        !           272:        $$ = same_copy(null);
        !           273:     }
        !           274:     | white_space
        !           275:     {
        !           276:        $$ = same_char($1);
        !           277:     }
        !           278:     ;
        !           279: 
        !           280: white_space : WHITE_SPACE
        !           281:     | white_space WHITE_SPACE
        !           282:     ;
        !           283: %%
        !           284: #include <stdio.h>
        !           285: #include <ctype.h>
        !           286: 
        !           287: static int last_char, last_saved = 0;
        !           288: static int column = 0, lineno = 1;
        !           289: 
        !           290: 
        !           291: static string_t
        !           292:     *strings = 0;
        !           293: 
        !           294: static same_t
        !           295:     *shell_variables = 0,
        !           296:     *shell_special = 0,
        !           297:     *variables = 0,
        !           298:     *targets = 0,
        !           299:     *actions = 0;
        !           300: 
        !           301: static same_t
        !           302:     *null,
        !           303:     *blank,
        !           304:     *cwd_line,
        !           305:     *newline;
        !           306: 
        !           307: extern char *malloc();
        !           308: 
        !           309: static unsigned int
        !           310:        clock = -1;
        !           311: 
        !           312: struct {
        !           313:     same_t *first;
        !           314:     int next;
        !           315: } visit_stack[20];             /* 20 maximum */
        !           316: 
        !           317: #define        visit(what,via) \
        !           318:        (visit_stack[++clock].next = 0, visit_stack[clock].first = via = what)
        !           319: #define        visited(via)    (visitcheck(via) || ((via) == 0) \
        !           320:        || (visit_stack[clock].next && (via == visit_stack[clock].first)))
        !           321: #define        visit_next(via) (visit_stack[clock].next = 1, (via) = (via)->nexttoken)
        !           322: #define        visit_end()     (clock--)
        !           323: 
        !           324: yyerror(s)
        !           325: char *s;
        !           326: {
        !           327:     fprintf(stderr, "line %d, character %d: %s\n", lineno, column, s);
        !           328:     do_dump();
        !           329: }
        !           330: 
        !           331: int
        !           332: visitcheck(same)
        !           333: same_t *same;
        !           334: {
        !           335:     if (same->string == 0) {
        !           336:        yyerror("BUG - freed 'same' in use...");
        !           337:        exit(1);
        !           338:     }
        !           339:     return 0;
        !           340: }
        !           341: 
        !           342: int
        !           343: string_hashof(string, length)
        !           344: char *string;
        !           345: int length;
        !           346: {
        !           347:     register int i = 0;
        !           348: 
        !           349:     while (length--) {
        !           350:        i = (i<<3) + *string ^ ((i>>28)&0x7);
        !           351:     }
        !           352:     return i;
        !           353: }
        !           354: 
        !           355: int
        !           356: string_same(s1, s2)
        !           357: string_t
        !           358:     *s1, *s2;
        !           359: {
        !           360:     if ((s1->hashval == s2->hashval) && (s1->length == s2->length)
        !           361:                && (memcmp(s1->string, s2->string, s1->length) == 0)) {
        !           362:        return 1;
        !           363:     } else {
        !           364:        return 0;
        !           365:     }
        !           366: }
        !           367: 
        !           368: string_t *
        !           369: string_lookup(string)
        !           370: char *string;
        !           371: {
        !           372:     string_t ours;
        !           373:     string_t *ptr;
        !           374: 
        !           375:     ours.length = strlen(string);
        !           376:     ours.hashval = string_hashof(string, ours.length);
        !           377:     ours.string = string;
        !           378: 
        !           379:     for (ptr = strings; ptr; ptr = ptr->next) {
        !           380:        if (string_same(&ours, ptr)) {
        !           381:            return ptr;
        !           382:        }
        !           383:     }
        !           384:     if ((ptr = (string_t *)malloc(sizeof *ptr)) == 0) {
        !           385:        fprintf(stderr, "No space to add string *%s*!\n", string);
        !           386:        exit(1);
        !           387:     }
        !           388:     ptr->hashval = ours.hashval;
        !           389:     ptr->length = ours.length;
        !           390:     if ((ptr->string = malloc(ours.length+1)) == 0) {
        !           391:        fprintf(stderr, "No space to add literal *%s*!\n", string);
        !           392:        exit(1);
        !           393:     }
        !           394:     memcpy(ptr->string, string, ours.length+1);
        !           395:     ptr->next = strings;
        !           396:     strings = ptr;
        !           397:     return ptr;
        !           398: }
        !           399: 
        !           400: #define        same_singleton(s)       ((s)->nexttoken == (s))
        !           401: 
        !           402: same_t *
        !           403: same_search(list, token)
        !           404: same_t
        !           405:     *list,
        !           406:     *token;
        !           407: {
        !           408:     same_t *ptr;
        !           409: 
        !           410:     ptr = list;
        !           411:     for (visit(list, ptr); !visited(ptr); visit_next(ptr)) {
        !           412:        string_t *string;
        !           413: 
        !           414:        string = ptr->string;
        !           415:        if (string_same(string, token->string)) {
        !           416:            visit_end();
        !           417:            return ptr;
        !           418:        }
        !           419:     }
        !           420:     visit_end();
        !           421:     return 0;
        !           422: }
        !           423: 
        !           424: same_t *
        !           425: same_cat(list, tokens)
        !           426: same_t
        !           427:     *list,
        !           428:     *tokens;
        !           429: {
        !           430:     same_t *last;
        !           431: 
        !           432:     if (tokens == 0) {
        !           433:        return list;
        !           434:     }
        !           435:     if (list) {
        !           436:        last = tokens->lasttoken;
        !           437:        tokens->lasttoken = list->lasttoken;
        !           438:        list->lasttoken = last;
        !           439:        tokens->lasttoken->nexttoken = tokens;
        !           440:        last->nexttoken = list;
        !           441:        return list;
        !           442:     } else {
        !           443:        return tokens;
        !           444:     }
        !           445: }
        !           446: 
        !           447: same_t *
        !           448: same_item(string)
        !           449: string_t *string;
        !           450: {
        !           451:     same_t *ptr;
        !           452: 
        !           453:     if ((ptr = (same_t *)malloc(sizeof *ptr)) == 0) {
        !           454:        fprintf(stderr, "No more space for tokens!\n");
        !           455:        exit(1);
        !           456:     }
        !           457:     memset((char *)ptr, 0, sizeof *ptr);
        !           458:     ptr->nexttoken = ptr->lasttoken = ptr;
        !           459:     ptr->string = string;
        !           460:     return ptr;
        !           461: }
        !           462: 
        !           463: same_t *
        !           464: same_copy(same)
        !           465: same_t *same;
        !           466: {
        !           467:     same_t *head, *copy;
        !           468: 
        !           469:     head = 0;
        !           470:     for (visit(same, copy); !visited(copy); visit_next(copy)) {
        !           471:        same_t *ptr;
        !           472: 
        !           473:        ptr = same_item(copy->string);
        !           474:        head = same_cat(head, ptr);
        !           475:     }
        !           476:     visit_end();
        !           477:     return head;
        !           478: }
        !           479: 
        !           480: 
        !           481: same_t *
        !           482: same_merge(t1, t2)
        !           483: same_t
        !           484:     *t1,
        !           485:     *t2;
        !           486: {
        !           487:     if (same_singleton(t1) && same_singleton(t2)) {
        !           488:        int length = strlen(t1->string->string)+strlen(t2->string->string);
        !           489:        char *buffer = malloc(length+1);
        !           490:        same_t *value;
        !           491: 
        !           492:        if (buffer == 0) {
        !           493:            yyerror("No space to merge strings in same_merge!");
        !           494:            exit(1);
        !           495:        }
        !           496:        strcpy(buffer, t1->string->string);
        !           497:        strcat(buffer, t2->string->string);
        !           498:        value = same_item(string_lookup(buffer));
        !           499:        free(buffer);
        !           500:        return value;
        !           501:     } else {
        !           502:        yyerror("Internal error - same_merge with non-singletons");
        !           503:        exit(1);
        !           504:     }
        !           505: }
        !           506: 
        !           507: 
        !           508: void
        !           509: same_free(list)
        !           510: same_t *list;
        !           511: {
        !           512:     same_t *token, *ptr;
        !           513: 
        !           514:     if (list == 0) {
        !           515:        return;
        !           516:     }
        !           517: 
        !           518:     token = list;
        !           519:     do {
        !           520:        ptr = token->nexttoken;
        !           521:        token->string = 0;
        !           522:        (void) free((char *)token);
        !           523:        token = ptr;
        !           524:     } while (token != list);
        !           525: }
        !           526: 
        !           527: same_t *
        !           528: same_unlink(token)
        !           529: same_t
        !           530:     *token;
        !           531: {
        !           532:     same_t *tmp;
        !           533: 
        !           534:     if (token == 0) {
        !           535:        return 0;
        !           536:     }
        !           537:     if ((tmp = token->nexttoken) == token) {
        !           538:        tmp = 0;
        !           539:     }
        !           540:     token->lasttoken->nexttoken = token->nexttoken;
        !           541:     token->nexttoken->lasttoken = token->lasttoken;
        !           542:     token->nexttoken = token->lasttoken = token;
        !           543:     return tmp;
        !           544: }
        !           545: 
        !           546: void
        !           547: same_replace(old, new)
        !           548: same_t
        !           549:     *old,
        !           550:     *new;
        !           551: {
        !           552:     new->lasttoken->nexttoken = old->nexttoken;
        !           553:     old->nexttoken->lasttoken = new->lasttoken;
        !           554:     new->lasttoken = old->lasttoken;
        !           555:     /* rather than
        !           556:      * old->lasttoken->nexttoken = new
        !           557:      * we update in place (for the case where there isn't anything else)
        !           558:      */
        !           559:     *old = *new;
        !           560: }
        !           561: 
        !           562: 
        !           563: same_t *
        !           564: same_char(ch)
        !           565: char ch;
        !           566: {
        !           567:     char buffer[2];
        !           568: 
        !           569:     buffer[0] = ch;
        !           570:     buffer[1] = 0;
        !           571: 
        !           572:     return same_item(string_lookup(buffer));
        !           573: }
        !           574: 
        !           575: 
        !           576: void
        !           577: add_target(target, actions)
        !           578: same_t
        !           579:     *target,
        !           580:     *actions;
        !           581: {
        !           582:     same_t *ptr;
        !           583: 
        !           584:     if ((ptr = same_search(targets, target)) == 0) {
        !           585:        targets = same_cat(targets, target);
        !           586:        ptr = target;
        !           587:     } else {
        !           588:        ptr->depend_list = same_cat(ptr->depend_list, target->depend_list);
        !           589:     }
        !           590:     if (actions) {
        !           591:        if (ptr->action_list) {
        !           592:            same_free(ptr->action_list);
        !           593:        }
        !           594:        ptr->action_list = same_copy(actions);
        !           595:     }
        !           596: }
        !           597: 
        !           598: 
        !           599: same_t *
        !           600: add_targets_actions(target, actions)
        !           601: same_t
        !           602:     *target,
        !           603:     *actions;
        !           604: {
        !           605:     same_t *ptr;
        !           606: 
        !           607:     if (target == 0) {
        !           608:        return 0;
        !           609:     }
        !           610:     do {
        !           611:        ptr = same_unlink(target);
        !           612:        add_target(target, actions);
        !           613:        target = ptr;
        !           614:     } while (target);
        !           615: 
        !           616:     same_free(actions);
        !           617:     return 0;
        !           618: }
        !           619: 
        !           620: same_t *
        !           621: add_depends(target, depends)
        !           622: same_t
        !           623:     *target,
        !           624:     *depends;
        !           625: {
        !           626:     same_t *original = target;
        !           627: 
        !           628:     depends = same_cat(depends, same_copy(blank));     /* Separator */
        !           629: 
        !           630:     for (visit(original, target); !visited(target); visit_next(target)) {
        !           631:        target->depend_list = same_cat(target->depend_list, same_copy(depends));
        !           632:     }
        !           633:     visit_end();
        !           634:     same_free(depends);
        !           635: 
        !           636:     return original;
        !           637: }
        !           638: 
        !           639: 
        !           640: /*
        !           641:  * We know that variable is a singleton
        !           642:  */
        !           643: 
        !           644: void
        !           645: assign(variable, value)
        !           646: same_t
        !           647:     *variable,
        !           648:     *value;
        !           649: {
        !           650:     same_t *ptr;
        !           651: 
        !           652:     if ((ptr = same_search(variables, variable)) != 0) {
        !           653:        same_free(ptr->value_list);
        !           654:        variables = same_unlink(ptr);
        !           655:        same_free(ptr);
        !           656:     }
        !           657:     variable->value_list = value;
        !           658:     variables = same_cat(variables, variable);
        !           659: }
        !           660: 
        !           661: same_t *
        !           662: value_of(variable)
        !           663: same_t *variable;
        !           664: {
        !           665:     same_t *ptr = same_search(variables, variable);
        !           666: 
        !           667:     if (ptr == 0) {
        !           668:        return same_copy(null);
        !           669:     } else {
        !           670:        return same_copy(ptr->value_list);
        !           671:     }
        !           672: }
        !           673: 
        !           674: 
        !           675: same_t *
        !           676: expand_variables(token, free)
        !           677: same_t *token;
        !           678: int    free;
        !           679: {
        !           680:     same_t *head = 0;
        !           681: 
        !           682:     if (!free) {
        !           683:        token = same_copy(token);               /* Get our private copy */
        !           684:     }
        !           685: 
        !           686:     while (token) {
        !           687:        char *string = token->string->string;
        !           688:        same_t *tmp = same_unlink(token);
        !           689: 
        !           690:        if ((string[0] == '$') && (string[1] == '{')) { /* Expand time */
        !           691:            int len = strlen(string);
        !           692: 
        !           693:            string[len-1] = 0;
        !           694:            head = same_cat(head, expand_variables(
        !           695:                        value_of(same_item(string_lookup(string+2))), 1));
        !           696:            string[len-1] = '}';
        !           697:        } else {
        !           698:            head = same_cat(head, token);
        !           699:        }
        !           700:        token = tmp;
        !           701:     }
        !           702:     return head;
        !           703: }
        !           704: 
        !           705: 
        !           706: same_t *
        !           707: ws_merge(list)
        !           708: same_t *list;
        !           709: {
        !           710:     same_t *newlist = 0, *item;
        !           711:     int what = 0;
        !           712: 
        !           713:     while (list) {
        !           714:        switch (what) {
        !           715:        case 0:
        !           716:            if (isspace(list->string->string[0])) {
        !           717:                ;
        !           718:            } else {
        !           719:                item = same_item(list->string);
        !           720:                what = 1;
        !           721:            }
        !           722:            break;
        !           723:        case 1:
        !           724:            if (isspace(list->string->string[0])) {
        !           725:                newlist = same_cat(newlist, item);
        !           726:                item = 0;
        !           727:                what = 0;
        !           728:            } else {
        !           729:                item = same_merge(item, same_item(list->string));
        !           730:                what = 1;
        !           731:            }
        !           732:            break;
        !           733:        }
        !           734:        list = same_unlink(list);
        !           735:     }
        !           736:     return same_cat(newlist, item);
        !           737: }
        !           738: 
        !           739: 
        !           740: same_t *
        !           741: variable(var_name)
        !           742: same_t *var_name;
        !           743: {
        !           744:     int length = strlen(var_name->string->string);
        !           745:     same_t *resolved;
        !           746:     char *newname;
        !           747: 
        !           748:     if ((newname = malloc(length+1+3)) == 0) {
        !           749:        fprintf("Out of space for a variable name.\n");
        !           750:        exit(1);
        !           751:     }
        !           752:     newname[0] = '$';
        !           753:     newname[1] = '{';
        !           754:     strcpy(newname+2, var_name->string->string);
        !           755:     strcat(newname, "}");
        !           756:     resolved = same_item(string_lookup(newname));
        !           757:     free(newname);
        !           758: 
        !           759:     return resolved;
        !           760: }
        !           761: 
        !           762: 
        !           763: same_t *
        !           764: shell_variable(var_name)
        !           765: same_t *var_name;
        !           766: {
        !           767:     int length = strlen(var_name->string->string);
        !           768:     same_t *resolved;
        !           769:     char *newname;
        !           770: 
        !           771:     if ((newname = malloc(length+1+2)) == 0) {
        !           772:        fprintf("Out of space for a variable name.\n");
        !           773:        exit(1);
        !           774:     }
        !           775:     newname[0] = '$';
        !           776:     newname[1] = '$';
        !           777:     strcpy(newname+2, var_name->string->string);
        !           778:     resolved = same_item(string_lookup(newname));
        !           779:     free(newname);
        !           780: 
        !           781:     return resolved;
        !           782: }
        !           783: 
        !           784: same_t *
        !           785: for_statement(special, variable, list)
        !           786: same_t
        !           787:     *special,
        !           788:     *variable,
        !           789:     *list;
        !           790: {
        !           791:     variable->shell_item = special;
        !           792:     variable->value_list = list;
        !           793:     return variable;
        !           794: }
        !           795: 
        !           796: same_t *
        !           797: do_command(forlist, commands)
        !           798: same_t
        !           799:     *forlist,
        !           800:     *commands;
        !           801: {
        !           802:     same_t
        !           803:        *special,
        !           804:        *command_list = 0,
        !           805:        *new_commands,
        !           806:        *tmp,
        !           807:        *shell_item,
        !           808:        *value_list = forlist->value_list;
        !           809:     char
        !           810:        *tmpstr,
        !           811:        *variable_name = forlist->string->string;
        !           812: 
        !           813:     special = forlist->shell_item;
        !           814:     if (same_unlink(forlist->shell_item) != 0) {
        !           815:        yyerror("Unexpected second item in special part of do_command");
        !           816:        exit(1);
        !           817:     }
        !           818: 
        !           819:     while ((shell_item = value_list) != 0) {
        !           820:        value_list = same_unlink(shell_item);
        !           821:        /* Visit each item in commands.  For each shell variable which
        !           822:         * matches ours, replace it with ours.
        !           823:         */
        !           824:        new_commands = same_copy(commands);
        !           825:        for (visit(new_commands, tmp); !visited(tmp); visit_next(tmp)) {
        !           826:            tmpstr = tmp->string->string;
        !           827:            if ((tmpstr[0] == '$') && (tmpstr[1] == '$')) {
        !           828:                if (strcmp(tmpstr+2, variable_name) == 0) {
        !           829:                    same_replace(tmp, same_copy(shell_item));
        !           830:                }
        !           831:            }
        !           832:        }
        !           833:        visit_end();
        !           834:        command_list = same_cat(command_list, new_commands);
        !           835:     }
        !           836:     return same_cat(command_list, same_copy(newline));
        !           837: }
        !           838: 
        !           839: 
        !           840: int
        !           841: Getchar()
        !           842: {
        !           843:     if (last_saved) {
        !           844:        last_saved = 0;
        !           845:        return last_char;
        !           846:     } else {
        !           847:        int c;
        !           848:        c = getchar();
        !           849:        switch (c) {
        !           850:        case '\n':
        !           851:            lineno++;
        !           852:            column = 0;
        !           853:            break;
        !           854:        default:
        !           855:            column++;
        !           856:        }
        !           857:        return c;
        !           858:     }
        !           859: }
        !           860: 
        !           861: 
        !           862: int
        !           863: token_type(string)
        !           864: char *string;
        !           865: {
        !           866:     switch (string[0]) {
        !           867:     case 'f':
        !           868:        if (strcmp(string, "for") == 0) {
        !           869:            return FOR;
        !           870:        }
        !           871:        break;
        !           872:     case 'd':
        !           873:        if (string[1] == 'o') {
        !           874:            if (strcmp(string, "do") == 0) {
        !           875:                return DO;
        !           876:            } else if (strcmp(string, "done") == 0) {
        !           877:                return DONE;
        !           878:            }
        !           879:        }
        !           880:        break;
        !           881:     case 'i':
        !           882:        if (strcmp(string, "in") == 0) {
        !           883:            return IN;
        !           884:        }
        !           885:        break;
        !           886:     default:
        !           887:        break;
        !           888:     }
        !           889:     return TOKEN;
        !           890: }
        !           891: 
        !           892: 
        !           893: yylex()
        !           894: {
        !           895: #define        ret_token(c)    if (bufptr != buffer) { \
        !           896:                            save(c); \
        !           897:                            *bufptr = 0; \
        !           898:                            bufptr = buffer; \
        !           899:                            yylval.string = string_lookup(buffer); \
        !           900:                            return token_type(buffer); \
        !           901:                        }
        !           902: #define        save(c) { last_char = c; last_saved = 1; }
        !           903: #if    defined(YYDEBUG)
        !           904: #define        Return(c)       if (yydebug) { \
        !           905:                            printf("[%d]", c); \
        !           906:                            fflush(stdout); \
        !           907:                        } \
        !           908:                        yyval.intval = c; \
        !           909:                        return c;
        !           910: #else  /* defined(YYDEBUG) */
        !           911: #define        Return(y,c)     { yylval.intval = c; return y; }
        !           912: #endif /* defined(YYDEBUG) */
        !           913: 
        !           914: 
        !           915:     static char buffer[500], *bufptr = buffer;
        !           916:     static int eof_found = 0;
        !           917:     int c;
        !           918: 
        !           919:     if (eof_found != 0) {
        !           920:        eof_found++;
        !           921:        if (eof_found > 2) {
        !           922:            fprintf(stderr, "End of file ignored.\n");
        !           923:            exit(1);
        !           924:        }
        !           925:        Return(EOF,0);
        !           926:     }
        !           927:     while ((c = Getchar()) != EOF) {
        !           928:        switch (c) {
        !           929:        case '#':
        !           930:            ret_token(c);
        !           931:            while (((c = Getchar()) != EOF) && (c != '\n')) {
        !           932:                ;
        !           933:            }
        !           934:            save(c);
        !           935:            break;
        !           936:        case '<':
        !           937:        case '?':
        !           938:            ret_token(c);
        !           939:            Return(MACRO_CHAR, c);
        !           940:        case '\t':
        !           941:        case ' ':
        !           942:            ret_token(c);
        !           943:            Return(WHITE_SPACE, c);
        !           944:        case '-':
        !           945:        case '@':
        !           946:        case ':':
        !           947:        case ';':
        !           948:        case '=':
        !           949:        case '$':
        !           950:        case '{':
        !           951:        case '}':
        !           952:        case '(':
        !           953:        case ')':
        !           954:            ret_token(c);
        !           955:            Return(c,c);
        !           956:        case '\'':
        !           957:        case '"':
        !           958:            if (bufptr != buffer) {
        !           959:                if (bufptr[-1] == '\\') {
        !           960:                    bufptr[-1] = c;
        !           961:                }
        !           962:                break;
        !           963:            } else {
        !           964:                int newc;
        !           965: 
        !           966:                ret_token(c);
        !           967:                *bufptr++ = c;
        !           968:                while (((newc = Getchar()) != EOF) && (newc != c)) {
        !           969:                    *bufptr++ = newc;
        !           970:                }
        !           971:                *bufptr++ = c;
        !           972:                *bufptr = 0;
        !           973:                bufptr = buffer;
        !           974:                yylval.string = string_lookup(buffer);
        !           975:                return QUOTED_STRING;
        !           976:            }
        !           977:        case '\n':
        !           978:            if (bufptr != buffer) {
        !           979:                if (bufptr[-1] == '\\') {
        !           980:                    bufptr--;
        !           981:                    if ((c = Getchar()) != '\t') {
        !           982:                        yyerror("continuation line doesn't begin with a tab");
        !           983:                        save(c);
        !           984:                    }
        !           985:                    ret_token(c);
        !           986:                    Return(WHITE_SPACE, c);
        !           987:                }
        !           988:            }
        !           989:            ret_token(c);
        !           990:            Return(NL, 0);
        !           991:        default:
        !           992:            *bufptr++ = c;
        !           993:            break;
        !           994:        }
        !           995:     }
        !           996: 
        !           997:     eof_found = 1;
        !           998: 
        !           999:     ret_token(' ');
        !          1000:     Return(EOF, 0);
        !          1001: }
        !          1002: 
        !          1003: #ifndef lint
        !          1004: static char sccsid[] = "@(#)mkmake.y   4.1 (Berkeley) 12/4/88";
        !          1005: #endif /* not lint */
        !          1006: 
        !          1007: main()
        !          1008: {
        !          1009: #define        YYDEBUG
        !          1010:     extern int yydebug;
        !          1011: 
        !          1012:     null = same_item(string_lookup(""));
        !          1013:     newline = same_item(string_lookup("\n"));
        !          1014:     blank = same_item(string_lookup(" "));
        !          1015:     cwd_line = same_cat(same_copy(newline),
        !          1016:                        same_cat(same_item(string_lookup("cd ${CWD}")),
        !          1017:                                 same_copy(newline)));
        !          1018: 
        !          1019:     yyparse();
        !          1020: 
        !          1021:     do_dump();
        !          1022: 
        !          1023:     return 0;
        !          1024: }
        !          1025: 
        !          1026: #if    defined(YYDEBUG)
        !          1027: dump_same(same)
        !          1028: same_t *same;
        !          1029: {
        !          1030:     same_t *same2;
        !          1031: 
        !          1032:     for (visit(same, same2); !visited(same2); visit_next(same2)) {
        !          1033:        printf(same2->string->string);
        !          1034:     }
        !          1035:     visit_end();
        !          1036: }
        !          1037: #endif /* YYDEBUG */
        !          1038: 
        !          1039: do_dump()
        !          1040: {
        !          1041:     string_t *string;
        !          1042:     same_t *same, *same2;
        !          1043: 
        !          1044:     if (yydebug > 1) {
        !          1045:        printf("strings...\n");
        !          1046:        for (string = strings; string; string = string->next) {
        !          1047:            printf("\t%s\n", string->string);
        !          1048:        }
        !          1049:     }
        !          1050: 
        !          1051:     printf("# variables...\n");
        !          1052:     for (visit(variables, same); !visited(same); visit_next(same)) {
        !          1053:        printf("%s =\t", same->string->string);
        !          1054:        for (visit(same->value_list, same2); !visited(same2);
        !          1055:                                                visit_next(same2)) {
        !          1056:            printf(same2->string->string);
        !          1057:        }
        !          1058:        visit_end();
        !          1059:        printf("\n");
        !          1060:     }
        !          1061:     visit_end();
        !          1062: 
        !          1063:     printf("\n\n#targets...\n");
        !          1064:     for (visit(targets, same); !visited(same); visit_next(same)) {
        !          1065:        printf("\n%s:\t", same->string->string);
        !          1066:        for (visit(same->depend_list, same2); !visited(same2);
        !          1067:                                                visit_next(same2)) {
        !          1068:            printf(same2->string->string);
        !          1069:        }
        !          1070:        visit_end();
        !          1071:        printf("\n\t");
        !          1072:        for (visit(same->action_list, same2); !visited(same2);
        !          1073:                                            visit_next(same2)) {
        !          1074:            printf(same2->string->string);
        !          1075:            if (same2->string->string[0] == '\n') {
        !          1076:                printf("\t");
        !          1077:            }
        !          1078:        }
        !          1079:        visit_end();
        !          1080:        printf("\n");
        !          1081:     }
        !          1082:     visit_end();
        !          1083: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.