Annotation of Gnu-Mach/mig/parser.y, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie the
                     24:  * rights to redistribute these changes.
                     25:  */
                     26: 
                     27: %token sySkip
                     28: %token syRoutine
                     29: %token sySimpleRoutine
                     30: %token sySimpleProcedure
                     31: %token syProcedure
                     32: %token syFunction
                     33: 
                     34: %token sySubsystem
                     35: %token syKernelUser
                     36: %token syKernelServer
                     37: 
                     38: %token syMsgOption
                     39: %token syMsgSeqno
                     40: %token syWaitTime
                     41: %token syNoWaitTime
                     42: %token syErrorProc
                     43: %token syServerPrefix
                     44: %token syUserPrefix
                     45: %token syServerDemux
                     46: %token syRCSId
                     47: 
                     48: %token syImport
                     49: %token syUImport
                     50: %token sySImport
                     51: 
                     52: %token syIn
                     53: %token syOut
                     54: %token syInOut
                     55: %token syRequestPort
                     56: %token syReplyPort
                     57: %token sySReplyPort
                     58: %token syUReplyPort
                     59: 
                     60: %token syType
                     61: %token syArray
                     62: %token syStruct
                     63: %token syOf
                     64: 
                     65: %token syInTran
                     66: %token syOutTran
                     67: %token syDestructor
                     68: %token syCType
                     69: %token syCUserType
                     70: %token syCServerType
                     71: 
                     72: %token syCString
                     73: 
                     74: %token syColon
                     75: %token sySemi
                     76: %token syComma
                     77: %token syPlus
                     78: %token syMinus
                     79: %token syStar
                     80: %token syDiv
                     81: %token syLParen
                     82: %token syRParen
                     83: %token syEqual
                     84: %token syCaret
                     85: %token syTilde
                     86: %token syLAngle
                     87: %token syRAngle
                     88: %token syLBrack
                     89: %token syRBrack
                     90: %token syBar
                     91: 
                     92: %token syError                 /* lex error */
                     93: 
                     94: %token <number>        syNumber
                     95: %token <symtype>       sySymbolicType
                     96: %token <identifier>    syIdentifier
                     97: %token <string>        syString syQString
                     98: %token <string>        syFileName
                     99: %token <flag>          syIPCFlag
                    100: 
                    101: %left  syPlus,syMinus
                    102: %left  syStar,syDiv
                    103: 
                    104: 
                    105: %type  <statement_kind> ImportIndicant
                    106: %type  <number> VarArrayHead ArrayHead StructHead IntExp
                    107: %type  <type> NamedTypeSpec TransTypeSpec TypeSpec
                    108: %type  <type> CStringSpec
                    109: %type  <type> BasicTypeSpec PrevTypeSpec ArgumentType
                    110: %type  <symtype> PrimIPCType IPCType
                    111: %type  <routine> RoutineDecl Routine SimpleRoutine
                    112: %type  <routine> Procedure SimpleProcedure Function
                    113: %type  <direction> Direction
                    114: %type  <argument> Argument Arguments ArgumentList
                    115: %type  <flag> IPCFlags
                    116: 
                    117: %{
                    118: 
                    119: #include <stdio.h>
                    120: 
                    121: #include "error.h"
                    122: #include "lexxer.h"
                    123: #include "global.h"
                    124: #include "mig_string.h"
                    125: #include "type.h"
                    126: #include "routine.h"
                    127: #include "statement.h"
                    128: 
                    129: static const char *import_name(statement_kind_t sk);
                    130: 
                    131: void
                    132: yyerror(const char *s)
                    133: {
                    134:     error(s);
                    135: }
                    136: %}
                    137: 
                    138: %union
                    139: {
                    140:     u_int number;
                    141:     identifier_t identifier;
                    142:     const_string_t string;
                    143:     statement_kind_t statement_kind;
                    144:     ipc_type_t *type;
                    145:     struct
                    146:     {
                    147:        u_int innumber;         /* msgt_name value, when sending */
                    148:        const_string_t instr;
                    149:        u_int outnumber;        /* msgt_name value, when receiving */
                    150:        const_string_t outstr;
                    151:        u_int size;             /* 0 means there is no default size */
                    152:     } symtype;
                    153:     routine_t *routine;
                    154:     arg_kind_t direction;
                    155:     argument_t *argument;
                    156:     ipc_flags_t flag;
                    157: }
                    158: 
                    159: %%
                    160: 
                    161: Statements             :       /* empty */
                    162:                        |       Statements Statement
                    163:                        ;
                    164: 
                    165: Statement              :       Subsystem sySemi
                    166:                        |       WaitTime sySemi
                    167:                        |       MsgOption sySemi
                    168:                        |       Error sySemi
                    169:                        |       ServerPrefix sySemi
                    170:                        |       UserPrefix sySemi
                    171:                        |       ServerDemux sySemi
                    172:                        |       TypeDecl sySemi
                    173:                        |       RoutineDecl sySemi
                    174: {
                    175:     register statement_t *st = stAlloc();
                    176: 
                    177:     st->stKind = skRoutine;
                    178:     st->stRoutine = $1;
                    179:     rtCheckRoutine($1);
                    180:     if (BeVerbose)
                    181:        rtPrintRoutine($1);
                    182: }
                    183:                        |       sySkip sySemi
                    184:                                { rtSkip(1); }
                    185:                        |       sySkip syNumber sySemi
                    186:                                { rtSkip($2); }
                    187:                        |       Import sySemi
                    188:                        |       RCSDecl sySemi
                    189:                        |       sySemi
                    190:                        |       error sySemi
                    191:                                { yyerrok; }
                    192:                        ;
                    193: 
                    194: Subsystem              :       SubsystemStart SubsystemMods
                    195:                                SubsystemName SubsystemBase
                    196: {
                    197:     if (BeVerbose)
                    198:     {
                    199:        printf("Subsystem %s: base = %u%s%s\n\n",
                    200:               SubsystemName, SubsystemBase,
                    201:               IsKernelUser ? ", KernelUser" : "",
                    202:               IsKernelServer ? ", KernelServer" : "");
                    203:     }
                    204: }
                    205:                        ;
                    206: 
                    207: SubsystemStart         :       sySubsystem
                    208: {
                    209:     if (SubsystemName != strNULL)
                    210:     {
                    211:        warn("previous Subsystem decl (of %s) will be ignored", SubsystemName);
                    212:        IsKernelUser = FALSE;
                    213:        IsKernelServer = FALSE;
                    214:        strfree((string_t) SubsystemName);
                    215:     }
                    216: }
                    217:                        ;
                    218: 
                    219: SubsystemMods          :       /* empty */
                    220:                        |       SubsystemMods SubsystemMod
                    221:                        ;
                    222: 
                    223: SubsystemMod           :       syKernelUser
                    224: {
                    225:     if (IsKernelUser)
                    226:        warn("duplicate KernelUser keyword");
                    227:     IsKernelUser = TRUE;
                    228: }
                    229:                        |       syKernelServer
                    230: {
                    231:     if (IsKernelServer)
                    232:        warn("duplicate KernelServer keyword");
                    233:     IsKernelServer = TRUE;
                    234: }
                    235:                        ;
                    236: 
                    237: SubsystemName          :       syIdentifier    { SubsystemName = $1; }
                    238:                        ;
                    239: 
                    240: SubsystemBase          :       syNumber        { SubsystemBase = $1; }
                    241:                        ;
                    242: 
                    243: MsgOption              :       LookString syMsgOption syString
                    244: {
                    245:     if (streql($3, "MACH_MSG_OPTION_NONE"))
                    246:     {
                    247:        MsgOption = strNULL;
                    248:        if (BeVerbose)
                    249:            printf("MsgOption: canceled\n\n");
                    250:     }
                    251:     else
                    252:     {
                    253:        MsgOption = $3;
                    254:        if (BeVerbose)
                    255:            printf("MsgOption %s\n\n",$3);
                    256:     }
                    257: }
                    258:                        ;
                    259: 
                    260: WaitTime               :       LookString syWaitTime syString
                    261: {
                    262:     WaitTime = $3;
                    263:     if (BeVerbose)
                    264:        printf("WaitTime %s\n\n", WaitTime);
                    265: }
                    266:                        |       syNoWaitTime
                    267: {
                    268:     WaitTime = strNULL;
                    269:     if (BeVerbose)
                    270:        printf("NoWaitTime\n\n");
                    271: }
                    272:                        ;
                    273: 
                    274: Error                  :       syErrorProc syIdentifier
                    275: {
                    276:     ErrorProc = $2;
                    277:     if (BeVerbose)
                    278:        printf("ErrorProc %s\n\n", ErrorProc);
                    279: }
                    280:                        ;
                    281: 
                    282: ServerPrefix           :       syServerPrefix syIdentifier
                    283: {
                    284:     ServerPrefix = $2;
                    285:     if (BeVerbose)
                    286:        printf("ServerPrefix %s\n\n", ServerPrefix);
                    287: }
                    288:                        ;
                    289: 
                    290: UserPrefix             :       syUserPrefix syIdentifier
                    291: {
                    292:     UserPrefix = $2;
                    293:     if (BeVerbose)
                    294:        printf("UserPrefix %s\n\n", UserPrefix);
                    295: }
                    296:                        ;
                    297: 
                    298: ServerDemux            :       syServerDemux syIdentifier
                    299: {
                    300:     ServerDemux = $2;
                    301:     if (BeVerbose)
                    302:        printf("ServerDemux %s\n\n", ServerDemux);
                    303: }
                    304:                        ;
                    305: 
                    306: Import                 :       LookFileName ImportIndicant syFileName
                    307: {
                    308:     register statement_t *st = stAlloc();
                    309:     st->stKind = $2;
                    310:     st->stFileName = $3;
                    311: 
                    312:     if (BeVerbose)
                    313:        printf("%s %s\n\n", import_name($2), $3);
                    314: }
                    315:                        ;
                    316: 
                    317: ImportIndicant         :       syImport        { $$ = skImport; }
                    318:                        |       syUImport       { $$ = skUImport; }
                    319:                        |       sySImport       { $$ = skSImport; }
                    320:                        ;
                    321: 
                    322: RCSDecl                        :       LookQString syRCSId syQString
                    323: {
                    324:     if (RCSId != strNULL)
                    325:        warn("previous RCS decl will be ignored");
                    326:     if (BeVerbose)
                    327:        printf("RCSId %s\n\n", $3);
                    328:     RCSId = $3;
                    329: }
                    330:                        ;
                    331: 
                    332: TypeDecl               :       syType NamedTypeSpec
                    333: {
                    334:     register identifier_t name = $2->itName;
                    335: 
                    336:     if (itLookUp(name) != itNULL)
                    337:        warn("overriding previous definition of %s", name);
                    338:     itInsert(name, $2);
                    339: }
                    340:                        ;
                    341: 
                    342: NamedTypeSpec          :       syIdentifier syEqual TransTypeSpec
                    343:                                { itTypeDecl($1, $$ = $3); }
                    344:                        ;
                    345: 
                    346: TransTypeSpec          :       TypeSpec
                    347:                                { $$ = itResetType($1); }
                    348:                        |       TransTypeSpec syInTran syColon syIdentifier
                    349:                                syIdentifier syLParen syIdentifier syRParen 
                    350: {
                    351:     $$ = $1;
                    352: 
                    353:     if (($$->itTransType != strNULL) && !streql($$->itTransType, $4))
                    354:        warn("conflicting translation types (%s, %s)",
                    355:             $$->itTransType, $4);
                    356:     $$->itTransType = $4;
                    357: 
                    358:     if (($$->itInTrans != strNULL) && !streql($$->itInTrans, $5))
                    359:        warn("conflicting in-translation functions (%s, %s)",
                    360:             $$->itInTrans, $5);
                    361:     $$->itInTrans = $5;
                    362: 
                    363:     if (($$->itServerType != strNULL) && !streql($$->itServerType, $7))
                    364:        warn("conflicting server types (%s, %s)",
                    365:             $$->itServerType, $7);
                    366:     $$->itServerType = $7;
                    367: }
                    368:                        |       TransTypeSpec syOutTran syColon syIdentifier
                    369:                                syIdentifier syLParen syIdentifier syRParen
                    370: {
                    371:     $$ = $1;
                    372: 
                    373:     if (($$->itServerType != strNULL) && !streql($$->itServerType, $4))
                    374:        warn("conflicting server types (%s, %s)",
                    375:             $$->itServerType, $4);
                    376:     $$->itServerType = $4;
                    377: 
                    378:     if (($$->itOutTrans != strNULL) && !streql($$->itOutTrans, $5))
                    379:        warn("conflicting out-translation functions (%s, %s)",
                    380:             $$->itOutTrans, $5);
                    381:     $$->itOutTrans = $5;
                    382: 
                    383:     if (($$->itTransType != strNULL) && !streql($$->itTransType, $7))
                    384:        warn("conflicting translation types (%s, %s)",
                    385:             $$->itTransType, $7);
                    386:     $$->itTransType = $7;
                    387: }
                    388:                        |       TransTypeSpec syDestructor syColon syIdentifier
                    389:                                syLParen syIdentifier syRParen
                    390: {
                    391:     $$ = $1;
                    392: 
                    393:     if (($$->itDestructor != strNULL) && !streql($$->itDestructor, $4))
                    394:        warn("conflicting destructor functions (%s, %s)",
                    395:             $$->itDestructor, $4);
                    396:     $$->itDestructor = $4;
                    397: 
                    398:     if (($$->itTransType != strNULL) && !streql($$->itTransType, $6))
                    399:        warn("conflicting translation types (%s, %s)",
                    400:             $$->itTransType, $6);
                    401:     $$->itTransType = $6;
                    402: }
                    403:                        |       TransTypeSpec syCType syColon syIdentifier
                    404: {
                    405:     $$ = $1;
                    406: 
                    407:     if (($$->itUserType != strNULL) && !streql($$->itUserType, $4))
                    408:        warn("conflicting user types (%s, %s)",
                    409:             $$->itUserType, $4);
                    410:     $$->itUserType = $4;
                    411: 
                    412:     if (($$->itServerType != strNULL) && !streql($$->itServerType, $4))
                    413:        warn("conflicting server types (%s, %s)",
                    414:             $$->itServerType, $4);
                    415:     $$->itServerType = $4;
                    416: }
                    417:                        |       TransTypeSpec syCUserType syColon syIdentifier
                    418: {
                    419:     $$ = $1;
                    420: 
                    421:     if (($$->itUserType != strNULL) && !streql($$->itUserType, $4))
                    422:        warn("conflicting user types (%s, %s)",
                    423:             $$->itUserType, $4);
                    424:     $$->itUserType = $4;
                    425: }
                    426:                        |       TransTypeSpec syCServerType
                    427:                                syColon syIdentifier
                    428: {
                    429:     $$ = $1;
                    430: 
                    431:     if (($$->itServerType != strNULL) && !streql($$->itServerType, $4))
                    432:        warn("conflicting server types (%s, %s)",
                    433:             $$->itServerType, $4);
                    434:     $$->itServerType = $4;
                    435: }
                    436:                        ;
                    437: 
                    438: TypeSpec               :       BasicTypeSpec
                    439:                                { $$ = $1; }
                    440:                        |       PrevTypeSpec
                    441:                                { $$ = $1; }
                    442:                        |       VarArrayHead TypeSpec
                    443:                                { $$ = itVarArrayDecl($1, $2); }
                    444:                        |       ArrayHead TypeSpec
                    445:                                { $$ = itArrayDecl($1, $2); }
                    446:                        |       syCaret TypeSpec
                    447:                                { $$ = itPtrDecl($2); }
                    448:                        |       StructHead TypeSpec
                    449:                                { $$ = itStructDecl($1, $2); }
                    450:                        |       CStringSpec
                    451:                                { $$ = $1; }
                    452:                        ;
                    453: 
                    454: BasicTypeSpec          :       IPCType
                    455: {
                    456:     $$ = itShortDecl($1.innumber, $1.instr,
                    457:                     $1.outnumber, $1.outstr,
                    458:                     $1.size);
                    459: }
                    460:                        |       syLParen IPCType syComma IntExp
                    461:                                IPCFlags syRParen
                    462: {
                    463:     $$ = itLongDecl($2.innumber, $2.instr,
                    464:                    $2.outnumber, $2.outstr,
                    465:                    $2.size, $4, $5);
                    466: }
                    467:                        ;
                    468: 
                    469: IPCFlags               :       /* empty */
                    470:                                { $$ = flNone; }
                    471:                        |       IPCFlags syComma syIPCFlag
                    472: {
                    473:     if ($1 & $3)
                    474:        warn("redundant IPC flag ignored");
                    475:     else
                    476:        $$ = $1 | $3;
                    477: }
                    478:                        |       IPCFlags syComma syIPCFlag syLBrack syRBrack
                    479: {
                    480:     if ($3 != flDealloc)
                    481:        warn("only Dealloc is variable");
                    482:     else
                    483:        $$ = $1 | flMaybeDealloc;
                    484: }
                    485:                        ;
                    486: 
                    487: PrimIPCType            :       syNumber
                    488: {
                    489:     $$.innumber = $$.outnumber = $1;
                    490:     $$.instr = $$.outstr = strNULL;
                    491:     $$.size = 0;
                    492: }
                    493:                        |       sySymbolicType
                    494:                                { $$ = $1; }
                    495:                        ;
                    496: 
                    497: IPCType                        :       PrimIPCType
                    498:                                { $$ = $1; }
                    499:                        |       PrimIPCType syBar PrimIPCType
                    500: {
                    501:     if ($1.size != $3.size)
                    502:     {
                    503:        if ($1.size == 0)
                    504:            $$.size = $3.size;
                    505:        else if ($3.size == 0)
                    506:            $$.size = $1.size;
                    507:        else
                    508:        {
                    509:            error("sizes in IPCTypes (%d, %d) aren't equal",
                    510:                  $1.size, $3.size);
                    511:            $$.size = 0;
                    512:        }
                    513:     }
                    514:     else
                    515:        $$.size = $1.size;
                    516:     $$.innumber = $1.innumber;
                    517:     $$.instr = $1.instr;
                    518:     $$.outnumber = $3.outnumber;
                    519:     $$.outstr = $3.outstr;
                    520: }
                    521:                        ;
                    522: 
                    523: PrevTypeSpec           :       syIdentifier
                    524:                                { $$ = itPrevDecl($1); }
                    525:                        ;
                    526: 
                    527: VarArrayHead           :       syArray syLBrack syRBrack syOf
                    528:                                { $$ = 0; }
                    529:                        |       syArray syLBrack syStar syRBrack syOf
                    530:                                { $$ = 0; }
                    531:                        |       syArray syLBrack syStar syColon IntExp 
                    532:                                syRBrack syOf
                    533:                                { $$ = $5; }
                    534:                        ;
                    535: 
                    536: ArrayHead              :       syArray syLBrack IntExp syRBrack syOf
                    537:                                { $$ = $3; }
                    538:                        ;
                    539: 
                    540: StructHead             :       syStruct syLBrack IntExp syRBrack syOf
                    541:                                { $$ = $3; }
                    542:                        ;
                    543: 
                    544: CStringSpec            :       syCString syLBrack IntExp syRBrack
                    545:                                { $$ = itCStringDecl($3, FALSE); }
                    546:                        |       syCString syLBrack syStar syColon
                    547:                                IntExp syRBrack
                    548:                                { $$ = itCStringDecl($5, TRUE); }
                    549:                        ;
                    550: 
                    551: IntExp                 :       IntExp  syPlus  IntExp
                    552:                                { $$ = $1 + $3; }
                    553:                        |       IntExp  syMinus IntExp
                    554:                                { $$ = $1 - $3; }
                    555:                        |       IntExp  syStar  IntExp
                    556:                                { $$ = $1 * $3; }
                    557:                        |       IntExp  syDiv   IntExp
                    558:                                { $$ = $1 / $3; }
                    559:                        |       syNumber
                    560:                                { $$ = $1;      }
                    561:                        |       syLParen IntExp syRParen
                    562:                                { $$ = $2;      }
                    563:                        ;
                    564: 
                    565:  
                    566: RoutineDecl            :       Routine                 { $$ = $1; }
                    567:                        |       SimpleRoutine           { $$ = $1; }
                    568:                        |       Procedure               { $$ = $1; }
                    569:                        |       SimpleProcedure         { $$ = $1; }
                    570:                        |       Function                { $$ = $1; }
                    571:                        ;
                    572: 
                    573: Routine                        :       syRoutine syIdentifier Arguments
                    574:                                { $$ = rtMakeRoutine($2, $3); }
                    575:                        ;
                    576: 
                    577: SimpleRoutine          :       sySimpleRoutine syIdentifier Arguments
                    578:                                { $$ = rtMakeSimpleRoutine($2, $3); }
                    579:                        ;
                    580: 
                    581: Procedure              :       syProcedure syIdentifier Arguments
                    582:                                { $$ = rtMakeProcedure($2, $3); }
                    583:                        ;
                    584: 
                    585: SimpleProcedure                :       sySimpleProcedure syIdentifier Arguments
                    586:                                { $$ = rtMakeSimpleProcedure($2, $3); }
                    587:                        ;
                    588: 
                    589: Function               :       syFunction syIdentifier Arguments ArgumentType
                    590:                                { $$ = rtMakeFunction($2, $3, $4); }
                    591:                        ;
                    592: 
                    593: Arguments              :       syLParen syRParen
                    594:                                { $$ = argNULL; }
                    595:                        |       syLParen ArgumentList syRParen
                    596:                                { $$ = $2; }
                    597: 
                    598:                        ;
                    599: 
                    600: ArgumentList           :       Argument
                    601:                                { $$ = $1; }
                    602:                        |       Argument sySemi ArgumentList
                    603: {
                    604:     $$ = $1;
                    605:     $$->argNext = $3;
                    606: }
                    607:                        ;
                    608: 
                    609: Argument               :       Direction syIdentifier ArgumentType IPCFlags
                    610: {
                    611:     $$ = argAlloc();
                    612:     $$->argKind = $1;
                    613:     $$->argName = $2;
                    614:     $$->argType = $3;
                    615:     $$->argFlags = $4;
                    616: }
                    617:                        ;
                    618: 
                    619: Direction              :       /* empty */     { $$ = akNone; }
                    620:                        |       syIn            { $$ = akIn; }
                    621:                        |       syOut           { $$ = akOut; }
                    622:                        |       syInOut         { $$ = akInOut; }
                    623:                        |       syRequestPort   { $$ = akRequestPort; }
                    624:                        |       syReplyPort     { $$ = akReplyPort; }
                    625:                        |       sySReplyPort    { $$ = akSReplyPort; }
                    626:                        |       syUReplyPort    { $$ = akUReplyPort; }
                    627:                        |       syWaitTime      { $$ = akWaitTime; }
                    628:                        |       syMsgOption     { $$ = akMsgOption; }
                    629:                        |       syMsgSeqno      { $$ = akMsgSeqno; }
                    630:                        ;
                    631: 
                    632: ArgumentType           :       syColon syIdentifier
                    633: {
                    634:     $$ = itLookUp($2);
                    635:     if ($$ == itNULL)
                    636:        error("type '%s' not defined", $2);
                    637: }
                    638:                        |       syColon NamedTypeSpec
                    639:                                { $$ = $2; }
                    640:                        ;
                    641: 
                    642: LookString             :       /* empty */
                    643:                                { LookString(); }
                    644:                        ;
                    645: 
                    646: LookFileName           :       /* empty */
                    647:                                { LookFileName(); }
                    648:                        ;
                    649: 
                    650: LookQString            :       /* empty */
                    651:                                { LookQString(); }
                    652:                        ;
                    653: 
                    654: %%
                    655: 
                    656: static const char *
                    657: import_name(statement_kind_t sk)
                    658: {
                    659:     switch (sk)
                    660:     {
                    661:       case skImport:
                    662:        return "Import";
                    663:       case skSImport:
                    664:        return "SImport";
                    665:       case skUImport:
                    666:        return "UImport";
                    667:       default:
                    668:        fatal("import_name(%d): not import statement", (int) sk);
                    669:        /*NOTREACHED*/
                    670:     }
                    671: }

unix.superglobalmegacorp.com

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