From ea1947ffcc606d757357398b24e74a3f4ecefa07 Mon Sep 17 00:00:00 2001 From: neonloop Date: Wed, 20 Oct 2021 14:54:27 +0000 Subject: Initial commit from steward-fu release --- core/bgdc/src/procedure.c | 192 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 core/bgdc/src/procedure.c (limited to 'core/bgdc/src/procedure.c') diff --git a/core/bgdc/src/procedure.c b/core/bgdc/src/procedure.c new file mode 100644 index 0000000..09ca829 --- /dev/null +++ b/core/bgdc/src/procedure.c @@ -0,0 +1,192 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include +#include +#include +#ifdef TARGET_BEOS +#include +#else +#include +#endif + +#include "bgdc.h" + +/* ---------------------------------------------------------------------- */ +/* Gestor de procesos y bloques de código. Este módulo contiene funciones */ +/* de utilidad para crear procesos y bloques de código así como otras que */ +/* se emplean durante y después del compilado. */ +/* ---------------------------------------------------------------------- */ + +PROCDEF * mainproc = 0 ; +int procdef_count = 0 ; + +int procdef_maxid = -1 ; +PROCDEF ** procs = 0 ; +int procs_allocated = 0 ; + +int procdef_getid() +{ + return ++procdef_maxid ; +} + +PROCDEF * procdef_new (int typeid, int id) +{ + PROCDEF * proc = (PROCDEF *) calloc (1, sizeof(PROCDEF)) ; + int n ; + + if (!proc) + { + fprintf (stdout, "procdef_new: out of memory\n") ; + exit (1) ; + } + + proc->pridata = segment_new() ; + proc->privars = varspace_new() ; + + /* (2006/11/19 23:15 GMT-03:00, Splinter - jj_arg@yahoo.com) */ + proc->pubdata = segment_new() ; + proc->pubvars = varspace_new() ; + /* (2006/11/19 23:15 GMT-03:00, Splinter - jj_arg@yahoo.com) */ + + proc->params = -1 ; + proc->defined = 0 ; + proc->declared = 0 ; + proc->type = TYPE_DWORD ; + proc->flags = 0 ; + proc->imported = 0 ; + + proc->sentence_count = 0 ; + proc->sentences = 0 ; + + if (typeid >= procs_allocated) + { + procs_allocated = typeid + 15 ; + procs = (PROCDEF **) realloc (procs, sizeof(PROCDEF **) * procs_allocated) ; + if (!procs) + { + fprintf (stdout, "procdef_new: out of memory\n") ; + exit (1) ; + } + } + proc->typeid = typeid ; + proc->identifier = id ; + procs[typeid] = proc ; + + for (n = 0 ; n < MAX_PARAMS ; n++) + proc->paramtype[n] = TYPE_UNDEFINED ; + + proc->exitcode = 0 ; + proc->errorcode = 0 ; + + codeblock_init (&proc->code) ; + procdef_count++ ; + return proc ; +} + +PROCDEF * procdef_search (int id) +{ + int n ; + + for (n = 0 ; n <= procdef_maxid; n++) + if (procs[n]->identifier == id) return procs[n] ; + + return 0 ; +} + +PROCDEF * procdef_search_by_codeblock (CODEBLOCK * p) +{ + int n ; + + for (n = 0 ; n <= procdef_maxid; n++) + if (&procs[n]->code == p) return procs[n] ; + + return 0 ; +} + +PROCDEF * procdef_get (int typeid) +{ + return procs_allocated > typeid ? procs[typeid] : 0 ; +} + +void procdef_destroy (PROCDEF * proc) +{ + varspace_destroy (proc->privars) ; + segment_destroy (proc->pridata) ; + + /* (2006/11/20 01:09 GMT-03:00, Splinter - jj_arg@yahoo.com) */ + varspace_destroy (proc->pubvars); + segment_destroy (proc->pubdata) ; + + procs[proc->typeid] = 0 ; + free (proc->code.data) ; + free (proc->code.loops) ; + free (proc->code.labels) ; + free (proc) ; + + procdef_count-- ; +} + + +/* Realiza acciones posteriores al compilado sobre el código: + * - Convierte saltos de código de etiqueta a offset + * - Convierte identificador de procesos en CALL o TYPE a typeid */ + +void program_postprocess () +{ + int n ; + for (n = 0; n <= procdef_maxid; n++) codeblock_postprocess (&procs[n]->code) ; +} + +void program_dumpprocesses() +{ + int n; + for (n = 0; n <= procdef_maxid; n++) procdef_dump( procs[n] ); +} + +void procdef_dump( PROCDEF * proc ) +{ + printf( "\n\n---------- Process %d (%s)\n\n", proc->typeid, identifier_name( proc->identifier ) ) ; + + if ( proc->privars->count ) + { + printf( "---- Private variables\n" ) ; + varspace_dump( proc->privars, 0 ) ; + printf( "\n" ) ; + } + + if ( proc->pubvars->count ) + { + printf( "---- Public variables\n" ) ; + varspace_dump( proc->pubvars, 0 ) ; + printf( "\n" ) ; + } + + /* segment_dump (proc->pridata) ; */ + codeblock_dump( &proc->code ) ; +} -- cgit v1.2.3