386BSD 0.1 development
[unix-history] / usr / src / usr.bin / awk / code.c
CommitLineData
a7e60862
WJ
1
2/********************************************
3code.c
4copyright 1991, Michael D. Brennan
5
6This is a source file for mawk, an implementation of
7the AWK programming language.
8
9Mawk is distributed without warranty under the terms of
10the GNU General Public License, version 2, 1991.
11********************************************/
12
13
14/* $Log: code.c,v $
15 * Revision 5.1 91/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
31INST *code_ptr ;
32INST *main_start , *main_code_ptr ;
33
34#if 0
35INST *begin_start , *begin_code_ptr ;
36INST *end_start , *end_code_ptr ;
37#endif
38unsigned main_size /*, begin_size, end_size*/ ;
39 /* when the code is done executing its freed,
40 that's why this is global */
41
42struct be_code begin_code , end_code ;
43
44void PROTO(fdump, (void) ) ;
45
46void 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
68void 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
87void code_init()
88{
89 code_ptr = main_code_ptr = main_start
90 = (INST *) zmalloc(MAIN_CODE_SZ) ;
91
92 code1(_OMAIN) ;
93}
94
95void 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