Files
retrobsd/src/cmd/smallc/initialise.c
2014-04-09 14:27:18 +01:00

104 lines
2.5 KiB
C

#include <stdio.h>
#include <string.h>
#include "defs.h"
#include "data.h"
/*
* SYMBOL_NAME 32
* TYPE 1
* LENGTH 2
* initialisation
*/
/**
* a constructor :-)
*/
void create_initials() {
int i;
for (i=0; i<INITIALS_SIZE; i++) {
initials_table[i] = 0;
}
}
/**
* add new symbol to table
* @param symbol_name
*/
void add_symbol(char *symbol_name, char type) {
strcpy(initials_table_ptr, symbol_name);
initials_table_ptr[INIT_TYPE] = type;
}
/**
* find symbol in table
* @param symbol_name
* @return
*/
int find_symbol(char *symbol_name) {
int result = 0;
int index = 0;
while (initials_table[index] != 0) {
if (astreq (symbol_name, &initials_table[index], NAMEMAX) != 0) {
result = 1;
break;
} else {
// move to next symbol
int length = ((unsigned char)initials_table[index + INIT_LENGTH] << 8) + (unsigned char)initials_table[index + INIT_LENGTH+1];
index += NAMESIZE + 1 + 2 + (2 * (length));
}
}
initials_table_ptr = &initials_table[index];
return result;
}
/**
* add data to table for given symbol
* @param symbol_name
* @param type
* @param value
*/
void add_data(char *symbol_name, int type, int value) {
int length, index;
if (find_symbol(symbol_name) == 0) {
add_symbol(symbol_name, type);
}
if (initials_table_ptr[INIT_TYPE] != type) {
error("initialiser type mismatch");
}
length = ((unsigned char)initials_table_ptr[INIT_LENGTH] << 8) + (unsigned char)initials_table_ptr[INIT_LENGTH+1];
index = NAMESIZE + 1 + 2 + (2 * length);
initials_table_ptr[index] = (0xff00 & value) >> 8;
initials_table_ptr[index + 1] = 0xff & value;
length++;
initials_table_ptr[INIT_LENGTH] = (0xff00 & length) >> 8;
initials_table_ptr[INIT_LENGTH+1] = 0xff & length;
}
/**
* get number of data items for given symbol
* @param symbol_name
* @return
*/
int get_size(char *symbol_name) {
int result = 0;
if (find_symbol(symbol_name) != 0) {
result = ((unsigned char)initials_table_ptr[INIT_LENGTH] << 8) + (unsigned char)initials_table_ptr[INIT_LENGTH+1];
}
return result;
}
/**
* get item at position
* @param symbol_name
* @param position
* @return
*/
int get_item_at(char *symbol_name, int position) {
int result = 0;
if (find_symbol(symbol_name) != 0) {
int index = NAMESIZE + 1 + 2 + (2 * position);
result = (initials_table_ptr[index] << 8) + (unsigned char)initials_table_ptr[index+1];
}
return result;
}