1*9665Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*9665Slinton 3*9665Slinton static char sccsid[] = "@(#)@(#)languages.c 1.1 12/15/82"; 4*9665Slinton 5*9665Slinton /* 6*9665Slinton * Language management. 7*9665Slinton */ 8*9665Slinton 9*9665Slinton #include "defs.h" 10*9665Slinton #include "languages.h" 11*9665Slinton #include "c.h" 12*9665Slinton #include "pascal.h" 13*9665Slinton #include "asm.h" 14*9665Slinton 15*9665Slinton #ifndef public 16*9665Slinton typedef struct Language *Language; 17*9665Slinton 18*9665Slinton typedef enum { 19*9665Slinton L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH 20*9665Slinton } LanguageOp; 21*9665Slinton 22*9665Slinton typedef LanguageOperation(); 23*9665Slinton #endif 24*9665Slinton 25*9665Slinton struct Language { 26*9665Slinton String name; 27*9665Slinton String suffix; 28*9665Slinton LanguageOperation *op[10]; 29*9665Slinton Language next; 30*9665Slinton }; 31*9665Slinton 32*9665Slinton private Language head; 33*9665Slinton 34*9665Slinton /* 35*9665Slinton * Initialize language information. 36*9665Slinton * 37*9665Slinton * The last language initialized will be the default one 38*9665Slinton * for otherwise indistinguised symbols. 39*9665Slinton */ 40*9665Slinton 41*9665Slinton public language_init() 42*9665Slinton { 43*9665Slinton c_init(); 44*9665Slinton pascal_init(); 45*9665Slinton asm_init(); 46*9665Slinton } 47*9665Slinton 48*9665Slinton public Language findlanguage(suffix) 49*9665Slinton String suffix; 50*9665Slinton { 51*9665Slinton Language lang; 52*9665Slinton 53*9665Slinton lang = head; 54*9665Slinton if (suffix != nil) { 55*9665Slinton while (lang != nil and not streq(lang->suffix, suffix)) { 56*9665Slinton lang = lang->next; 57*9665Slinton } 58*9665Slinton if (lang == nil) { 59*9665Slinton lang = head; 60*9665Slinton } 61*9665Slinton } 62*9665Slinton return lang; 63*9665Slinton } 64*9665Slinton 65*9665Slinton public String language_name(lang) 66*9665Slinton Language lang; 67*9665Slinton { 68*9665Slinton return (lang == nil) ? "(nil)" : lang->name; 69*9665Slinton } 70*9665Slinton 71*9665Slinton public Language language_define(name, suffix) 72*9665Slinton String name; 73*9665Slinton String suffix; 74*9665Slinton { 75*9665Slinton Language p; 76*9665Slinton 77*9665Slinton p = new(Language); 78*9665Slinton p->name = name; 79*9665Slinton p->suffix = suffix; 80*9665Slinton p->next = head; 81*9665Slinton head = p; 82*9665Slinton return p; 83*9665Slinton } 84*9665Slinton 85*9665Slinton public language_setop(lang, op, operation) 86*9665Slinton Language lang; 87*9665Slinton LanguageOp op; 88*9665Slinton LanguageOperation *operation; 89*9665Slinton { 90*9665Slinton checkref(lang); 91*9665Slinton assert(ord(op) <= ord(L_TYPEMATCH)); 92*9665Slinton lang->op[ord(op)] = operation; 93*9665Slinton } 94*9665Slinton 95*9665Slinton public LanguageOperation *language_op(lang, op) 96*9665Slinton Language lang; 97*9665Slinton LanguageOp op; 98*9665Slinton { 99*9665Slinton LanguageOperation *o; 100*9665Slinton 101*9665Slinton checkref(lang); 102*9665Slinton o = lang->op[ord(op)]; 103*9665Slinton checkref(o); 104*9665Slinton return o; 105*9665Slinton } 106