Cosmos/Demos/zMachine/Frotz.Net/source/Desktop/FrotzBase/ZTools/symbols.cs
2016-06-09 10:34:36 -04:00

311 lines
No EOL
10 KiB
C#

/*
* symbols.c
*
* Routines for printing out symbol names, however they may be derived.
*
* Matthew T. Russotto 7 February 1998 russotto@pond.com
*
* Future: Add property type (e.g. name property contains dictionary words)
* Finish user-defined symbol table
*/
namespace ZTools
{
internal static class symbols
{
static int NAMELEN = 80;
// static int LINBUFSIZ = 256;
internal enum symtypes
{
sym_unknown = 0,
sym_routine = 1,
sym_global,
sym_local,
sym_attribute,
sym_property
};
internal enum valtypes
{
val_unknown = 0,
val_long,
val_short,
val_byte,
val_dictword,
val_routine
};
class symtab_entry_t
{
internal symtypes symtype = 0;
//internal valtypes valtype;
//internal long number;
internal char[] name = new char[NAMELEN];
};
class routine_entry_t
{
internal int symtype = 0;
//internal int valtype;
//internal long number;
internal char[] name = new char[NAMELEN];
//internal int local_entries;
//internal symtab_entry_t locals;
//internal int global_entries;
//internal symtab_entry_t globals;
};
static symtab_entry_t[] attribute_names_table = new symtab_entry_t[0];
static int attribute_entries = 0;
static symtab_entry_t[] property_names_table = new symtab_entry_t[0];
static int property_entries = 0;
static symtab_entry_t[] global_names_table = new symtab_entry_t[0];
static int global_entries = 0;
// static routine_entry_t[] routines_table;
// static int routine_entries = 0;
//#ifdef __STDC__
//static int get_type_from_name(char *tname)
//#else
//static int get_type_from_name(tname)
//char *tname;
//#endif
//{
// int ch = tname[0];
// if (isupper(ch))
// ch = tolower(ch);
// switch (ch) {
// case 'a':
// return sym_attribute;
// case 'p':
// return sym_property;
// case 'r':
// return sym_routine;
// case 'g':
// return sym_global;
// case 'l':
// return sym_local;
// }
// return sym_unknown;
//}
/*
* init_symbols
*
* Prints the name of the attribute, if known.
*/
internal static void init_symbols(string fname)
{
// long tmp;
// FILE *symfile;
// char linbuf[LINBUFSIZ];
// char *s;
// char *symname;
// int symtype;
// int routine = 0;
// int global = 0;
// int attribute = 0;
// int property = 0;
// symfile = fopen(fname, "r");
// if (symfile == NULL)
// return;
// global_entries = -1;
// attribute_entries = -1;
// property_entries = -1;
// routine_entries = 0;
// fgets(linbuf, LINBUFSIZ, symfile);
// while (!feof(symfile)) {
// s = strtok(linbuf, "\t\n\r ");
// symtype = get_type_from_name(s);
// switch (symtype) {
// case sym_routine:
// routine_entries++;
// break;
// case sym_global:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// s = strtok(NULL, "\t\n\r "); /* skip name */
// s = strtok(NULL, "\t\n\r ");
// if ((s == NULL) && (tmp > global_entries))
// global_entries = tmp;
// break;
// case sym_local:
// break;
// case sym_attribute:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// if (tmp > attribute_entries)
// attribute_entries = tmp;
// break;
// case sym_property:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// if (tmp > property_entries)
// property_entries = tmp;
// break;
// }
// fgets(linbuf, LINBUFSIZ, symfile);
// }
// global_entries++;
// attribute_entries++;
// property_entries++;
// if (routine_entries > 0)
// routines_table = (struct routine_entry_t *)calloc(sizeof(struct routine_entry_t), routine_entries);
// if (global_entries > 0)
// global_names_table = (struct symtab_entry_t *)calloc(sizeof(struct symtab_entry_t), global_entries);
// if (attribute_entries > 0)
// attribute_names_table = (struct symtab_entry_t *)calloc(sizeof(struct symtab_entry_t), attribute_entries);
// if (property_entries > 0)
// property_names_table = (struct symtab_entry_t *)calloc(sizeof(struct symtab_entry_t), property_entries);
// fseek(symfile, 0, 0);
// fgets(linbuf, LINBUFSIZ, symfile);
// while (!feof(symfile)) {
// s = strtok(linbuf, "\t\n\r ");
// symtype = get_type_from_name(s);
// switch (symtype) {
// case sym_routine:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// routines_table[routine].symtype = sym_routine;
// routines_table[routine].number = tmp;
// symname = strtok(NULL, "\t\n\r ");
// strcpy(routines_table[routine].name, symname);
// routine++;
// break;
// case sym_global:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// symname = strtok(NULL, "\t\n\r ");
// s = strtok(NULL, "\t\n\r ");
// if (s == NULL) {
// global_names_table[tmp].symtype = sym_global;
// global_names_table[tmp].number = tmp;
// strcpy(global_names_table[tmp].name, symname);
// }
// break;
// case sym_local:
// break;
// case sym_attribute:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// symname = strtok(NULL, "\t\n\r ");
// attribute_names_table[tmp].symtype = sym_attribute;
// attribute_names_table[tmp].number = tmp;
// strcpy(attribute_names_table[tmp].name, symname);
// break;
// case sym_property:
// s = strtok(NULL, "\t\n\r ");
//#ifdef HAS_STRTOUL
// tmp = strtoul(s, (char **)NULL, 0);
//#else
// tmp = atoi(s);
//#endif
// symname = strtok(NULL, "\t\n\r ");
// property_names_table[tmp].symtype = sym_property;
// property_names_table[tmp].number = tmp;
// strcpy(property_names_table[tmp].name, symname);
// break;
// }
// fgets(linbuf, LINBUFSIZ, symfile);
// }
// fclose(symfile);
}
/*
* print_attribute_name
*
* Prints the name of the attribute, if known.
*/
internal static int print_attribute_name(ulong attr_names_base, int attr_no)
{
if (attr_names_base > 0)
{
return infinfo.print_inform_attribute_name(attr_names_base, attr_no);
}
else if ((attr_no < attribute_entries) && attribute_names_table[attr_no].symtype == symtypes.sym_attribute)
{
txio.tx_printf("{0}", attribute_names_table[attr_no].name);
return 1;
}
return 0;
}
internal static int print_property_name(ulong property_names_base,
int prop_no)
{
if (property_names_base > 0)
{
return infinfo.print_inform_attribute_name(property_names_base, prop_no);
}
else if ((prop_no < property_entries) && symbols.property_names_table[prop_no].symtype == symbols.symtypes.sym_property)
{
txio.tx_printf("{0}", symbols.property_names_table[prop_no].name);
return 1;
}
return 0;
}
internal static int print_local_name(ulong start_of_routine,
int local_no)
{
return 0;
}
internal static int print_global_name(ulong start_of_routine,
int global_no)
{
if ((global_no < global_entries) && global_names_table[global_no].symtype == symtypes.sym_global)
{
txio.tx_printf("{0}", global_names_table[global_no].name);
return 1;
}
return 0;
}
}
}