121605Sdist /* 2*38105Sbostic * Copyright (c) 1983 The Regents of the University of California. 3*38105Sbostic * All rights reserved. 4*38105Sbostic * 5*38105Sbostic * Redistribution and use in source and binary forms are permitted 6*38105Sbostic * provided that the above copyright notice and this paragraph are 7*38105Sbostic * duplicated in all such forms and that any documentation, 8*38105Sbostic * advertising materials, and other materials related to such 9*38105Sbostic * distribution and use acknowledge that the software was developed 10*38105Sbostic * by the University of California, Berkeley. The name of the 11*38105Sbostic * University may not be used to endorse or promote products derived 12*38105Sbostic * from this software without specific prior written permission. 13*38105Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*38105Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*38105Sbostic * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1621605Sdist */ 179665Slinton 1821605Sdist #ifndef lint 19*38105Sbostic static char sccsid[] = "@(#)languages.c 5.2 (Berkeley) 05/23/89"; 20*38105Sbostic #endif /* not lint */ 219665Slinton 229665Slinton /* 239665Slinton * Language management. 249665Slinton */ 259665Slinton 269665Slinton #include "defs.h" 279665Slinton #include "languages.h" 289665Slinton #include "c.h" 299665Slinton #include "pascal.h" 3016611Ssam #include "modula-2.h" 319665Slinton #include "asm.h" 329665Slinton 339665Slinton #ifndef public 3416611Ssam 359665Slinton typedef struct Language *Language; 369665Slinton 379665Slinton typedef enum { 3816611Ssam L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF, 3916611Ssam L_MODINIT, L_HASMODULES, L_PASSADDR, 4016611Ssam L_ENDOP 419665Slinton } LanguageOp; 429665Slinton 439665Slinton typedef LanguageOperation(); 4416611Ssam 4516611Ssam Language primlang; 4616611Ssam 479665Slinton #endif 489665Slinton 499665Slinton struct Language { 509665Slinton String name; 519665Slinton String suffix; 5216611Ssam LanguageOperation *op[20]; 539665Slinton Language next; 549665Slinton }; 559665Slinton 569665Slinton private Language head; 579665Slinton 589665Slinton /* 599665Slinton * Initialize language information. 609665Slinton * 619665Slinton * The last language initialized will be the default one 629665Slinton * for otherwise indistinguised symbols. 639665Slinton */ 649665Slinton 659665Slinton public language_init() 669665Slinton { 6716611Ssam primlang = language_define("$builtin symbols", ".?"); 689665Slinton c_init(); 6912540Scsvaf fortran_init(); 709665Slinton pascal_init(); 7116611Ssam modula2_init(); 729665Slinton asm_init(); 739665Slinton } 749665Slinton 759665Slinton public Language findlanguage(suffix) 769665Slinton String suffix; 779665Slinton { 789665Slinton Language lang; 799665Slinton 809665Slinton lang = head; 819665Slinton if (suffix != nil) { 829665Slinton while (lang != nil and not streq(lang->suffix, suffix)) { 839665Slinton lang = lang->next; 849665Slinton } 859665Slinton if (lang == nil) { 869665Slinton lang = head; 879665Slinton } 889665Slinton } 899665Slinton return lang; 909665Slinton } 919665Slinton 929665Slinton public String language_name(lang) 939665Slinton Language lang; 949665Slinton { 959665Slinton return (lang == nil) ? "(nil)" : lang->name; 969665Slinton } 979665Slinton 989665Slinton public Language language_define(name, suffix) 999665Slinton String name; 1009665Slinton String suffix; 1019665Slinton { 1029665Slinton Language p; 1039665Slinton 1049665Slinton p = new(Language); 1059665Slinton p->name = name; 1069665Slinton p->suffix = suffix; 1079665Slinton p->next = head; 1089665Slinton head = p; 1099665Slinton return p; 1109665Slinton } 1119665Slinton 1129665Slinton public language_setop(lang, op, operation) 1139665Slinton Language lang; 1149665Slinton LanguageOp op; 1159665Slinton LanguageOperation *operation; 1169665Slinton { 1179665Slinton checkref(lang); 11816611Ssam assert(ord(op) < ord(L_ENDOP)); 1199665Slinton lang->op[ord(op)] = operation; 1209665Slinton } 1219665Slinton 1229665Slinton public LanguageOperation *language_op(lang, op) 1239665Slinton Language lang; 1249665Slinton LanguageOp op; 1259665Slinton { 1269665Slinton LanguageOperation *o; 1279665Slinton 1289665Slinton checkref(lang); 1299665Slinton o = lang->op[ord(op)]; 1309665Slinton checkref(o); 1319665Slinton return o; 1329665Slinton } 133