PERFORCE change 100829 for review
Spencer Whitman
swhitman at FreeBSD.org
Fri Jul 7 02:18:46 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100829
Change 100829 by swhitman at swhitman_joethecat on 2006/07/07 02:18:24
More commenting and debugging. Started the #define macro function.
Affected files ...
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/cpp.c#7 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/k.c#8 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/k.h#6 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/lexer.c#6 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/string.c#6 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/test.c#5 edit
.. //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/test.h#1 add
Differences ...
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/cpp.c#7 (text+ko) ====
@@ -47,11 +47,14 @@
static TAILQ_HEAD(,iarg) iarg = TAILQ_HEAD_INITIALIZER(iarg);
static void cppfile(struct h *h, struct ref *r);
-static void cpp_expand(struct cppfilestate *cfs, struct ref *r, const char *s, const char *e);
+static void cpp_expand(struct cppfilestate *cfs, struct ref *r,
+ const char *s, const char *e);
-typedef void (cpp_func)(struct cppfilestate *, const char *, const char *, const char *);
+typedef void (cpp_func)(struct cppfilestate *, const char *, const char *,
+ const char *);
-#define CPP_ARGS struct cppfilestate *cfs __unused, const char *h __unused, const char *b __unused, const char *e __unused
+#define CPP_ARGS struct cppfilestate *cfs __unused, const char *h __unused, \
+ const char *b __unused, const char *e __unused
const char *mag_line, *mag_file;
@@ -153,7 +156,6 @@
if (s == e)
return;
D(0x10, "expand <%V>\n", String(s, e));
- /* XXX HERE */
Lexer(cfs->h->tokens, s, e);
}
@@ -219,6 +221,14 @@
}
static void
+cpp_define(CPP_ARGS)
+{
+ /* struct cppfilestate *cfs __unused, const char *h __unused,
+ const char *b __unused, const char *e __unused */
+ printf("#define of %V\n",String(b,e));
+}
+
+static void
cppchunk(struct cppfilestate *cfs, const char *s, const char *e)
{
/* NOTE: cfs-> is uninitalized for first call to cppchunk */
@@ -227,7 +237,6 @@
return;
}
if (cfs->s != NULL)
- /* XXX HERE */
cpp_expand(cfs, cfs->r, cfs->s, cfs->e);
cfs->s = s;
cfs->e = e;
@@ -239,12 +248,12 @@
unsigned l; /* Length of key word */
cpp_func *func;
} cpp_kw[] = {
- { "define", 0, NULL },
+ { "define", 0, cpp_define },
{ "error", 0, cpp_error },
{ "include", 0, cpp_include },
{ "pragma", 0, cpp_pragma },
{ "warning", 0, cpp_warning },
- { NULL, 0, NULL }
+ { NULL, 0, NULL }
};
static void
@@ -268,18 +277,20 @@
* pointing to a preparser function...
*/
if (p >= e || *p != '#') {
- /* XXX off from cppfilestate is only used here and will always be
- true */
+ /* XXX "off" from cppfilestate is only used here so this will
+ always be true */
if (!cfs->off)
- /* XXX HERE */
cppchunk(cfs, s, e);
+
return;
}
cppchunk(cfs, NULL, NULL);
+ /* We must be looking at a preparcessor macro */
assert(*p == '#');
cfs->hash = s;
+ /* Ignore unwanted whitespace */
p = skipspace(cfs, p + 1, e);
e = trimspace(p, e);
if (p == e) {
@@ -288,6 +299,8 @@
}
D(1, "line <%V>\n", String(p, e));
+
+ /* Scan thru the preprocessor keywords */
for (kw = cpp_kw; kw->q != NULL; kw++) {
if (*p < *kw->q)
break;
@@ -298,11 +311,13 @@
if (memcmp(kw->q, p, kw->l))
continue;
p += kw->l;
+ /* If it exists, execute cpp function */
if (kw->func != NULL)
- kw->func(cfs, cfs->hash, p, e);
+ kw->func(cfs, cfs->hash, p, e);
cfs->hash = NULL;
return;
}
+
cfs->hash = NULL;
if (isdigit(p[0])) /* Ignore "# %d \"%s\" */
return;
@@ -343,7 +358,6 @@
}
if (q == e) {
- /* XXX HERE */
cppline(&cfs, p, q);
break;
}
@@ -402,7 +416,8 @@
h->r->sf = LoadFile(filename);
/* set the head refrence s struct to that of the sourcefile's */
h->r->s = h->r->sf->s;
+ /* Preprocess the file */
cppfile(h, h->r);
- /* XXX HERE */
+ /* Add acumulated tokens to the lexer */
Lexer(h->tokens, NULL, NULL);
}
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/k.c#8 (text+ko) ====
@@ -1,3 +1,4 @@
+#include <sys/queue.h>
#include <stdio.h>
#include <unistd.h>
@@ -9,7 +10,6 @@
#include <inttypes.h>
#include <wchar.h>
#include <printf.h>
-#include <sys/queue.h>
#include "k.h"
@@ -179,7 +179,6 @@
} else
errx(1, "Unknown filename suffix %Q", p);
- /* XXX HERE */
Cpp(hf, argv[ch]);
if (0)
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/k.h#6 (text+ko) ====
@@ -34,12 +34,12 @@
struct token {
- unsigned tok;
- const char *b, *e;
- TAILQ_ENTRY(token) list;
- const char *name;
- struct symbol *sym;
- struct token *chain;
+ unsigned tok;
+ const char *b, *e; /* pointers to token in original file */
+ TAILQ_ENTRY(token) list;
+ const char *name;
+ struct symbol *sym;
+ struct token *chain;
};
TAILQ_HEAD(tokenhead, token);
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/lexer.c#6 (text+ko) ====
@@ -1,4 +1,4 @@
-#include <sys/queue.h>
+ #include <sys/queue.h>
#include <stdio.h>
#include <err.h>
@@ -62,6 +62,8 @@
t->tok = tok;
t->b = b;
t->e = e;
+
+ /* Add this token to the token list */
if (tok == CSTR) {
tt = TAILQ_LAST(&ts->tokens, tokenhead);
if (tt != NULL && tt->tok == CSTR) {
@@ -111,6 +113,7 @@
if (*ptr != '.') {
/* Integer part */
if (*ptr == '0' &&
+ /* Hex, use base 16 */
(ptr[1] == 'x' || ptr[1] == 'X') &&
isxdigit(ptr[2])) {
ptr += 2;
@@ -145,31 +148,36 @@
static const char *
un_hash(const char *s, const char *e)
{
- const char *r;
- char *p, *q;
- int same = 1;
-
- q = p = malloc(1 + (e - s));
- assert(p != 0);
- while (s < e) {
- if (isspace(*s) || *s == '#') {
- for (r = s; r < e && isspace(*r); r++)
- continue;
- if (r + 1 < e && *r == '#' && r[1] == '#') {
- r += 2;
- for (; r < e && isspace(*r); r++)
- continue;
- s = r;
- same = 0;
- }
- }
- *q++ = *s++;
- }
- *q = '\0';
- if (!same)
- return (p);
- free(p);
- return (NULL);
+ const char *r;
+ char *p; /*, *q;*/ /* XXX Q seems unneccessary (just a memory leak) */
+ int same = 1;
+
+ /*q =*/ p = malloc(1 + (e - s));
+ assert(p != 0);
+
+ while (s < e) {
+ /* XXX Isn't stdc only one '#' ? */
+ if (isspace(*s) || *s == '#') {
+ /* Skip the begining space */
+ for (r = s; r < e && isspace(*r); r++)
+ continue;
+ /* If r is not at the end, and points to "##..." */
+ if (r + 1 < e && *r == '#' && r[1] == '#') {
+ r += 2;
+ /* Skip spaces */
+ for (; r < e && isspace(*r); r++)
+ continue;
+ s = r;
+ same = 0;
+ }
+ }
+ /**q++ = */ *s++;
+ }
+ /* *q = '\0'; */
+ if (!same)
+ return (p);
+ free(p);
+ return (NULL);
}
void
@@ -184,38 +192,50 @@
unsigned tok;
struct token *t;
+ /* If there is no begining of the file, add whatever tokens we have so far */
if (b == NULL) {
- /* XXX HERE */
add_token(ts, EOI, NULL, NULL);
return;
}
+
+ /* Make sure e is well formed */
if (e == NULL)
e = strchr(b, '\0');
assert(e != NULL);
+
if (1) {
printf("LEX1 %V\n", String(b, e));
}
+
p = un_hash(b, e);
if (p != NULL) {
+ /* There were spaces and/or ##s, skip ahead of them */
b = p;
e = strchr(b, '\0');
assert(e != NULL);
}
+ /* XXX The above doesn't seem to do anything? */
if (1) {
printf("LEX2 %V\n", String(b, e));
}
+
+ /* Lex everything */
while (b < e) {
switch(*b) {
- case '\n': case '\r': case '\v': case '\f':
+ case '\n': case '\r': case '\v': case '\f': case '\t': case ' ':
+ /* If newline, return, ?, ?, tab, or space move to the next char */
b++;
continue;
+
case '\\':
+ /* Only continue if "\" is followed by "\n" */
if (b[1] == '\n') {
b += 2;
continue;
}
- break;
+ break; /* XXX Should this break here? I don't understand this case */
+
case '/':
if (b[1] == '*') {
/* Ignore comments */
@@ -230,18 +250,18 @@
if (b[1] == '/')
errx(1, "// comment");
break;
- case '\t':
- case ' ':
- b++;
- continue;
+
case '\'':
+ /* Add a char */
if (b[1] != '\\' && b[2] == '\'') {
t = add_token(ts, CNUM, b, b + 3);
t->name = String(b, b + 3);
b += 3;
continue;
}
+
if (b[1] == '\\') {
+ /* Determine if it is a valid '\something' char */
i = BackSlash(b + 2, &p);
if (i >= 0 && *p == '\'') {
p++;
@@ -252,32 +272,41 @@
}
}
break;
+
case '"':
+ /* Add a string */
s = StringEnd(b, e);
assert(s != NULL);
printf("Lex: \"%V\"\n", String(b, s));
t = add_token(ts, CSTR, b, s);
b = s;
continue;
+
case '#':
+ /* XXX Not quite sure what this case does */
printf("# %V\n", String(b, e));
u = strtoul(b + 1, &q, 0);
if (q == NULL)
errx(1, "Preproc børk1");
+ /* Skip whitespace and if char is >= LOW_TOKEN */
while (isspace(*q) && !isvert(*q))
q++;
+
if (*q != '"')
printf("Preproc børk2 (%02x) %V\n",
*q, String(b, e));
+
s = StringEnd(q, e);
posf = String(q, s);
while (s < e && !isvert(*s))
s++;
b = s;
continue;
+
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
+ /* Find the end of this number, and add it to the list */
s = NumberEnd(b);
if (s != NULL) {
t = add_token(ts, CNUM, b, s);
@@ -286,15 +315,21 @@
continue;
}
break;
+
default:
break;
- }
+ } /* switch(*b) */
+
tok = fixed_token(b, &s);
+
+ /* If we saw normal token (?) add it to the list */
if (tok > 0) {
t = add_token(ts, tok, b, s);
b = s;
continue;
}
+
+ /* Add this token to the end of the ident1 (XXX Not sure what that is) */
if (isident1(b[0])) {
for (p = b + 1; isident(*p); p++)
continue;
@@ -303,6 +338,8 @@
b += (p - b);
continue;
}
+
+ /* Failed to recognize what we saw, so exit */
strncpy(buf, b, 20);
printf("Unknown: >>>>%V\n", buf);
exit (0);
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/string.c#6 (text+ko) ====
@@ -199,6 +199,7 @@
int i;
const char *p, *s;
+ /* Return the address of the end of the string */
for (p = ptr + 1; p < ep;) {
if (*p == '"')
return (p + 1);
==== //depot/projects/soc2006/swhitman-K_Kernel_Meta-Language/k/test.c#5 (text+ko) ====
@@ -1,4 +1,4 @@
-
+#include "test.h"
int
main(int argc, char **argv)
More information about the p4-projects
mailing list