Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / gen / mainvar.c
1 /*     Loglan82 Compiler&Interpreter
2      Copyright (C) 1993 Institute of Informatics, University of Warsaw
3      Copyright (C)  1993, 1994 LITA, Pau
4      
5      This program is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published by
7      the Free Software Foundation; either version 2 of the License, or
8      (at your option) any later version.
9      
10      This program is distributed in the hope that it will be useful,
11      but WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13      GNU General Public License for more details.
14      
15 =======================================================================
16 */
17
18 #include "glodefs.h"
19
20       /* DATA STRUCTURES COPIED FROM LOGLAN COMPILER */
21 #if DEBUG
22   FILE * log;
23 #endif
24       /* compiler symbol table and memory */
25 int *  ipmem ;
26 address *  m ;     /* "SMALL" M , FOR PROTOTYPES  OR CODE  FOR ONE UNIT ONLY */
27
28 int  nblus ;              /* ADDRESS OF MAIN BLOCK IN IPMEM            */
29 int  nrint ;              /* ADDRESS OF TYPE INTEGER IN IPMEM          */
30 int  nrre  ;
31                     /* ADDRESS OF TYPE REAL IN IPMEM             */
32 int  nrbool ;
33                     /* ADDRESS OF TYPE BOOLEAN IN IPMEM          */
34 int  nrchr ;
35                     /* ADDRESS OF TYPE CHAR IN IPMEM             */
36 int  nrtext ;
37                     /* ADDRESS OF TYPE STRING IN IPMEM           */
38 int  nrcor ;
39                     /* ADDRESS OF TYPE COROUTINE IN IPMEM        */
40 int  nrproc ;
41                     /* ADDRESS OF TYPE PROCESS IN IPMEM          */
42 int  lpmem ;
43                     /* THE LAST INDEX BELOW REAL CONSTANTS       */
44 int  irecn ;
45                     /* LAST INDEX OF REAL CONSTANT AREA          */
46 int  lmem ;
47                     /* ACTUAL (I.E. FROM COMPILER) SIZE OF IPMEM */
48 int  addrnone ;
49                     /* dsw&ail*/
50
51    /* INFORMATION ADDED INTO IPMEM :                                         */
52
53    /* LOWER ADDRESSES ARE OCCUPIED BY COMPILER SYMBOL TABLE                  */
54    /* UPPER ADDR. ARE USED IN 'CODE' FOR GENERATOR SYMBOL TABLE.             */
55    /* EACH (GENERATOR) SYMBOL TABLE ITEM OCCUPIES 3 WORDS :                  */
56    /*   (+0) = STITEM  ( --> CODE)                                           */
57    /*   (+1) = VALUE OF CONSTANT                                             */
58    /*       OR OFFSET OF TEMPORARY VARIABLE,                                 */
59    /*       OR POINTER TO THE ATTRIBUTE DESCRIPTION IN COMP.SYM.TABLE        */
60    /*   (+2) = NEXT USE (QADDR)                                              */
61
62    /* PROCEDURE 'GENPROT' MODIFIES INFORMATION IN COMPILER SYMBOL TABLE.     */
63    /* PROCEDURE 'CODE' NEED THE FOLLOWING EXTRA INFORMATION :                */
64
65    /* FOR EACH UNIT:   (-1) = PROTADDR                                       */
66    /*                  (+0) = ADDRESS OF 'AFTER INNER' STATEMENT             */
67    /*                         ( STORED BY 'CODE' )                           */
68    /* FOR EACH OBJECT ATTRIBUTE:                                             */
69    /*                  (-2) = OFFSET                                         */
70    /*                  (-1) = PROTADDR FOR THAT OBJECT                       */
71    /* FOR EACH TYPE (CLASS TYPE, FORMAL TYPE OR PRYMITIVE TYPE):             */
72    /*                  (+2) = - ADDRESS OF TYPE DESCRIPTION IN M             */
73
74    /* MOREOVER, EXTRA INFORMATION IS STORED TO LINK REFERENCES TO THE TYPES  */
75    /* ( --> BACKPATCH)                                                       */
76
77 address    base  ;                  /* TOTAL LENGTH OF JUST PRODUCED CODE;
78                                        TO BE ADDED  TO  INDEX IN "SMALL" M */
79 address    realbase ;               /* BASE FOR REAL CONSTANTS */
80
81 dprotaddr  prefix[ MAXPROT + 1 ]  ; /* PROTOTYPE NUMBER OF PREFIX */
82                                     /* OR DUMMY IF PREFIX ABSENT  */
83
84
85
86    /* TYPES OF SOME OBJECTS  BELONGING TO THE ADDRESS TYPE HAVE BEEN CHANGED */
87    /* TO INTEGER. THIS HAS BEEN FORCED DUE TO THE REQUIREMENTS OF THE PASCAL */
88    /* COMPILER  ACCESSIBLE ON SIEMENS  WHICH DEMANDS THAT  THE PROCEDURE AND */
89    /* FUNCTION PARAMETERS PASSED BY VARIABLE HAVE STRICTLY THE SAME TYPE  AS */
90    /* THEIR FORMAL CORRESPONENTS.                            */ 
91
92 address offset;
93
94 /* Variables of code to follow */                 
95 /* qaddr0   qcurr ;  */     /* CURRENT QUADRUPLE */
96 qaddr    qlast ;       /* LAST QUADRUPLE   */
97  
98 quadruple   tuple[ QMAX + 1 ] ;
99
100 protaddr    unitt ;    /* CURRENT UNIT */
101 int         ipunit ;   /* UNIT ADDRES IN  IPMEM */
102
103
104 int         notrick ;    /* FOR INTEGER <--> STITEM CONVERSION */
105
106                /* M^ [ FIRSTLABEL..MEMLIMIT ] IS USED FOR HANDLING LABELS */
107                /* FOR LABEL L :                                         */
108                /*  M^ [ MEMLIMIT-L+1 ] < 0                                */
109                /*          -->  = - VALUE OF ALREADY DEFINED LABEL         */
110                /*  M^ [ MEMLIMIT-L+1 ] > 0                                */
111                /*          -->  = HEAD OF UNSATISFIED REFERENCES LIST   */
112
113 int         none ;    /* ADDRESS OF 'NONE' IN SYMBOL TABLE */
114
115 int         n ;
116
117  /*CBC added concurrent statements... */
118 protaddr   proclist[ MAXPROCLIST + 1 ] ;
119
120 /* mb vars from back to follow */
121
122 qaddr       ctpoint ;
123 bool        nouse ;
124
125
126
127 /*mb vars from gen to follow */
128
129 filename    file_name  ; /* text given by the user as a file name */
130
131 FILE *     lfile ;
132                 /* OUTPUT FROM LOGLAN COMPILER:                              */
133                 /*                                  STRINGS,                 */
134                 /*                                  SYMBOL TABLE,            */
135                 /*                                  L-CODE.                  */
136                 /*                                                           */
137                 /* PARTICULAR SECTIONS ARE SEPARATED BY '#' OCCURRING IN THE */
138                 /* FIRST POSITION OF LINE. ZEROS OCCURRING IN THE SYMBOL TA- */
139                 /* BLE ARE COMPRESSED (SEE GETITEM).                         */
140
141 /* TEMPORARY FILES: WRITEN BY GENERATOR, READ BY INTERPRETER */
142 FILE        * cfile ;              /* CODE AND LISTS FOR PROTOTYPES  */
143 FILE        * pfile ;              /* PROTOTYPES                     */
144
145 int         error ;                /* TRUE FOR FAILURE DURING GENERATION */
146
147 pointprdsc  prototype[MAXPROT + 1] ;
148
149 address     ipradr ;               /* BASE FOR PRIMITIVE TYPES DESCRIPTIONS */
150 address     temporary ;            /* ADDRESS OF GLOBAL TEMPORARY VARIABLES */
151 address     strings ;              /* BASE FOR STRING CONSTANTS             */
152 protaddr    lastprot ;             /* THE LAST USED PROTOTYPE NUMBER        */
153 address     fre ;                 /* FIRST FREE CELL IN M                  */
154
155
156
157 pointer listofref[ MAXPROT + 1 ] ;
158                  /* LISTS OF REFERENCE ATTRIBUTES WITH POINTERS TO IPMEM */
159
160 longpointer listofpar[ MAXPROT + 1 ] ;
161                  /* LISTS OF PRODUCED DESCRPTIONS OF FORMAL PARAMETERS   */
162
163 int opdescr[] = { 0,
164  14, 15, 14, 14, 14,  0,  0,  0,  0,  0,
165   8,  8,  9,  0,  9,  9,  0,  0,  0, 10,
166  10, 10, 10, 10, 10, 10,  0,  0, 12, 11,
167  11, 11, 11, 11, 11, 11, 12, 11, 12, 12,
168  11, 11, 11,  9,  9, 11, 11, 11, 11, 11,
169  11, 12, 12, 12, 12, 12, 12, 11, 11, 11,
170  11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
171  11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
172  11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
173  12, 12, 12, 12, 12, 12, 12, 12, 12, 13,
174  13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
175  13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
176  13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
177  13,  1,  0,  0,  0,  0,  3,  3,  3,  2,
178   2,  0,  2,  3,  4,  2,  2,  2,  3,  3,
179   3,  3,  2,  0,  0,  0,  0,  2,  5,  5,
180   5,  5,  5,  6,  6,  6,  0,  0,  0,  7,
181   0,  0,  0,  0,  1,  0,  1,  1,  0,  0,
182   1,  1,  1,  1,  0,  1,  0,  2,  4,  0,
183   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
184   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
185   0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
186   0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
187   0,  0,  0,  0,  0,  0,  0,  0,  0,  2 };
188