mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-07-11 01:44:10 +02:00
First merge of 2.064 beta.
This corresponds to DMD commit a913ce4bc59a94a022a27e390fc841f4aededffb. Doesn't build Phobos yet.
This commit is contained in:
committed by
Kai Nacke
parent
c400d180d2
commit
cb341586e3
36
dmd2/macro.c
36
dmd2/macro.c
@@ -21,16 +21,16 @@
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
int isIdStart(unsigned char *p);
|
||||
int isIdTail(unsigned char *p);
|
||||
int utfStride(unsigned char *p);
|
||||
int isIdStart(utf8_t *p);
|
||||
int isIdTail(utf8_t *p);
|
||||
int utfStride(utf8_t *p);
|
||||
|
||||
unsigned char *memdup(unsigned char *p, size_t len)
|
||||
utf8_t *memdup(utf8_t *p, size_t len)
|
||||
{
|
||||
return (unsigned char *)memcpy(mem.malloc(len), p, len);
|
||||
return (utf8_t *)memcpy(mem.malloc(len), p, len);
|
||||
}
|
||||
|
||||
Macro::Macro(unsigned char *name, size_t namelen, unsigned char *text, size_t textlen)
|
||||
Macro::Macro(utf8_t *name, size_t namelen, utf8_t *text, size_t textlen)
|
||||
{
|
||||
next = NULL;
|
||||
|
||||
@@ -51,7 +51,7 @@ Macro::Macro(unsigned char *name, size_t namelen, unsigned char *text, size_t te
|
||||
}
|
||||
|
||||
|
||||
Macro *Macro::search(unsigned char *name, size_t namelen)
|
||||
Macro *Macro::search(utf8_t *name, size_t namelen)
|
||||
{ Macro *table;
|
||||
|
||||
//printf("Macro::search(%.*s)\n", namelen, name);
|
||||
@@ -67,7 +67,7 @@ Macro *Macro::search(unsigned char *name, size_t namelen)
|
||||
return table;
|
||||
}
|
||||
|
||||
Macro *Macro::define(Macro **ptable, unsigned char *name, size_t namelen, unsigned char *text, size_t textlen)
|
||||
Macro *Macro::define(Macro **ptable, utf8_t *name, size_t namelen, utf8_t *text, size_t textlen)
|
||||
{
|
||||
//printf("Macro::define('%.*s' = '%.*s')\n", namelen, name, textlen, text);
|
||||
|
||||
@@ -98,7 +98,7 @@ Macro *Macro::define(Macro **ptable, unsigned char *name, size_t namelen, unsign
|
||||
* -1: get 2nd through end
|
||||
*/
|
||||
|
||||
size_t extractArgN(unsigned char *p, size_t end, unsigned char **pmarg, size_t *pmarglen, int n)
|
||||
size_t extractArgN(utf8_t *p, size_t end, utf8_t **pmarg, size_t *pmarglen, int n)
|
||||
{
|
||||
/* Scan forward for matching right parenthesis.
|
||||
* Nest parentheses.
|
||||
@@ -130,7 +130,7 @@ size_t extractArgN(unsigned char *p, size_t end, unsigned char **pmarg, size_t *
|
||||
*pmarg = p + v;
|
||||
|
||||
for (; v < end; v++)
|
||||
{ unsigned char c = p[v];
|
||||
{ utf8_t c = p[v];
|
||||
|
||||
switch (c)
|
||||
{
|
||||
@@ -238,7 +238,7 @@ size_t extractArgN(unsigned char *p, size_t end, unsigned char **pmarg, size_t *
|
||||
*/
|
||||
|
||||
void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
unsigned char *arg, size_t arglen)
|
||||
utf8_t *arg, size_t arglen)
|
||||
{
|
||||
#if 0
|
||||
printf("Macro::expand(buf[%d..%d], arg = '%.*s')\n", start, *pend, arglen, arg);
|
||||
@@ -259,7 +259,7 @@ void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
arg = memdup(arg, arglen);
|
||||
for (size_t u = start; u + 1 < end; )
|
||||
{
|
||||
unsigned char *p = buf->data; // buf->data is not loop invariant
|
||||
utf8_t *p = buf->data; // buf->data is not loop invariant
|
||||
|
||||
/* Look for $0, but not $$0, and replace it with arg.
|
||||
*/
|
||||
@@ -273,10 +273,10 @@ void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
continue;
|
||||
}
|
||||
|
||||
unsigned char c = p[u + 1];
|
||||
utf8_t c = p[u + 1];
|
||||
int n = (c == '+') ? -1 : c - '0';
|
||||
|
||||
unsigned char *marg;
|
||||
utf8_t *marg;
|
||||
size_t marglen;
|
||||
extractArgN(arg, arglen, &marg, &marglen, n);
|
||||
if (marglen == 0)
|
||||
@@ -327,7 +327,7 @@ void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
*/
|
||||
for (size_t u = start; u + 4 < end; )
|
||||
{
|
||||
unsigned char *p = buf->data; // buf->data is not loop invariant
|
||||
utf8_t *p = buf->data; // buf->data is not loop invariant
|
||||
|
||||
/* A valid start of macro expansion is $(c, where c is
|
||||
* an id start character, and not $$(c.
|
||||
@@ -335,10 +335,10 @@ void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
if (p[u] == '$' && p[u + 1] == '(' && isIdStart(p+u+2))
|
||||
{
|
||||
//printf("\tfound macro start '%c'\n", p[u + 2]);
|
||||
unsigned char *name = p + u + 2;
|
||||
utf8_t *name = p + u + 2;
|
||||
size_t namelen = 0;
|
||||
|
||||
unsigned char *marg;
|
||||
utf8_t *marg;
|
||||
size_t marglen;
|
||||
|
||||
size_t v;
|
||||
@@ -346,7 +346,7 @@ void Macro::expand(OutBuffer *buf, size_t start, size_t *pend,
|
||||
* beginning of macro argument (marg).
|
||||
*/
|
||||
for (v = u + 2; v < end; v+=utfStride(p+v))
|
||||
{ unsigned char c = p[v];
|
||||
{ utf8_t c = p[v];
|
||||
|
||||
if (!isIdTail(p+v))
|
||||
{ // We've gone past the end of the macro name.
|
||||
|
||||
Reference in New Issue
Block a user