1*21605Sdist /* 2*21605Sdist * Copyright (c) 1983 Regents of the University of California. 3*21605Sdist * All rights reserved. The Berkeley software License Agreement 4*21605Sdist * specifies the terms and conditions for redistribution. 5*21605Sdist */ 69665Slinton 7*21605Sdist #ifndef lint 8*21605Sdist static char sccsid[] = "@(#)languages.c 5.1 (Berkeley) 05/31/85"; 9*21605Sdist #endif not lint 109665Slinton 1118221Slinton static char rcsid[] = "$Header: languages.c,v 1.5 84/12/26 10:39:49 linton Exp $"; 1218221Slinton 139665Slinton /* 149665Slinton * Language management. 159665Slinton */ 169665Slinton 179665Slinton #include "defs.h" 189665Slinton #include "languages.h" 199665Slinton #include "c.h" 209665Slinton #include "pascal.h" 2116611Ssam #include "modula-2.h" 229665Slinton #include "asm.h" 239665Slinton 249665Slinton #ifndef public 2516611Ssam 269665Slinton typedef struct Language *Language; 279665Slinton 289665Slinton typedef enum { 2916611Ssam L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF, 3016611Ssam L_MODINIT, L_HASMODULES, L_PASSADDR, 3116611Ssam L_ENDOP 329665Slinton } LanguageOp; 339665Slinton 349665Slinton typedef LanguageOperation(); 3516611Ssam 3616611Ssam Language primlang; 3716611Ssam 389665Slinton #endif 399665Slinton 409665Slinton struct Language { 419665Slinton String name; 429665Slinton String suffix; 4316611Ssam LanguageOperation *op[20]; 449665Slinton Language next; 459665Slinton }; 469665Slinton 479665Slinton private Language head; 489665Slinton 499665Slinton /* 509665Slinton * Initialize language information. 519665Slinton * 529665Slinton * The last language initialized will be the default one 539665Slinton * for otherwise indistinguised symbols. 549665Slinton */ 559665Slinton 569665Slinton public language_init() 579665Slinton { 5816611Ssam primlang = language_define("$builtin symbols", ".?"); 599665Slinton c_init(); 6012540Scsvaf fortran_init(); 619665Slinton pascal_init(); 6216611Ssam modula2_init(); 639665Slinton asm_init(); 649665Slinton } 659665Slinton 669665Slinton public Language findlanguage(suffix) 679665Slinton String suffix; 689665Slinton { 699665Slinton Language lang; 709665Slinton 719665Slinton lang = head; 729665Slinton if (suffix != nil) { 739665Slinton while (lang != nil and not streq(lang->suffix, suffix)) { 749665Slinton lang = lang->next; 759665Slinton } 769665Slinton if (lang == nil) { 779665Slinton lang = head; 789665Slinton } 799665Slinton } 809665Slinton return lang; 819665Slinton } 829665Slinton 839665Slinton public String language_name(lang) 849665Slinton Language lang; 859665Slinton { 869665Slinton return (lang == nil) ? "(nil)" : lang->name; 879665Slinton } 889665Slinton 899665Slinton public Language language_define(name, suffix) 909665Slinton String name; 919665Slinton String suffix; 929665Slinton { 939665Slinton Language p; 949665Slinton 959665Slinton p = new(Language); 969665Slinton p->name = name; 979665Slinton p->suffix = suffix; 989665Slinton p->next = head; 999665Slinton head = p; 1009665Slinton return p; 1019665Slinton } 1029665Slinton 1039665Slinton public language_setop(lang, op, operation) 1049665Slinton Language lang; 1059665Slinton LanguageOp op; 1069665Slinton LanguageOperation *operation; 1079665Slinton { 1089665Slinton checkref(lang); 10916611Ssam assert(ord(op) < ord(L_ENDOP)); 1109665Slinton lang->op[ord(op)] = operation; 1119665Slinton } 1129665Slinton 1139665Slinton public LanguageOperation *language_op(lang, op) 1149665Slinton Language lang; 1159665Slinton LanguageOp op; 1169665Slinton { 1179665Slinton LanguageOperation *o; 1189665Slinton 1199665Slinton checkref(lang); 1209665Slinton o = lang->op[ord(op)]; 1219665Slinton checkref(o); 1229665Slinton return o; 1239665Slinton } 124