mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-01-24 16:35:40 +08:00
preproc: Extract reading line from predefined macros from read_line
It makes read_line less complex Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
This commit is contained in:
parent
924df0d498
commit
15bdc51187
143
preproc.c
143
preproc.c
@ -680,6 +680,80 @@ hash_findix(struct hash_table *hash, const char *str)
|
||||
return p ? *p : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* read line from standart macros set,
|
||||
* if there no more left -- return NULL
|
||||
*/
|
||||
static char *line_from_stdmac(void)
|
||||
{
|
||||
unsigned char c;
|
||||
const unsigned char *p = stdmacpos;
|
||||
char *line, *q;
|
||||
size_t len = 0;
|
||||
|
||||
if (!stdmacpos)
|
||||
return NULL;
|
||||
|
||||
while ((c = *p++)) {
|
||||
if (c >= 0x80)
|
||||
len += pp_directives_len[c - 0x80] + 1;
|
||||
else
|
||||
len++;
|
||||
}
|
||||
|
||||
line = nasm_malloc(len + 1);
|
||||
q = line;
|
||||
while ((c = *stdmacpos++)) {
|
||||
if (c >= 0x80) {
|
||||
memcpy(q, pp_directives[c - 0x80], pp_directives_len[c - 0x80]);
|
||||
q += pp_directives_len[c - 0x80];
|
||||
*q++ = ' ';
|
||||
} else {
|
||||
*q++ = c;
|
||||
}
|
||||
}
|
||||
stdmacpos = p;
|
||||
*q = '\0';
|
||||
|
||||
if (!*stdmacpos) {
|
||||
/* This was the last of the standard macro chain... */
|
||||
stdmacpos = NULL;
|
||||
if (any_extrastdmac) {
|
||||
stdmacpos = extrastdmac;
|
||||
any_extrastdmac = false;
|
||||
} else if (do_predef) {
|
||||
Line *pd, *l;
|
||||
Token *head, **tail, *t;
|
||||
|
||||
/*
|
||||
* Nasty hack: here we push the contents of
|
||||
* `predef' on to the top-level expansion stack,
|
||||
* since this is the most convenient way to
|
||||
* implement the pre-include and pre-define
|
||||
* features.
|
||||
*/
|
||||
list_for_each(pd, predef) {
|
||||
head = NULL;
|
||||
tail = &head;
|
||||
list_for_each(t, pd->first) {
|
||||
*tail = new_Token(NULL, t->type, t->text, 0);
|
||||
tail = &(*tail)->next;
|
||||
}
|
||||
|
||||
l = nasm_malloc(sizeof(Line));
|
||||
l->next = istk->expansion;
|
||||
l->first = head;
|
||||
l->finishes = NULL;
|
||||
|
||||
istk->expansion = l;
|
||||
}
|
||||
do_predef = false;
|
||||
}
|
||||
}
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
#define BUF_DELTA 512
|
||||
/*
|
||||
* Read a line from the top file in istk, handling multiple CR/LFs
|
||||
@ -692,67 +766,16 @@ static char *read_line(void)
|
||||
char *buffer, *p, *q;
|
||||
int bufsize, continued_count;
|
||||
|
||||
if (stdmacpos) {
|
||||
unsigned char c;
|
||||
const unsigned char *p = stdmacpos;
|
||||
char *ret, *q;
|
||||
size_t len = 0;
|
||||
while ((c = *p++)) {
|
||||
if (c >= 0x80)
|
||||
len += pp_directives_len[c-0x80]+1;
|
||||
else
|
||||
len++;
|
||||
}
|
||||
ret = nasm_malloc(len+1);
|
||||
q = ret;
|
||||
while ((c = *stdmacpos++)) {
|
||||
if (c >= 0x80) {
|
||||
memcpy(q, pp_directives[c-0x80], pp_directives_len[c-0x80]);
|
||||
q += pp_directives_len[c-0x80];
|
||||
*q++ = ' ';
|
||||
} else {
|
||||
*q++ = c;
|
||||
}
|
||||
}
|
||||
stdmacpos = p;
|
||||
*q = '\0';
|
||||
|
||||
if (!*stdmacpos) {
|
||||
/* This was the last of the standard macro chain... */
|
||||
stdmacpos = NULL;
|
||||
if (any_extrastdmac) {
|
||||
stdmacpos = extrastdmac;
|
||||
any_extrastdmac = false;
|
||||
} else if (do_predef) {
|
||||
Line *pd, *l;
|
||||
Token *head, **tail, *t;
|
||||
|
||||
/*
|
||||
* Nasty hack: here we push the contents of
|
||||
* `predef' on to the top-level expansion stack,
|
||||
* since this is the most convenient way to
|
||||
* implement the pre-include and pre-define
|
||||
* features.
|
||||
*/
|
||||
list_for_each(pd, predef) {
|
||||
head = NULL;
|
||||
tail = &head;
|
||||
list_for_each(t, pd->first) {
|
||||
*tail = new_Token(NULL, t->type, t->text, 0);
|
||||
tail = &(*tail)->next;
|
||||
}
|
||||
l = nasm_malloc(sizeof(Line));
|
||||
l->next = istk->expansion;
|
||||
l->first = head;
|
||||
l->finishes = NULL;
|
||||
istk->expansion = l;
|
||||
}
|
||||
do_predef = false;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* standart macros set (predefined) goes first
|
||||
*/
|
||||
p = line_from_stdmac();
|
||||
if (p)
|
||||
return p;
|
||||
|
||||
/*
|
||||
* regular read from a file
|
||||
*/
|
||||
bufsize = BUF_DELTA;
|
||||
buffer = nasm_malloc(BUF_DELTA);
|
||||
p = buffer;
|
||||
|
Loading…
Reference in New Issue
Block a user