summaryrefslogtreecommitdiff
path: root/stdscan.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2008-06-01 21:34:49 -0700
committerH. Peter Anvin <hpa@zytor.com>2008-06-01 21:34:49 -0700
commit6ecc159a54c643a46c5682fd9245601c252924f5 (patch)
tree19ee83dab5cca46eb0840a6d1fcf92f7eaa907ac /stdscan.c
parent8cad14bbcf0b8c056e6f81dccf4af38537e0bac6 (diff)
downloadnasm-6ecc159a54c643a46c5682fd9245601c252924f5.tar.gz
qstring: backquoted strings seem to work now...
Hopefully backquoted strings should work correctly now.
Diffstat (limited to 'stdscan.c')
-rw-r--r--stdscan.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/stdscan.c b/stdscan.c
index 30269e47..0fdd7af0 100644
--- a/stdscan.c
+++ b/stdscan.c
@@ -8,6 +8,7 @@
#include "nasm.h"
#include "nasmlib.h"
+#include "quote.h"
#include "stdscan.h"
#include "insns.h"
@@ -166,26 +167,30 @@ int stdscan(void *private_data, struct tokenval *tv)
r = stdscan_copy(r, stdscan_bufptr - r);
tv->t_integer = readnum(r, &rn_error);
stdscan_pop();
- if (rn_error)
- return tv->t_type = TOKEN_ERRNUM; /* some malformation occurred */
+ if (rn_error) {
+ /* some malformation occurred */
+ return tv->t_type = TOKEN_ERRNUM;
+ }
tv->t_charptr = NULL;
return tv->t_type = TOKEN_NUM;
}
- } else if (*stdscan_bufptr == '\'' || *stdscan_bufptr == '"') {
+ } else if (*stdscan_bufptr == '\'' || *stdscan_bufptr == '"' ||
+ *stdscan_bufptr == '`') {
/* a char constant */
- char quote = *stdscan_bufptr++, *r;
+ char s;
bool rn_warn;
- r = tv->t_charptr = stdscan_bufptr;
- while (*stdscan_bufptr && *stdscan_bufptr != quote)
- stdscan_bufptr++;
- tv->t_inttwo = stdscan_bufptr - r; /* store full version */
- if (!*stdscan_bufptr)
+ stdscan_bufptr = nasm_skip_string(tv->t_charptr = stdscan_bufptr);
+ s = *stdscan_bufptr;
+ tv->t_inttwo = nasm_unquote(tv->t_charptr);
+ if (!s)
return tv->t_type = TOKEN_ERRNUM; /* unmatched quotes */
stdscan_bufptr++; /* skip over final quote */
- tv->t_integer = readstrnum(r, tv->t_inttwo, &rn_warn);
- /* rn_warn is not checked on purpose; it might not be a valid number */
+ tv->t_integer = readstrnum(tv->t_charptr, tv->t_inttwo, &rn_warn);
+ /* Issue: can't readily check rn_warn, because we might be in
+ a db family context... */
return tv->t_type = TOKEN_NUM;
- } else if (*stdscan_bufptr == ';') { /* a comment has happened - stay */
+ } else if (*stdscan_bufptr == ';') {
+ /* a comment has happened - stay */
return tv->t_type = 0;
} else if (stdscan_bufptr[0] == '>' && stdscan_bufptr[1] == '>') {
stdscan_bufptr += 2;