home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
symbols.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
4KB
|
104 lines
/* ---------------------------------------------------------------------- */
/* Copyright (C) 1991 by Natürlich! */
/* This file is copyrighted! */
/* Refer to the documentation for details. */
/* ---------------------------------------------------------------------- */
#include "defines.h"
#include "nasm.h"
#include "debug.h"
#include "labels.h"
#include OSBIND
#include NMALLOC_H
label huge *h_macro[SEP], huge *t_macro[SEP], huge *l_macro,
huge *h_local[SEP], huge *t_local[SEP], huge *l_local,
huge *h_global[SEP], huge *t_global[SEP], huge *l_global;
int u_local, u_macro, u_global;
lword l_hash;
char err_defined[] = "label already defined",
warn_0fwd[] = "assumed 2-byte fwd address was i.e. zeropage",
warn_equfwd[] = ".= label was fwd referenced";
#undef X
#if LINKER
#define X 0
#else
#define X 30
#endif
/* This is a conversion table to extract a more or less significant */
/* 5 bit hash value out of a 7 bit ascii char. this will be stored *
/* into ->hash as .aaaaabbbbbccccc .dddddeeeefffff */
char hash_tab[] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, 12,13,14,15, /* $ 0 */
16,17,18,19, 20,21,22,23, 24,25,26,27, 28,29,30,31, /* $10 */
27,28,29,30, 31,17,22,10, 23,26,31,30, 29,28,27,26, /* $20 */
25,24,23,22, 21,20,19,18, 17,16,15,14, 13,12,11,10, /* $30 */
9, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, 12,13,14,15, /* $40 */
16,17,18,19, 20,21,22,23, 24,25,26, 8, 7, 6, 5, 4, /* $50 */
3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, /* $60 */
15,16,17,18, 18,20,21,22, 23,24,25,26, 27,28,29,30, /* $70 */
};
/* if you change the is_where order for some reason, you'd need */
/* to look at VfL variables (probably) and at "clean_mats" */
char is_where[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* $ 0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* $10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, /* $20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* $30 */
1, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13, 14,15,16,17, /* $40 */
18,19,20,21, 22,23,24,25, 26,27,28, 0, 0, 0, 0,29, /* $50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* $60 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X, 0, 0, 0 /* $70 */
};
#undef X
/* ---------------------------------------------------------- */
/* Mallocer for the labelstructure */
/* */
/* (Keeping the fingers crossed that this is faster than a) */
/* (simple malloc) */
/* Mallocer for the local labels */
/* Hold on. I don't get it. Why TWO mallocers for labels? */
/* The point is that global label space is never freed until */
/* assembly is completed, whereas local label space is freed */
/* whenever a .LOCAL appears. Since we like to reclaim memory */
/* We need a different mallocer (+ freeer) */
/* ---------------------------------------------------------- */
make_mallocer( label, LABMAX, lab_alloc)
dup_mallocer( label, LLABMAX, llab_alloc, l)
void llab_free()
{
register label_m huge *p = llabel_h,
huge *q; /* q for multitaskin' (har) */
ENTER("llab_free");
if( p)
for(;;)
{
if( ! p->before)
{
p->free = LLABMAX;
p->tab = (label *) ((char huge *) p + sizeof( label_m));
llabel_h = p;
LEAVE();
return;
}
q = p;
p = p->before;
nfree( (void *) q);
}
LEAVE();
}