xref: /386bsd/usr/src/usr.bin/awk/code.c (revision a2142627)
1 
2 /********************************************
3 code.c
4 copyright 1991, Michael D. Brennan
5 
6 This is a source file for mawk, an implementation of
7 the AWK programming language.
8 
9 Mawk is distributed without warranty under the terms of
10 the GNU General Public License, version 2, 1991.
11 ********************************************/
12 
13 
14 /* $Log: code.c,v $
15  * Revision 5.1  1991/12/05  07:55:43  brennan
16  * 1.1 pre-release
17  *
18 */
19 
20 /*  code.c  */
21 
22 #include "mawk.h"
23 #include "code.h"
24 #include "init.h"
25 #include "jmp.h"
26 #include "field.h"
27 
28 
29 #define   MAIN_CODE_SZ  (MAIN_PAGE_SZ*sizeof(INST))
30 
31 INST *code_ptr  ;
32 INST *main_start , *main_code_ptr ;
33 
34 #if 0
35 INST *begin_start , *begin_code_ptr ;
36 INST *end_start , *end_code_ptr ;
37 #endif
38 unsigned main_size /*, begin_size, end_size*/ ;
39     /* when the code is done executing its freed,
40        that's why this is global */
41 
42 struct be_code begin_code , end_code ;
43 
44 void  PROTO(fdump, (void) ) ;
45 
be_expand(p)46 void  be_expand( p )
47   struct be_code *p ;
48 { int delta ;
49 
50   main_code_ptr = code_ptr ;
51 
52   if ( p->start )
53   {
54     delta = p->ptr - p->start ;
55     p->start = (INST*) zrealloc(p->start, INST_BYTES(p->size),
56 			INST_BYTES(PAGE_SZ)) ;
57   }
58   else
59   {
60     delta = 0 ;
61     p->start = (INST*) zmalloc(INST_BYTES(PAGE_SZ)) ;
62   }
63 
64   p->size = PAGE_SZ ;
65   code_ptr = p->start + delta ;
66 }
67 
be_shrink(p)68 void  be_shrink(p)
69   struct be_code *p ;
70 {
71   int delta = code_ptr - p->start ;
72 
73   code_ptr = main_code_ptr ;
74 
75   if ( delta > p->size )
76 	overflow( p == & begin_code ?
77 		  "BEGIN code" : "END code" , p->size) ;
78 
79   p->start = (INST*) zrealloc(p->start, INST_BYTES(p->size) ,
80 			INST_BYTES(delta+2)) ;
81 
82   p->ptr = p->start + delta ;
83   p->size = delta + 2 ;
84 }
85 
86 
code_init()87 void  code_init()
88 {
89   code_ptr = main_code_ptr = main_start
90     = (INST *) zmalloc(MAIN_CODE_SZ) ;
91 
92   code1(_OMAIN) ;
93 }
94 
code_cleanup()95 void code_cleanup()
96 { int some_code_flag = 0 ; /* might only have functions */
97 
98 
99   /* set the END code */
100   if ( end_code.start )
101   {
102     end_code.ptr++ -> op =  _EXIT0 ;
103     end_code.ptr++ -> op =  _HALT  ;
104     end_code.size = INST_BYTES(end_code.size) ;
105   }
106 
107   /* set the main code */
108   if ( end_code.start || code_ptr - main_start > 1 )
109   { int gl_offset = code_ptr - main_start ;
110     extern INST *next_label ;
111     extern int NR_flag ;
112 
113     if ( NR_flag )  code1(OL_GL_NR) ;
114     else code1(OL_GL) ;
115 
116     code1(_HALT) ;
117 
118     main_size = code_ptr - main_start ;
119     if ( main_size > MAIN_PAGE_SZ )
120            overflow("MAIN code" , MAIN_PAGE_SZ) ;
121     main_size *= sizeof(INST) ;
122     code_ptr = main_start =
123                (INST*) zrealloc(main_start, MAIN_CODE_SZ, main_size) ;
124 
125     next_label = main_start+gl_offset ;
126     some_code_flag = 1 ;
127   }
128   else  /* only BEGIN */
129   {
130     zfree(main_start, MAIN_CODE_SZ) ;
131     main_start = (INST*) 0 ;
132   }
133 
134   /* set the BEGIN code */
135   if ( begin_code.start )
136   {
137     some_code_flag = 1 ;
138     begin_code.ptr++ -> op = main_start ? _JMAIN : _EXIT0 ;
139     begin_code.ptr++ -> op = _HALT ;
140     begin_code.size = INST_BYTES(begin_code.size) ;
141 
142     /* execution starts at code_ptr */
143     code_ptr = begin_code.start ;
144   }
145 
146 #if ! SM_DOS
147   if ( dump_code )
148   {
149     fdump() ; /* dumps all user functions */
150     if ( begin_code.start )
151     { fprintf(stderr, "BEGIN\n") ; da(begin_code.start, stderr) ; }
152     if ( end_code.start )
153     { fprintf(stderr, "END\n") ; da(end_code.start, stderr) ; }
154     if ( main_start )
155     { fprintf(stderr, "MAIN\n") ; da(main_start, stderr) ; }
156   }
157 #endif
158 
159   if ( some_code_flag == 0 ) mawk_exit(0) ;
160 }
161 
162