19665Slinton /* Copyright (c) 1982 Regents of the University of California */ 29665Slinton 3*16611Ssam static char sccsid[] = "@(#)languages.c 1.3 5/18/83"; 49665Slinton 5*16611Ssam static char rcsid[] = "$Header: languages.c,v 1.3 84/03/27 10:21:09 linton Exp $"; 6*16611Ssam 79665Slinton /* 89665Slinton * Language management. 99665Slinton */ 109665Slinton 119665Slinton #include "defs.h" 129665Slinton #include "languages.h" 139665Slinton #include "c.h" 149665Slinton #include "pascal.h" 15*16611Ssam #include "modula-2.h" 169665Slinton #include "asm.h" 179665Slinton 189665Slinton #ifndef public 19*16611Ssam 209665Slinton typedef struct Language *Language; 219665Slinton 229665Slinton typedef enum { 23*16611Ssam L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF, 24*16611Ssam L_MODINIT, L_HASMODULES, L_PASSADDR, 25*16611Ssam L_ENDOP 269665Slinton } LanguageOp; 279665Slinton 289665Slinton typedef LanguageOperation(); 29*16611Ssam 30*16611Ssam Language primlang; 31*16611Ssam 329665Slinton #endif 339665Slinton 349665Slinton struct Language { 359665Slinton String name; 369665Slinton String suffix; 37*16611Ssam LanguageOperation *op[20]; 389665Slinton Language next; 399665Slinton }; 409665Slinton 419665Slinton private Language head; 429665Slinton 439665Slinton /* 449665Slinton * Initialize language information. 459665Slinton * 469665Slinton * The last language initialized will be the default one 479665Slinton * for otherwise indistinguised symbols. 489665Slinton */ 499665Slinton 509665Slinton public language_init() 519665Slinton { 52*16611Ssam primlang = language_define("$builtin symbols", ".?"); 539665Slinton c_init(); 5412540Scsvaf fortran_init(); 559665Slinton pascal_init(); 56*16611Ssam modula2_init(); 579665Slinton asm_init(); 589665Slinton } 599665Slinton 609665Slinton public Language findlanguage(suffix) 619665Slinton String suffix; 629665Slinton { 639665Slinton Language lang; 649665Slinton 659665Slinton lang = head; 669665Slinton if (suffix != nil) { 679665Slinton while (lang != nil and not streq(lang->suffix, suffix)) { 689665Slinton lang = lang->next; 699665Slinton } 709665Slinton if (lang == nil) { 719665Slinton lang = head; 729665Slinton } 739665Slinton } 749665Slinton return lang; 759665Slinton } 769665Slinton 779665Slinton public String language_name(lang) 789665Slinton Language lang; 799665Slinton { 809665Slinton return (lang == nil) ? "(nil)" : lang->name; 819665Slinton } 829665Slinton 839665Slinton public Language language_define(name, suffix) 849665Slinton String name; 859665Slinton String suffix; 869665Slinton { 879665Slinton Language p; 889665Slinton 899665Slinton p = new(Language); 909665Slinton p->name = name; 919665Slinton p->suffix = suffix; 929665Slinton p->next = head; 939665Slinton head = p; 949665Slinton return p; 959665Slinton } 969665Slinton 979665Slinton public language_setop(lang, op, operation) 989665Slinton Language lang; 999665Slinton LanguageOp op; 1009665Slinton LanguageOperation *operation; 1019665Slinton { 1029665Slinton checkref(lang); 103*16611Ssam assert(ord(op) < ord(L_ENDOP)); 1049665Slinton lang->op[ord(op)] = operation; 1059665Slinton } 1069665Slinton 1079665Slinton public LanguageOperation *language_op(lang, op) 1089665Slinton Language lang; 1099665Slinton LanguageOp op; 1109665Slinton { 1119665Slinton LanguageOperation *o; 1129665Slinton 1139665Slinton checkref(lang); 1149665Slinton o = lang->op[ord(op)]; 1159665Slinton checkref(o); 1169665Slinton return o; 1179665Slinton } 118