1 /*
2  *  The Regina Rexx Interpreter
3  *  Copyright (C) 1992-1994  Anders Christensen <anders@pvv.unit.no>
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library 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 GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public
16  *  License along with this library; if not, write to the Free
17  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 
20 /* JH 20-10-99 */  /* To make Direct setting of stems Direct and not Symbolic. */
21 
22 
23 /*
24  * Routines in lexsrc.l
25  */
26 #ifndef FLEX_SCANNER
27    extern YY_CHAR_TYPE *yysptr, yysbuf[] ;
28 #endif
29    void fetch_file(tsd_t *TSD,
30                    FILE *fptr,
31                    internal_parser_type *ipt);
32    void fetch_string(tsd_t *TSD,
33                      const streng *str,
34                      internal_parser_type *ipt);
35 
36 /*
37  * Routines in parsing.c
38  */
39    int bmstrstr( const streng *heystack, int start, const streng *needle, int caseless ) ;
40    void doparse( tsd_t *TSD, const streng *source, cnodeptr subtree, int caseless ) ;
41    void parseargtree(tsd_t *TSD, cparamboxptr argbox, cnodeptr thisptr, int flags );
42 
43 
44 /*
45  * Routines in debug.c
46  */
47    void dumpvars( const tsd_t *TSD );
48    void dumptree( const tsd_t *TSD, const treenode *thisptr, int level, int newline ) ;
49    streng *getsourceline( const tsd_t *TSD, int line, int charnr, const internal_parser_type *ipt ) ;
50 #ifdef TRACEMEM
51    void marksource( clineboxptr ) ;
52 #endif
53 
54 
55 /*
56  * Routines in files.c
57  */
58    streng *readkbdline( tsd_t *TSD ) ;
59    void mark_filetable( const tsd_t *TSD) ;
60    int filename_cmp( const streng *name1, const streng *name2 );
61    void purge_filetable( tsd_t *TSD ) ;
62    int init_filetable( tsd_t *TSD ) ;
63    void fixup_file( tsd_t *TSD, const streng * ) ;
64    streng *get_external_routine( const tsd_t *TSD, const char *inname,
65                                  FILE **fp );
66    void find_shared_library(const tsd_t *TSD,const char *, const char *, char *);
67    void CloseOpenFiles ( const tsd_t *TSD, FilePtrDisposition fpd ) ;
68    streng *ConfigStreamQualified( tsd_t *TSD, const streng *name );
69    streng *std_charin( tsd_t *TSD, cparamboxptr parms ) ;
70    streng *std_charout( tsd_t *TSD, cparamboxptr parms ) ;
71    streng *std_chars( tsd_t *TSD, cparamboxptr parms ) ;
72    streng *std_linein( tsd_t *TSD, cparamboxptr parms ) ;
73    streng *std_lineout( tsd_t *TSD, cparamboxptr parms ) ;
74    streng *std_lines( tsd_t *TSD, cparamboxptr parms ) ;
75    streng *std_stream( tsd_t *TSD, cparamboxptr parms ) ;
76    void closefile( tsd_t *TSD, const streng *name )  ;
77    void *addr_reopen_file( tsd_t *TSD, const streng *filename, char code, int iserror );
78    streng *addr_io_file( tsd_t *TSD, void *fileptr, const streng *line ) ;
79    void addr_reset_file( tsd_t *TSD, void *fileptr );
80    streng *addr_file_info( tsd_t *TSD, const streng *source, int defchannel );
81 #ifndef NDEBUG
82    streng *dbg_dumpfiles( tsd_t *TSD, cparamboxptr parms ) ;
83 #endif
84    streng *unx_open( tsd_t *TSD, cparamboxptr parms ) ;
85    streng *unx_close( tsd_t *TSD, cparamboxptr parms ) ;
86 #if !defined(HAVE__SPLITPATH2) && !defined(HAVE__SPLITPATH) && !defined(__EMX__) && !defined(DJGPP)
87    int my_splitpath2( const char *in, char *out, char **drive, char **dir, char **name, char **ext ) ;
88 #endif
89    int my_fullpath( tsd_t *TSD, char *dst, const char *src );
90    int my_fullpathstreng( const tsd_t *TSD, char *dst, const streng *src );
91    streng *arexx_exists( tsd_t *TSD, cparamboxptr parms ) ;
92 
93 /*
94  * Routines in expr.c
95  */
96    int isboolean( tsd_t *TSD, nodeptr, int suberror, const char *op ) ;
97    num_descr *calcul( tsd_t *TSD, nodeptr, num_descr**, int leftorright, int oper ) ;
98    int init_expr( tsd_t *TSD ) ;
99    streng *evaluate( tsd_t *TSD, nodeptr thisptr, streng **kill ) ;
100 
101 /*
102  * Routines in cmsfuncs.c
103  */
104    streng *cms_sleep( tsd_t *TSD, cparamboxptr parms ) ;
105    streng *cms_makebuf( tsd_t *TSD, cparamboxptr parms ) ;
106    streng *cms_justify( tsd_t *TSD, cparamboxptr parms ) ;
107    streng *cms_find( tsd_t *TSD, cparamboxptr parms ) ;
108    streng *cms_index( tsd_t *TSD, cparamboxptr parms ) ;
109    streng *cms_desbuf( tsd_t *TSD, cparamboxptr parms ) ;
110    streng *cms_buftype( tsd_t *TSD, cparamboxptr parms ) ;
111    streng *cms_dropbuf( tsd_t *TSD, cparamboxptr parms ) ;
112    streng *cms_state( tsd_t *TSD, cparamboxptr parms ) ;
113 
114 /*
115  * Routines in memory.c
116  */
117    int init_memory( tsd_t *TSD ) ;
118 #ifdef FLISTS
119    void *get_a_chunk( int bytes ) ;
120    void *get_a_chunkTSD( const tsd_t *TSD, int bytes ) ;
121    streng *get_a_streng( int bytes ) ;
122    streng *get_a_strengTSD( const tsd_t *TSD, int bytes ) ;
123    void  give_a_chunk( void *ptr ) ;
124    void  give_a_chunkTSD( const tsd_t *TSD, void *ptr ) ;
125    void  give_a_streng( streng *ptr ) ;
126    void  give_a_strengTSD( const tsd_t *TSD, streng *ptr ) ;
127    int show_free_lists(const tsd_t *TSD);
128    void purge_flists(const tsd_t *TSD);
129 #endif
130 #ifdef TRACEMEM
131    void *mymalloc( int bytes ) ;
132    void *mymallocTSD( const tsd_t *TSD, int bytes ) ;
133    void  myfree( void *ptr ) ;
134    void  myfreeTSD( const tsd_t *TSD, void *ptr ) ;
135    void  regmarker( const tsd_t *TSD, void (*func)(const tsd_t *TSD) ) ;
136    int   have_allocated( tsd_t *TSD, int flag ) ;
137    void  markmemory( void *ptr, int i ) ;
138    int   listleaked( const tsd_t *TSD, int pflag ) ;
139    void  memory_stats( const tsd_t *TSD ) ;
140    void  mark_listleaked_params( const tsd_t *TSD ) ;
141 #endif /* TRACEMEM */
142 
143 #ifdef TRACEMEM
144 # define Malloc(bytes)             mymalloc(bytes)
145 # define Malloc_TSD(TSD,bytes)     mymallocTSD(TSD,bytes)
146 # define MallocTSD(bytes)          mymallocTSD(TSD,bytes)
147 # define Free(ptr)                 myfree(ptr)
148 # define Free_TSD(TSD,ptr)         myfreeTSD(TSD,ptr)
149 # define FreeTSD(ptr)              myfreeTSD(TSD,ptr)
150 # define Free_string(ptr)          myfree(ptr)
151 # define Free_string_TSD(TSD,ptr)  myfreeTSD(TSD,ptr)
152 # define Free_stringTSD(ptr)       myfreeTSD(TSD,ptr)
153 #elif defined(FLISTS)
154 # define Malloc(bytes)             get_a_chunk(bytes)
155 # define Malloc_TSD(TSD,bytes)     get_a_chunkTSD(TSD,bytes)
156 # define MallocTSD(bytes)          get_a_chunkTSD(TSD,bytes)
157 # define Free(ptr)                 give_a_chunk(ptr)
158 # define Free_TSD(TSD,ptr)         give_a_chunkTSD(TSD,ptr)
159 # define FreeTSD(ptr)              give_a_chunkTSD(TSD,ptr)
160 # define Free_string(ptr)          give_a_streng(ptr)
161 # define Free_string_TSD(TSD,ptr)  give_a_strengTSD(TSD,ptr)
162 # define Free_stringTSD(ptr)       give_a_strengTSD(TSD,ptr)
163 #else /* neither TRACEMEM nor FLISTS */
164 # define Malloc(bytes)             Malloc_TSD(__regina_get_tsd(),bytes)
165 # define Malloc_TSD(TSD,bytes)     (TSD)->MTMalloc(TSD,bytes)
166 # define MallocTSD(bytes)          Malloc_TSD(TSD,bytes)
167 # define Free(ptr)                 Free_TSD(__regina_get_tsd(),ptr)
168 # define Free_TSD(TSD,ptr)         (TSD)->MTFree(TSD,ptr)
169 # define FreeTSD(ptr)              Free_TSD(TSD,ptr)
170 # ifdef CHECK_MEMORY
171    void  give_a_streng( streng *ptr ) ;
172    void  give_a_strengTSD( const tsd_t *TSD, streng *ptr ) ;
173 #  define Free_string(ptr)         give_a_streng(ptr)
174 #  define Free_string_TSD(TSD,ptr) give_a_strengTSD(TSD,ptr)
175 #  define Free_stringTSD(ptr)      give_a_strengTSD(TSD,ptr)
176 # else
177 #  define Free_string(ptr)         Free_string_TSD(__regina_get_tsd(),ptr)
178 #  define Free_string_TSD(TSD,ptr) (TSD)->MTFree(TSD,ptr)
179 #  define Free_stringTSD(ptr)      Free_string_TSD(TSD,ptr)
180 # endif /* CHECK_MEMORY */
181 #endif /* ifdef TRACEMEM */
182 
183 
184 /*
185  * Routines in stack.c
186  */
187    int init_stacks( tsd_t *TSD ) ;
188    int external_queues_used( const tsd_t *TSD ) ;
189    void purge_stacks( const tsd_t *TSD ) ;
190    streng *popline( tsd_t *TSD, const streng *queue_name, int *result, unsigned long waitflag ) ;
191    int stack_lifo( tsd_t *TSD, streng *line, const streng *queue_name ) ;
192    int stack_fifo( tsd_t *TSD, streng *line, const streng *queue_name ) ;
193    int lines_in_stack( tsd_t *TSD, const streng *queue_name ) ;
194 #ifdef TRACEMEM
195    void mark_stack( const tsd_t *TSD ) ;
196 #endif /* TRACEMEM */
197    int drop_buffer( const tsd_t *TSD, int num ) ;
198    int make_buffer( tsd_t *TSD ) ;
199    void type_buffer( tsd_t *TSD ) ;
200    Queue *find_free_slot( const tsd_t *TSD ) ;
201    Queue *fill_input_queue_stem( tsd_t *TSD, streng *stemname, int stem0 ) ;
202    Queue *fill_input_queue_stream( tsd_t *TSD, void *fileptr );
203    void flush_stack( const tsd_t *TSD, Queue *src, Queue *dst, int is_fifo ) ;
204    streng *stack_to_line( const tsd_t *TSD, Queue *q );
205    int create_queue( tsd_t *TSD, const streng *queue_name, streng **result );
206    int delete_queue( tsd_t *TSD, const streng *queue_name );
207    int timeout_queue( tsd_t *TSD, const streng *timeout, const streng *queue_name );
208    streng *get_queue( tsd_t *TSD );
209    void fill_queue_name( const tsd_t *TSD, int *len, char **name );
210    streng *set_queue( tsd_t *TSD, const streng *queue_name );
211    Queue *addr_reopen_queue( tsd_t *TSD, const streng *queuename, char code ) ;
212    int addr_same_queue( const tsd_t *TSD, const Queue *q1, const Queue *q2 ) ;
213    Queue *addr_redir_queue( const tsd_t *TSD, Queue *q ) ;
214    void addr_purge_queue( const tsd_t *TSD, Queue *q ) ;
215    streng *addr_io_queue( tsd_t *TSD, Queue *q, streng *buffer, int isFIFO ) ;
216    void addr_close_queue( const tsd_t *TSD, Queue *q ) ;
217 
218 
219 /*
220  * Routines in misc.c
221  */
222    void set_locale_info( const char *info );
223    void mem_upper( void *m, int len );
224    void mem_lower( void *m, int len );
225    void mem_upperrx64( void *m, rx_64 len );
226    void mem_lowerrx64( void *m, rx_64 len );
227    int mem_cmpic( const void *buf1, const void *buf2, int len );
228    const char *system_type( void ) ;
229    double cpu_time( void ) ;
230    void getsecs( time_t *secs, time_t *usecs ) ;
231    unsigned hashvalue(const char *string, int length ) ;
232    unsigned hashvalue_ic(const char *string, int length ) ;
233    unsigned hashvalue_var(const streng *name, int start, int *stop );
234 #ifdef SKYOS
235    clock_t clock( void );
236 #endif
237    char **makeargs(const char *string, char escape);
238    char *splitoffarg(const char *string, const char **trailer, char escape);
239    char **makesimpleargs(const char *string);
240    void destroyargs(char **args);
241 
242 
243 
244 /*
245  * Routines in error.c
246  */
247    int init_error( tsd_t *TSD ) ;
248    const streng *errortext( const tsd_t *TSD, int errorno, int suberrnum, int request_english, int apply_inserts ) ;
249    void exiterror( int errorno , int suberrorno, ... ) ;
250    void __reginaerror( char *errtext ) ;
251    const char *getsym( int numb ) ;
252    int lineno_of( cnodeptr ) ;
253    void clear_errortext_buffers( const tsd_t *TSD );
254 
255 
256 /*
257  * Routines in variable.c
258  */
259    int known_reserved_variable( const char *name, unsigned length );
260    /* We need a fast determination: */
261 #define KNOWN_RESERVED(n,l) ((l) && (*(n)=='.') && known_reserved_variable((n),(l)))
262 
263    void detach( const tsd_t *TSD, variableptr ptr ) ;
264    int init_vars( tsd_t *TSD ) ;
265    void expand_to_str( const tsd_t *TSD, variableptr ptr ) ;
266    int var_was_found( const tsd_t *TSD ) ;
267    var_hashtable *create_new_varpool( const tsd_t *TSD, int size ) ;
268    void setdirvalue( tsd_t *TSD, const streng *name, streng *value ) ;
269    void setvalue( tsd_t *TSD, const streng *name, streng *value, int pool ) ;
270    num_descr *fix_compoundnum( tsd_t *TSD, nodeptr thisptr, num_descr *newdescr,
271                                streng *string_val );
272    void setshortcutnum( tsd_t *TSD, nodeptr thisptr, num_descr *value,
273                         streng *string_val );
274    const streng *getdirvalue( tsd_t *TSD, const streng *name ) ;
275    const streng *getvalue( tsd_t *TSD, const streng *name, int pool ) ;
276    const streng *isvariable( tsd_t *TSD, const streng *name ) ;
277    int variables_per_SAA( tsd_t *TSD );
278    void restore_variable_state( const tsd_t *TSD, int state );
279    const streng *get_it_anyway( tsd_t *TSD, const streng *name, int pool ) ;
280    const streng *get_it_anyway_compound( tsd_t *TSD, const streng *str ) ;
281    void expose_var( tsd_t *TSD, const streng *name ) ;
282    void drop_var( tsd_t *TSD, const streng *name ) ;
283    void drop_dirvar( tsd_t *TSD, const streng *name ) ;
284    void upper_var( tsd_t *TSD, const streng *name ) ;
285    void set_ignore_novalue( const tsd_t *TSD ) ;
286    int valid_var_symbol( const streng *symbol ) ;
287    void clear_ignore_novalue( const tsd_t *TSD ) ;
288 #ifdef TRACEMEM
289    void markvariables( const tsd_t *TSD, cproclevel ) ;
290 #endif /* TRACEMEM */
291    const streng *shortcut( tsd_t *TSD, nodeptr ) ;
292    num_descr *shortcutnum( tsd_t *TSD, nodeptr ) ;
293    void setshortcut( tsd_t *TSD, nodeptr thisptr, streng *value ) ;
294    streng *fix_compound( tsd_t *TSD, nodeptr thisptr, streng *value ) ;
295    void kill_variables( const tsd_t *TSD, var_hashtable *array ) ;
296    variableptr get_next_variable( tsd_t *TSD, int reset ) ;
297    void set_reserved_value( tsd_t *TSD, int poolid, streng *val_str,
298                             int val_int, int vflag );
299 
300 
301 /*
302  * Routines in shell.c
303  */
304    void put_stem( tsd_t *TSD, environpart *e, streng *str );
305    int init_shell( tsd_t *TSD ) ;
306    void cleanup_envirpart(const tsd_t *TSD, environpart *ep);
307    int posix_do_command( tsd_t *TSD, const streng *command, int flag, environment *env, Queue *redir ) ;
308 
309 
310 
311 /*
312  * Routines in tracing.c
313  */
314    int init_tracing( tsd_t *TSD ) ;
315    int purge_tracing( tsd_t *TSD ) ;
316    void set_trace( tsd_t *TSD, const streng * ) ;
317    void set_trace_char( tsd_t *TSD, char ) ;
318    void flush_trace_chars( tsd_t *TSD ) ;
319    void queue_trace_char( const tsd_t *TSD, char ch ) ;
320    void tracenumber( tsd_t *TSD, const num_descr *num, char type ) ;
321    void tracebool( tsd_t *TSD, int value, char type ) ;
322    int pushcallstack( const tsd_t *TSD, treenode *thisptr ) ;
323    void popcallstack( const tsd_t *TSD, int value ) ;
324    void traceerror( tsd_t *TSD, const treenode *thisptr, int RC ) ;
325    void tracecompound( tsd_t *TSD, const streng *stem, int length, const streng *index, char trch ) ;
326    void starttrace( const tsd_t *TSD ) ;
327    int intertrace( tsd_t *TSD ) ;
328    void tracevalue( tsd_t *TSD, const streng *str, char type ) ;
329    void traceline( tsd_t *TSD, const treenode *thisptr, char tch, int offset ) ;
330    void traceback( tsd_t *TSD ) ;
331 
332 
333 /*
334  * Routines in interp.c
335  */
336    streng *dointerpret( tsd_t *TSD, streng *string ) ;
337 
338 
339 
340 /*
341  * Routines in interpret.c
342  */
343    void update_envirs( const tsd_t *TSD, proclevel level ) ;
344    proclevel newlevel( tsd_t *TSD, proclevel oldlevel ) ;
345 #define IPRT_BUFSIZE 2 /* buffer elements for the state in InterpreterStatus */
346    void SaveInterpreterStatus(const tsd_t *TSD,unsigned *state);
347    void RestoreInterpreterStatus(const tsd_t *TSD,const unsigned *state);
348    streng *CallInternalFunction( tsd_t *TSD, nodeptr node, nodeptr thisptr,
349                                  paramboxptr args );
350    streng *interpret( tsd_t * volatile TSD, nodeptr volatile rootnode ) ;
351    nodeptr getlabel( const tsd_t *TSD, const streng *name ) ;
352    void removelevel( tsd_t *TSD, proclevel level ) ;
353    void jump_rexx_signal( tsd_t *TSD );
354    void jump_interpreter_exit( tsd_t *TSD, int processExitCode );
355    void jump_script_exit( tsd_t *TSD, streng *result );
356    int init_spec_vars( tsd_t *TSD ) ;
357 
358 
359 /*
360  * Routines in yaccsrc.y
361  */
362    int yylex( void ) ;
363    int __reginaparse( void ) ;
364    void kill_lines( const tsd_t *TSD, lineboxptr first ) ;
365    void destroytree( const tsd_t *TSD, nodeptr thisptr ) ;
366    void newlabel( const tsd_t *TSD, internal_parser_type *ipt, nodeptr thisptr ) ;
367 
368 
369 
370 /*
371  * Routines in funcs.c
372  */
373    streng *buildtinfunc( tsd_t *TSD, nodeptr thisptr ) ;
374    void deallocplink( tsd_t *TSD, paramboxptr first ) ;
375    paramboxptr initplist( tsd_t *TSD, cnodeptr thisptr );
376    paramboxptr initargs( tsd_t *TSD, int argc, const int *lengths,
377                          const char **strings );
378    int myatol( const tsd_t *TSD, const streng *text ) ;
379    void checkparam( cparamboxptr params, int min, int max, const char *name ) ;
380    char getoptionchar( tsd_t *TSD, const streng *param, const char *bif, int argnum, const char *ansi_options, const char *regina_options ) ;
381    int atozpos( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
382    rx_64 atozposrx64( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
383    int atopos( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
384    rx_64 atoposrx64( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
385    int atoposorzero( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
386    char getonechar( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
387    char getonespecialchar( tsd_t *TSD, const streng *text, const char *bif, int argnum ) ;
388    streng *int_to_streng( const tsd_t *TSD, int input ) ;
389    streng *rx64_to_streng( const tsd_t *TSD, rx_64 input ) ;
390    streng *rx64u_to_streng( const tsd_t *TSD, rx_64u input ) ;
391    int convert_date(tsd_t *TSD, const streng *, char, struct tm *, char);
392    int convert_time(const tsd_t *TSD,const streng *, char, struct tm *, time_t *);
393    int basedays(int);
394 #ifdef TRACEMEM
395    void mark_param_cache( const tsd_t *TSD ) ;
396 #endif
397    void addtwostrings( char *one, char *two, char *answer ) ;
398    const char *BIFname( tsd_t *TSD );
399 
400 
401 /*
402  * Routines in cmath.c
403  */
404    double myatof( const tsd_t *TSD, const streng *string ) ;
405    int myisnumber( const tsd_t *TSD, const streng *string ) ;
406    int myisinteger( const streng *string ) ;
407 
408 
409 /*
410  Functions in rexx.c
411  */
412 #ifdef __cplusplus
413 extern "C" {
414 #endif
415 
416 #ifdef RXLIB
417 # if defined(__LCC__)
418    int __regina_faked_main(int argc,char *argv[]) ;
419 # else
420 #  ifdef __MINGW32__
421 #   ifdef __REGINA_DLL
422    int APIENTRY __regina_faked_main(int argc,char *argv[]) __declspec(dllexport);
423 #   else
424    int APIENTRY __regina_faked_main(int argc,char *argv[]) __declspec(dllimport);
425 #   endif
426 #  else
427    int APIENTRY __regina_faked_main(int argc,char *argv[]) ;
428 #  endif
429 # endif
430 #else
431    int main(int argc,char *argv[]) ;
432 #endif
433 
434 #ifdef __cplusplus
435 }
436 #endif
437 
438    int __regina_reexecute_main(int argc, char **argv);
439    void mark_systeminfo( const tsd_t *TSD) ;
440    nodeptr treadit( cnodeptr ) ;
441    void setup_system( tsd_t *TSD, int isclient );
442    sysinfobox *creat_sysinfo( const tsd_t *TSD, streng *envir );
443    void setGlobalTSD( tsd_t *TSD);
444    tsd_t *getGlobalTSD( void );
445 
446 
447 /*
448  * Functions in signals.h
449  */
450    trap *gettraps( const tsd_t *TSD, proclevel level ) ;
451    sigtype *getsigs( proclevel level ) ;
452    void mark_signals( const tsd_t *TSD ) ;
453    signal_handler regina_signal(int signum, signal_handler action);
454    void halt_raised( tsd_t *TSD );
455    int condition_hook( tsd_t *TSD, int, int, int, int, streng *, streng * ) ;
456 #ifdef WIN32
457    void __regina_Win32RaiseCtrlC( tsd_t *TSD );
458 #endif
459 
460    void signal_setup( const tsd_t *TSD ) ;
461    int identify_trap( int type ) ;
462    void set_rexx_halt( tsd_t *TSD ) ;
463 
464 /*
465  * Routines in library.c
466  */
467    int init_library( tsd_t *TSD ) ;
468    void free_orphaned_libs( tsd_t *TSD );
469    void purge_library( tsd_t *TSD );
470    struct library *find_library( const tsd_t *TSD, const streng *name );
471    void set_err_message( const tsd_t *TSD, const char *message1, const char *message2 ) ;
472    streng *rex_rxfuncerrmsg( tsd_t *TSD, cparamboxptr parms ) ;
473    streng *rex_rxfuncquery( tsd_t *TSD, cparamboxptr parms ) ;
474    streng *rex_rxfuncadd( tsd_t *TSD, cparamboxptr parms ) ;
475    streng *rex_rxfuncdefine( tsd_t *TSD, cparamboxptr parms );
476    streng *rex_gciprefixchar( tsd_t *TSD, cparamboxptr parms );
477    streng *rex_rxfuncdrop( tsd_t *TSD, cparamboxptr parms ) ;
478    int IfcRegFunc( const tsd_t *TSD, const char *rxname, const char *module,
479                    const char *objnam, PFN entry );
480    int IfcRegExit( const tsd_t *TSD, const char *rxname, const char *module,
481                    const char *objnam, PFN entry, void *user_area );
482    int IfcRegSubcom( const tsd_t *TSD, const char *rxname, const char *module,
483                      const char *objnam, PFN entry, void *user_area );
484    int IfcDelFunc( tsd_t *TSD, const char *rxname );
485    int IfcDelExit( tsd_t *TSD, const char *rxname, const char *module );
486    int IfcDelSubcom( tsd_t *TSD, const char *rxname, const char *module );
487    int IfcQueryFunc( const tsd_t *TSD, const char *rxname );
488    int IfcQueryExit( const tsd_t *TSD, const char *rxname, const char *module,
489                      void *user_area );
490    int IfcQuerySubcom( const tsd_t *TSD, const char *rxname,
491                        const char *module, void *user_area );
492    struct entry_point *loaded_lib_func( const tsd_t *TSD, const streng *name );
493    struct entry_point *exit_hook( const tsd_t *TSD, const char *env, int len );
494    struct entry_point *subcom_hook( const tsd_t *TSD, const char *com, int len );
495 
496 /*
497  * functions in mt_notmt.c/mt_<os>.c
498  */
499    int IfcReginaCleanup( void );
500 
501 /*
502  * functions in macros.c
503  */
504    void killsystem( tsd_t *TSD, sysinfo systm ) ;
505    internal_parser_type enter_macro( tsd_t *TSD, const streng *source,
506                                      void **ept, unsigned long *extlength);
507    streng *do_instore( tsd_t * volatile TSD, const streng *name, paramboxptr args,
508                        const streng *envir, int * volatile RetCode, int hooks,
509                        const void *instore, unsigned long instore_length,
510                        const char *instore_source,
511                        unsigned long instore_source_length,
512                        const internal_parser_type *ipt,
513                        int ctype ) ;
514    streng *execute_external( tsd_t * volatile TSD, const streng *command,
515                              paramboxptr args, const streng *envir,
516                              int * volatile RetCode, int hooks, int ctype ) ;
517    int count_params( cparamboxptr ptr, int soft ) ;
518    streng *get_parameter( paramboxptr ptr, int number ) ;
519 
520 
521 /*
522  * Functions in envir.c
523  */
524    void post_process_system_call( tsd_t *TSD, const streng *cmd,
525                                   int rc_code, const streng *rc_value,
526                                   cnodeptr thisptr );
527    streng *perform( tsd_t *TSD, const streng *command, const streng *envir, cnodeptr thisptr, cnodeptr overwrite );
528    void add_envir( tsd_t *TSD, const streng *name, int type, int subtype ) ;
529    int envir_exists( const tsd_t *TSD, const streng *name );
530    streng *get_envir_details( const tsd_t *TSD, char opt, const streng *name );
531    int set_subcomed_envir( const tsd_t *TSD, const streng *name, int subcomed );
532    int get_subcomed_envir( const tsd_t *TSD, const streng *name );
533    int init_envir( tsd_t *TSD ) ;
534    void del_envir( tsd_t *TSD, const streng *name ) ;
535    int set_envir( const tsd_t *TSD, const streng *envirname, const nodeptr ios ) ;
536    streng *run_popen( tsd_t *TSD, const streng *command, const streng *envir ) ;
537 
538 
539 /*
540  * Functions in client.c
541  */
542    int init_client( tsd_t *TSD ) ;
543    int hookup( tsd_t *TSD, int type ) ;
544    int hookup_output( tsd_t *TSD, int type, const streng *outdata ) ;
545    int hookup_output2( tsd_t *TSD, int type, const streng *outdata1, const streng *outdata2 ) ;
546    int hookup_input( tsd_t *TSD, int type, streng **indata ) ;
547    int hookup_input_output( tsd_t *TSD, int type, const streng *outdata, streng **indata ) ;
548    streng *call_unknown_external( tsd_t *TSD, const streng *name, cparamboxptr parms, char called ) ;
549    streng *call_known_external( tsd_t *TSD, const struct entry_point *vbox, cparamboxptr parms, char called ) ;
550    streng *SubCom( tsd_t *TSD, const streng *command, const streng *envir, int *rc ) ;
551 
552 /*
553  * Routines in options.c
554  */
555    void do_options( const tsd_t *TSD, proclevel pl, streng *options, int ) ;
556    int get_options_flag( cproclevel, int ) ;
557    void set_options_flag( proclevel, int, int ) ;
558 
559 
560 /*
561  * Routines in rexxext.c
562  */
563    char *mygetenv( const tsd_t *TSD, const char *name, char *buf, int bufsize ) ;
564    void set_pause_at_exit( );
565    streng *rex_userid( tsd_t *TSD, cparamboxptr parms ) ;
566    streng *rex_getcaller( tsd_t *TSD, cparamboxptr parms ) ;
567    streng *rex_getcallstack( tsd_t *TSD, cparamboxptr parms ) ;
568    streng *rex_rxqueue( tsd_t *TSD, cparamboxptr parms ) ;
569 #if defined(WIN32) && !defined(__WINS__) && !defined(__EPOC32__)
570    void set_pause_at_exit( void );
571 #endif
572 
573 /*
574  * Routines in vmscmd.c
575  */
576    int init_vms( tsd_t *TSD ) ;
577    int vms_do_command( tsd_t *TSD, const streng *cmd, int io_flags, environment *env, Queue *redir );
578    int vms_killproc( tsd_t *TSD ) ;
579    streng *vms_resolv_symbol( tsd_t *TSD, streng *name, streng *newstr, streng *pool ) ;
580 
581 /*
582  * Routines in builtin.c
583  */
584    int init_builtin( tsd_t *TSD ) ;
585    streng *ext_pool_value( tsd_t *TSD, streng *name, streng *value, streng *env );
586    streng *std_abbrev( tsd_t *TSD, cparamboxptr parms ) ;
587    streng *std_abs( tsd_t *TSD, cparamboxptr parms ) ;
588    streng *std_address( tsd_t *TSD, cparamboxptr parms ) ;
589    streng *std_arg( tsd_t *TSD, cparamboxptr parms ) ;
590    streng *std_bitand( tsd_t *TSD, cparamboxptr parms ) ;
591    streng *std_bitor( tsd_t *TSD, cparamboxptr parms ) ;
592    streng *std_bitxor( tsd_t *TSD, cparamboxptr parms ) ;
593    streng *std_center( tsd_t *TSD, cparamboxptr parms ) ;
594    streng *std_changestr( tsd_t *TSD, cparamboxptr parms ) ;
595    streng *std_compare( tsd_t *TSD, cparamboxptr parms ) ;
596    streng *std_condition( tsd_t *TSD, cparamboxptr parms ) ;
597    streng *std_copies( tsd_t *TSD, cparamboxptr parms ) ;
598    streng *std_countstr( tsd_t *TSD, cparamboxptr parms ) ;
599    streng *std_datatype( tsd_t *TSD, cparamboxptr parms ) ;
600    streng *std_date( tsd_t *TSD, cparamboxptr parms ) ;
601    streng *std_delstr( tsd_t *TSD, cparamboxptr parms ) ;
602    streng *std_delword( tsd_t *TSD, cparamboxptr parms ) ;
603    streng *std_digits( tsd_t *TSD, cparamboxptr parms ) ;
604    streng *std_errortext( tsd_t *TSD, cparamboxptr parms ) ;
605    streng *std_form( tsd_t *TSD, cparamboxptr parms ) ;
606    streng *std_format( tsd_t *TSD, cparamboxptr parms ) ;
607    streng *std_fuzz( tsd_t *TSD, cparamboxptr parms ) ;
608    streng *std_insert( tsd_t *TSD, cparamboxptr parms ) ;
609    streng *std_lastpos( tsd_t *TSD, cparamboxptr parms ) ;
610    streng *std_length( tsd_t *TSD, cparamboxptr parms ) ;
611    streng *std_left( tsd_t *TSD, cparamboxptr parms ) ;
612    streng *std_max( tsd_t *TSD, cparamboxptr parms ) ;
613    streng *std_min( tsd_t *TSD, cparamboxptr parms ) ;
614    streng *std_overlay( tsd_t *TSD, cparamboxptr parms ) ;
615    streng *std_pos( tsd_t *TSD, cparamboxptr parms ) ;
616    streng *std_qualify( tsd_t *TSD, cparamboxptr parms ) ;
617    streng *std_queued( tsd_t *TSD, cparamboxptr parms ) ;
618    streng *std_right( tsd_t *TSD, cparamboxptr parms ) ;
619    streng *std_reverse( tsd_t *TSD, cparamboxptr parms ) ;
620    streng *std_random( tsd_t *TSD, cparamboxptr parms ) ;
621    streng *std_sign( tsd_t *TSD, cparamboxptr parms ) ;
622    streng *std_sourceline( tsd_t *TSD, cparamboxptr parms ) ;
623    streng *std_space( tsd_t *TSD, cparamboxptr parms ) ;
624    streng *std_strip( tsd_t *TSD, cparamboxptr parms ) ;
625    streng *std_substr( tsd_t *TSD, cparamboxptr parms ) ;
626    streng *std_subword( tsd_t *TSD, cparamboxptr parms ) ;
627    streng *std_symbol( tsd_t *TSD, cparamboxptr parms ) ;
628    streng *std_time( tsd_t *TSD, cparamboxptr parms ) ;
629    streng *std_trace( tsd_t *TSD, cparamboxptr parms ) ;
630    streng *std_translate( tsd_t *TSD, cparamboxptr parms ) ;
631    streng *std_trunc( tsd_t *TSD, cparamboxptr parms ) ;
632    streng *std_value( tsd_t *TSD, cparamboxptr parms ) ;
633    streng *std_verify( tsd_t *TSD, cparamboxptr parms ) ;
634    streng *std_word( tsd_t *TSD, cparamboxptr parms ) ;
635    streng *std_wordindex( tsd_t *TSD, cparamboxptr parms ) ;
636    streng *std_wordlength( tsd_t *TSD, cparamboxptr parms ) ;
637    streng *std_wordpos( tsd_t *TSD, cparamboxptr parms ) ;
638    streng *std_words( tsd_t *TSD, cparamboxptr parms ) ;
639    streng *std_xrange( tsd_t *TSD, cparamboxptr parms ) ;
640    streng *rex_poolid( tsd_t *TSD, cparamboxptr parms ) ;
641    streng *rex_lower( tsd_t *TSD, cparamboxptr parms );
642 
643 /*
644  * Routines in convert.c
645  */
646    streng *std_b2x( tsd_t *TSD, cparamboxptr parms ) ;
647    streng *std_c2d( tsd_t *TSD, cparamboxptr parms ) ;
648    streng *std_c2x( tsd_t *TSD, cparamboxptr parms ) ;
649    streng *std_d2c( tsd_t *TSD, cparamboxptr parms ) ;
650    streng *std_d2x( tsd_t *TSD, cparamboxptr parms ) ;
651    streng *std_x2b( tsd_t *TSD, cparamboxptr parms ) ;
652    streng *std_x2c( tsd_t *TSD, cparamboxptr parms ) ;
653    streng *std_x2d( tsd_t *TSD, cparamboxptr parms ) ;
654 
655 /*
656  * Routines in dbgfuncs.c
657  */
658 #ifdef FLISTS
659    streng *dbg_freelists( tsd_t *TSD, cparamboxptr parms ) ;
660 #endif
661 #ifndef NDEBUG
662 # ifdef TRACEMEM
663    streng *dbg_allocated( tsd_t *TSD, cparamboxptr parms ) ;
664 # endif
665    streng *dbg_dumpvars( tsd_t *TSD, cparamboxptr parms ) ;
666    streng *dbg_dumptree( tsd_t *TSD, cparamboxptr parms ) ;
667 # ifdef TRACEMEM
668    streng *dbg_listleaked( tsd_t *TSD, cparamboxptr parms ) ;
669    streng *dbg_memorystats( tsd_t *TSD, cparamboxptr parms ) ;
670 # endif /* TRACEMEM */
671 #endif /* !NDEBUG */
672    streng *dbg_traceback( tsd_t *TSD, cparamboxptr parms ) ;
673 
674 /*
675  * Routines in vmsfuncs.c
676  */
677 #ifdef VMS
678    streng *vms_f_directory( tsd_t *TSD, cparamboxptr parms ) ;
679    streng *vms_f_file_attributes( tsd_t *TSD, cparamboxptr parms ) ;
680    streng *vms_f_getdvi( tsd_t *TSD, cparamboxptr parms ) ;
681    streng *vms_f_getjpi( tsd_t *TSD, cparamboxptr parms ) ;
682    streng *vms_f_getqui( tsd_t *TSD, cparamboxptr parms ) ;
683    streng *vms_f_getsyi( tsd_t *TSD, cparamboxptr parms ) ;
684    streng *vms_f_identifier( tsd_t *TSD, cparamboxptr parms ) ;
685    streng *vms_f_message( tsd_t *TSD, cparamboxptr parms ) ;
686    streng *vms_f_mode( tsd_t *TSD, cparamboxptr parms ) ;
687    streng *vms_f_pid( tsd_t *TSD, cparamboxptr parms ) ;
688    streng *vms_f_privilege( tsd_t *TSD, cparamboxptr parms ) ;
689    streng *vms_f_process( tsd_t *TSD, cparamboxptr parms ) ;
690    streng *vms_f_string( tsd_t *TSD, cparamboxptr parms ) ;
691    streng *vms_f_time( tsd_t *TSD, cparamboxptr parms ) ;
692    streng *vms_f_setprv( tsd_t *TSD, cparamboxptr parms ) ;
693    streng *vms_f_user( tsd_t *TSD, cparamboxptr parms ) ;
694    streng *vms_f_locate( tsd_t *TSD, cparamboxptr parms ) ;
695    streng *vms_f_length( tsd_t *TSD, cparamboxptr parms ) ;
696    streng *vms_f_integer( tsd_t *TSD, cparamboxptr parms ) ;
697    streng *vms_f_trnlnm( tsd_t *TSD, cparamboxptr parms ) ;
698    streng *vms_f_logical( tsd_t *TSD, cparamboxptr parms ) ;
699    streng *vms_f_parse( tsd_t *TSD, cparamboxptr parms ) ;
700    streng *vms_f_search( tsd_t *TSD, cparamboxptr parms ) ;
701    streng *vms_f_type( tsd_t *TSD, cparamboxptr parms ) ;
702    streng *vms_f_file_attributes( tsd_t *TSD, cparamboxptr parms ) ;
703    streng *vms_f_extract( tsd_t *TSD, cparamboxptr parms ) ;
704    streng *vms_f_element( tsd_t *TSD, cparamboxptr parms ) ;
705    streng *vms_f_cvui( tsd_t *TSD, cparamboxptr parms ) ;
706    streng *vms_f_cvsi( tsd_t *TSD, cparamboxptr parms ) ;
707    streng *vms_f_cvtime( tsd_t *TSD, cparamboxptr parms ) ;
708    streng *vms_f_fao( tsd_t *TSD, cparamboxptr parms ) ;
709 #endif
710 
711 /*
712  * Routines in unxfuncs.c
713  */
714    streng *unx_popen( tsd_t *TSD, cparamboxptr parms ) ;
715    streng *unx_getpid( tsd_t *TSD, cparamboxptr parms ) ;
716    streng *unx_gettid( tsd_t *TSD, cparamboxptr parms ) ;
717    streng *unx_eof( tsd_t *TSD, cparamboxptr parms ) ;
718    streng *unx_uname( tsd_t *TSD, cparamboxptr parms ) ;
719    streng *unx_fork( tsd_t *TSD, cparamboxptr parms ) ;
720    streng *unx_unixerror( tsd_t *TSD, cparamboxptr parms ) ;
721    streng *unx_chdir( tsd_t *TSD, cparamboxptr parms ) ;
722    streng *unx_getenv( tsd_t *TSD, cparamboxptr parms ) ;
723    streng *unx_putenv( tsd_t *TSD, cparamboxptr parms ) ;
724    streng *unx_crypt( tsd_t *TSD, cparamboxptr parms ) ;
725 
726 /*
727  * Routines in os2funcs.c
728  */
729    streng *os2_directory( tsd_t *TSD, cparamboxptr parms ) ;
730    streng *os2_beep( tsd_t *TSD, cparamboxptr parms ) ;
731    streng *os2_filespec( tsd_t *TSD, cparamboxptr parms ) ;
732 
733 /*
734  * Routines in rexxsaa.c
735  */
736    int init_rexxsaa( tsd_t *TSD ) ;
737    void deinit_rexxsaa( tsd_t *TSD ) ;
738 
739 /*
740  * Routines in vmsfuncs.c
741  */
742    int init_vmf( tsd_t *TSD ) ;
743 
744 /*
745  * Routines in wrappers.c
746  */
747    void *wrapper_load( const tsd_t *TSD, const streng *module ) ;
748    void wrapper_unload( const tsd_t *TSD, void *libhandle ) ;
749    PFN wrapper_get_addr( const tsd_t *TSD, const struct library *lptr, const streng *name) ;
750 
751 /*
752  * Routines in staticld.c
753  */
754 #ifdef DYNAMIC_STATIC
755    void *static_dlopen( char *name );
756    int static_dlsym( void *addr, char *name, void **faddr );
757    void static_list_packages();
758 #endif
759 
760 /*
761  * Routines in strings.c
762  * string and streng routines are ugly but we need the speedup of passing the
763  * TSD to take profit from flists in the multi-threading environment.
764  */
765    void __regina_Str_first( void );
766 #if !defined(FLISTS) || defined(TRACEMEM)
767    streng *__regina_Str_make( int size ) ;
768    streng *__regina_Str_make_TSD( const tsd_t *TSD, int size ) ;
769 #  define Str_make(a)         __regina_Str_make(a)
770 #  define Str_make_TSD(TSD,a) __regina_Str_make_TSD(TSD,a)
771 #  define Str_makeTSD(size)   Str_make_TSD(TSD,size)
772 #else
773 #  define Str_make(a)         get_a_streng(a)
774 #  define Str_make_TSD(TSD,a) get_a_strengTSD(TSD,a)
775 #  define Str_makeTSD(a)      get_a_strengTSD(TSD,a)
776 #endif
777 #define nullstringptr() Str_makeTSD(0)
778    streng *Str_ndup( const streng *name, int length ) ;
779    streng *Str_ndup_TSD( const tsd_t *TSD, const streng *name, int length ) ;
780 #define Str_ndupTSD(name,length) Str_ndup_TSD(TSD,name,length)
781    streng *Str_nodup( const streng *name, int length, int offset ) ;
782    streng *Str_nodup_TSD( const tsd_t *TSD, const streng *name, int offset, int length ) ;
783 #define Str_nodupTSD(name,length,offset) Str_nodup_TSD(TSD,name,length,offset)
784    streng *Str_dup( const streng *name ) ;
785    streng *Str_dup_TSD( const tsd_t *TSD, const streng *input ) ;
786 #define Str_dupTSD(name) Str_dup_TSD(TSD,name)
787    streng *Str_dupstr( const streng *name ) ;
788    streng *Str_dupstr_TSD( const tsd_t *TSD, const streng *input ) ;
789 #define Str_dupstrTSD(name) Str_dupstr_TSD(TSD,name)
790    streng *Str_ncpy( streng *to, const streng *from, int length ) ;
791    streng *Str_ncpy_TSD( const tsd_t *TSD, streng *to, const streng *from, int length ) ;
792 #define Str_ncpyTSD(to,from,length) Str_ncpy_TSD(TSD,to,from,length)
793    streng *Str_ncre( const char *from, int length ) ;
794    streng *Str_ncre_TSD( const tsd_t *TSD, const char *from, int length ) ;
795 #define Str_ncreTSD(from,length) Str_ncre_TSD(TSD,from,length)
796    streng *Str_cat( streng *to, const streng *from ) ;
797    streng *Str_cat_TSD( const tsd_t *TSD, streng *first, const streng *second ) ;
798 #define Str_catTSD(first,second) Str_cat_TSD(TSD,first,second)
799    streng *Str_ncat( streng *to, const streng *from, int length ) ;
800    streng *Str_ncat_TSD( const tsd_t *TSD, streng *first, const streng *second, int length ) ;
801 #define Str_ncatTSD(first,second,length) Str_ncat_TSD(TSD,first,second,length)
802    streng *Str_nocat( streng *to, const streng *from, int length, int offset ) ;
803    streng *Str_nocat_TSD( const tsd_t *TSD, streng *first, const streng *second, int length, int offset ) ;
804 #define Str_nocatTSD(first,second,length,offset) Str_nocat_TSD(TSD,first,second,length,offset)
805    int Str_ncmp( const streng *one, const streng  *two, int length ) ;
806    int Str_cmp( const streng *one, const streng *two ) ;
807    int Str_ccmp( const streng *one, const streng *two ) ;
808    int Str_cncmp( const streng *one, const streng *two, int length ) ;
809    int Str_cnocmp( const streng *one, const streng *two, int length, int offset ) ;
810    streng *Str_cre( const char *value ) ;
811    streng *Str_cre_TSD( const tsd_t *TSD, const char *input ) ;
812 #define Str_creTSD(value) Str_cre_TSD(TSD,value)
813    streng *Str_crestr( const char *value );
814    streng *Str_crestr_TSD( const tsd_t *TSD, const char *input ) ;
815 #define Str_crestrTSD(input) Str_crestr_TSD(TSD,input)
816    streng *Str_catstr( streng *in, const char *more ) ;
817    streng *Str_catstr_TSD( const tsd_t *TSD, streng *base, const char *append ) ;
818 #define Str_catstrTSD(base,append) Str_catstr_TSD(TSD,base,append)
819    streng *Str_ncatstr( streng *base, const char *input, int length ) ;
820    streng *Str_ncatstr_TSD( const tsd_t *TSD, streng *base, const char *input, int length ) ;
821 #define Str_ncatstrTSD(base,input,length) Str_ncatstr_TSD(TSD,base,input,length)
822    char *str_of( const tsd_t *TSD, const streng *input ) ;
823 #define str_ofTSD(input) str_of(TSD,input)
824 #ifndef EXTERNAL_TO_REGINA
825    volatile char *tmpstr_of( tsd_t *TSD, const streng *input ) ;
826 #endif
827    streng *Str_upper( streng *in ) ;
828    streng *Str_lower( streng *in ) ;
829    streng *Str_strp( streng * input, char chr, char opt ) ;
830    void __regina_Str_last( void );
831 
832 /*
833  * Routines in strmath.c
834  */
835 #define DIVTYPE_NORMAL    0
836 #define DIVTYPE_INTEGER   1
837 #define DIVTYPE_REMAINDER 2
838 #define DIVTYPE_BOTH      3 /* use only with str_div directly ! */
839 
840    int descr_sign( const void * ) ;
841    streng *str_sign( tsd_t *TSD, const streng*);
842    streng *str_trunc( tsd_t *TSD, const streng*, int ) ;
843    streng *str_normalize( const tsd_t *TSD, const streng* ) ;
844    streng *str_digitize( tsd_t *TSD, streng*, int, int, const char *, int ) ;
845    streng *str_format( tsd_t *TSD, const streng*, int, int, int, int ) ;
846    streng *str_binerize( tsd_t *TSD, num_descr *, int, int, int, const char *, int ) ;
847    int str_true( const tsd_t *TSD, const streng* ) ;
848    streng *str_abs( tsd_t *TSD, const streng* ) ;
849    num_descr *get_a_descr( tsd_t *TSD, const char *big, int argno, const streng* ) ;
850    void free_a_descr( const tsd_t *TSD, num_descr* ) ;
851 #ifdef TRACEMEM
852    void mark_descrs( const tsd_t *TSD ) ;
853 #endif
854    int init_math( tsd_t *TSD ) ;
855    void descr_copy( const tsd_t *TSD, const num_descr *f, num_descr *s ) ;
856    num_descr *string_incr( tsd_t *TSD, num_descr *input, cnodeptr node );
857    void string_mul( tsd_t *TSD, const num_descr *f, const num_descr *s,
858                     num_descr *r, cnodeptr left, cnodeptr right );
859    void string_div( tsd_t *TSD, const num_descr *f, const num_descr *s,
860                     num_descr *r, num_descr *r2, int type, cnodeptr left,
861                     cnodeptr right );
862    int myiswnumber( tsd_t *TSD, const streng *number, num_descr **num,
863                     int noDigitsLimit );
864    void str_round( num_descr *descr, int size ) ;
865    void str_round_lostdigits( tsd_t *TSD, num_descr *descr, int size );
866    void string_pow( tsd_t *TSD, const num_descr *num, num_descr *acc,
867                     num_descr *res, cnodeptr lname, cnodeptr rname);
868    int descr_to_int( const tsd_t *TSD, const num_descr *input, int, int, const char *, int ) ;
869    num_descr *is_a_descr( const tsd_t *TSD, const streng *input ) ;
870    int getdescr( const tsd_t *TSD, const streng *num, num_descr *descr ) ;
871    int string_test( const tsd_t *TSD, const num_descr *fdescr,
872                     const num_descr *sdescr ) ;
873    void string_add( tsd_t *TSD, const num_descr *f, const num_descr *s,
874                     num_descr *r, cnodeptr left, cnodeptr right );
875    void str_strip( num_descr *num ) ;
876    streng *str_norm( const tsd_t *TSD, num_descr *in, streng *trystr )  ;
877    int streng_to_int( const tsd_t *TSD, const streng *input, int *error ) ;
878    rx_64 streng_to_rx64( const tsd_t *TSD, const streng *input, int *error ) ;
879 
880 /*
881  * Routines in instore.c
882  */
883    void NewProg(void);
884    void EndProg(nodeptr Start);
885    nodeptr FreshNode(void);
886    void RejectNode(nodeptr NoLongerUsed);
887    offsrcline *FreshLine(void);
888    void DestroyInternalParsingTree(const tsd_t *TSD, internal_parser_type *ipt);
889    external_parser_type *TinTree(const tsd_t *TSD,
890                                  const internal_parser_type *ipt,
891                                  unsigned long *length);
892    internal_parser_type ExpandTinnedTree(const tsd_t *TSD,
893                                          const external_parser_type *ept,
894                                          unsigned long length,
895                                          const char *incore_source,
896                                          unsigned long incore_source_length);
897    int IsValidTin(const external_parser_type *ept, unsigned long eptlen);
898 
899 /*
900  * Routines in arxfuncs.c
901  */
902    int init_arexxf( tsd_t *TSD );
903    streng *arexx_open ( tsd_t *TSD, cparamboxptr parm1 );
904    streng *arexx_close( tsd_t *TSD, cparamboxptr parm1 );
905    streng *arexx_writech( tsd_t *TSD, cparamboxptr parm1 );
906    streng *arexx_writeln( tsd_t *TSD, cparamboxptr parm1 );
907    streng *arexx_seek( tsd_t *TSD, cparamboxptr parm1 );
908    streng *arexx_readch( tsd_t *TSD, cparamboxptr parm1 );
909    streng *arexx_readln( tsd_t *TSD, cparamboxptr parm1 );
910    streng *arexx_eof( tsd_t *TSD, cparamboxptr parm1 );
911    streng *arexx_b2c( tsd_t *TSD, cparamboxptr parm1 );
912    streng *arexx_c2b( tsd_t *TSD, cparamboxptr parm1 );
913    streng *arexx_bitchg( tsd_t *TSD, cparamboxptr parm1 );
914    streng *arexx_bitclr( tsd_t *TSD, cparamboxptr parm1 );
915    streng *arexx_bitset( tsd_t *TSD, cparamboxptr parm1 );
916    streng *arexx_bittst( tsd_t *TSD, cparamboxptr parm1 );
917    streng *arexx_bitcomp( tsd_t *TSD, cparamboxptr parm1 );
918    streng *arexx_hash( tsd_t *TSD, cparamboxptr parm1 );
919    streng *arexx_compress( tsd_t *TSD, cparamboxptr parm1 );
920    streng *arexx_trim( tsd_t *TSD, cparamboxptr parm1 );
921    streng *arexx_upper( tsd_t *TSD, cparamboxptr parm1 );
922    streng *arexx_randu( tsd_t *TSD, cparamboxptr parm1 );
923    streng *arexx_getspace( tsd_t *TSD, cparamboxptr parm1 );
924    streng *arexx_freespace( tsd_t *TSD, cparamboxptr parm1 );
925    streng *arexx_import( tsd_t *TSD, cparamboxptr parm1 );
926    streng *arexx_export( tsd_t *TSD, cparamboxptr parm1 );
927    streng *arexx_storage( tsd_t *TSD, cparamboxptr parm1 );
928    streng *arexx_show( tsd_t *TSD, cparamboxptr parm1 );
929 
930 /*
931  ******************************************************************************
932  ******************************************************************************
933  ******************************************************************************
934  * global variables
935  */
936 
937 /* externals which are protected by regina_parser (see lexsrc.l) */
938 extern internal_parser_type parser_data;
939 extern int retlength ; /* value shared by lexsrc.l and yaccsrc.y only */
940 extern char retvalue[] ; /* value shared by lexsrc.l and yaccsrc.y only */
941 extern char *__reginatext ; /* value shared by lexsrc.l and yaccsrc.y only */
942 extern unsigned SymbolDetect ; /* value shared by lexsrc.l and yaccsrc.y only */
943 #define SD_INPUT        0x00000001
944 #define SD_OUTPUT       0x00000002
945 #define SD_ERROR        0x00000004
946 #define SD_NORMAL       0x00000008
947 #define SD_APPEND       0x00000010
948 #define SD_REPLACE      0x00000020
949 #define SD_STREAM       0x00000040
950 #define SD_STEM         0x00000080
951 #define SD_LIFO         0x00000100
952 #define SD_FIFO         0x00000200
953 #define SD_NOEOL        0x00000400
954 #define SD_ADDRWITH     0x000007FF /* All the above */
955 #ifndef NDEBUG
956 extern int __reginadebug ;
957 #endif
958 /* end of externals protected by regina_parser (see lexsrc.l) */
959 
960 extern unsigned countthreads; /* Not protected and not save in use! */
961 
962 extern const char *months[];
963 extern const char *signalnames[];
964 #ifdef WIN32
965 extern volatile int __regina_Win32CtrlCRaised;
966 #endif
967 extern unsigned char_info[];
968 extern unsigned char u_to_l[];
969 extern unsigned char l_to_u[];
970 extern const char *numeric_forms[] ;
971 extern const char *invo_strings[] ;
972 extern const char *argv0 ;
973 /* Don't terminate the following lines by a semicolon */
974 EXPORT_GLOBAL_PROTECTION_VAR(regina_globals)
975 
976