19665Slinton /* Copyright (c) 1982 Regents of the University of California */ 29665Slinton 3*12540Scsvaf static char sccsid[] = "@(#)languages.c 1.3 05/18/83"; 49665Slinton 59665Slinton /* 69665Slinton * Language management. 79665Slinton */ 89665Slinton 99665Slinton #include "defs.h" 109665Slinton #include "languages.h" 119665Slinton #include "c.h" 129665Slinton #include "pascal.h" 139665Slinton #include "asm.h" 149665Slinton 159665Slinton #ifndef public 169665Slinton typedef struct Language *Language; 179665Slinton 189665Slinton typedef enum { 19*12540Scsvaf L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF 209665Slinton } LanguageOp; 219665Slinton 229665Slinton typedef LanguageOperation(); 239665Slinton #endif 249665Slinton 259665Slinton struct Language { 269665Slinton String name; 279665Slinton String suffix; 289665Slinton LanguageOperation *op[10]; 299665Slinton Language next; 309665Slinton }; 319665Slinton 329665Slinton private Language head; 339665Slinton 349665Slinton /* 359665Slinton * Initialize language information. 369665Slinton * 379665Slinton * The last language initialized will be the default one 389665Slinton * for otherwise indistinguised symbols. 399665Slinton */ 409665Slinton 419665Slinton public language_init() 429665Slinton { 439665Slinton c_init(); 44*12540Scsvaf fortran_init(); 459665Slinton pascal_init(); 469665Slinton asm_init(); 479665Slinton } 489665Slinton 499665Slinton public Language findlanguage(suffix) 509665Slinton String suffix; 519665Slinton { 529665Slinton Language lang; 539665Slinton 549665Slinton lang = head; 559665Slinton if (suffix != nil) { 569665Slinton while (lang != nil and not streq(lang->suffix, suffix)) { 579665Slinton lang = lang->next; 589665Slinton } 599665Slinton if (lang == nil) { 609665Slinton lang = head; 619665Slinton } 629665Slinton } 639665Slinton return lang; 649665Slinton } 659665Slinton 669665Slinton public String language_name(lang) 679665Slinton Language lang; 689665Slinton { 699665Slinton return (lang == nil) ? "(nil)" : lang->name; 709665Slinton } 719665Slinton 729665Slinton public Language language_define(name, suffix) 739665Slinton String name; 749665Slinton String suffix; 759665Slinton { 769665Slinton Language p; 779665Slinton 789665Slinton p = new(Language); 799665Slinton p->name = name; 809665Slinton p->suffix = suffix; 819665Slinton p->next = head; 829665Slinton head = p; 839665Slinton return p; 849665Slinton } 859665Slinton 869665Slinton public language_setop(lang, op, operation) 879665Slinton Language lang; 889665Slinton LanguageOp op; 899665Slinton LanguageOperation *operation; 909665Slinton { 919665Slinton checkref(lang); 92*12540Scsvaf assert(ord(op) <= ord(L_EVALAREF)); 939665Slinton lang->op[ord(op)] = operation; 949665Slinton } 959665Slinton 969665Slinton public LanguageOperation *language_op(lang, op) 979665Slinton Language lang; 989665Slinton LanguageOp op; 999665Slinton { 1009665Slinton LanguageOperation *o; 1019665Slinton 1029665Slinton checkref(lang); 1039665Slinton o = lang->op[ord(op)]; 1049665Slinton checkref(o); 1059665Slinton return o; 1069665Slinton } 107