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