raising the head after a three-weeks refactoring
[m6w6/ext-psi] / src / parser.re
index 10279ed7674f52f618a92f0eb8601b6fcb0c926c..d2edd5ea15cd69de7ddadbe6b6322162b82c3c2e 100644 (file)
@@ -1,25 +1,21 @@
-#include <stddef.h>
-#include <stdio.h>
+#include "php_psi_stdinc.h"
 #include <assert.h>
-#include <errno.h>
-#include <string.h>
 
 #include "parser.h"
-#include "parser_proc.h"
 
-void *PSI_ParserProcAlloc(void*(unsigned long));
-void PSI_ParserProcFree(void*, void(*)(void*));
-void PSI_ParserProc(void *, token_t, PSI_Token *, PSI_Parser *);
-void PSI_ParserProcTrace(FILE *, const char*);
+void *psi_parser_proc_Alloc(void*(unsigned long));
+void psi_parser_proc_Free(void*, void(*)(void*));
+void psi_parser_proc_(void *, token_t, struct psi_token *, struct psi_parser *);
+void psi_parser_proc_Trace(FILE *, const char*);
 
-PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb error, unsigned flags)
+struct psi_parser *psi_parser_init(struct psi_parser *P, const char *filename, psi_error_cb error, unsigned flags)
 {
        FILE *fp;
 
        fp = fopen(filename, "r");
 
        if (!fp) {
-               if (!(flags & PSI_PARSER_SILENT)) {
+               if (!(flags & PSI_SILENT)) {
                        error(NULL, NULL, PSI_WARNING, "Could not open '%s' for reading: %s",
                                        filename, strerror(errno));
                }
@@ -31,26 +27,25 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err
        }
        memset(P, 0, sizeof(*P));
 
-       P->psi.file.fn = strdup(filename);
+       psi_data_ctor_with_dtors(PSI_DATA(P), error, flags);
+       P->file.fn = strdup(filename);
        P->fp = fp;
        P->col = 1;
        P->line = 1;
-       P->error = error;
-       P->flags = flags;
-       P->proc = PSI_ParserProcAlloc(malloc);
+       P->proc = psi_parser_proc_Alloc(malloc);
 
-       if (flags & PSI_PARSER_DEBUG) {
-               PSI_ParserProcTrace(stderr, "PSI> ");
+       if (flags & PSI_DEBUG) {
+               psi_parser_proc_Trace(stderr, "PSI> ");
        }
 
-       PSI_ParserFill(P, 0);
+       psi_parser_fill(P, 0);
 
        return P;
 }
 
-size_t PSI_ParserFill(PSI_Parser *P, size_t n)
+ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
 {
-       if (P->flags & PSI_PARSER_DEBUG) {
+       if (P->flags & PSI_DEBUG) {
                fprintf(stderr, "PSI> Fill: n=%zu\n", n);
        }
        if (!n) {
@@ -78,43 +73,43 @@ size_t PSI_ParserFill(PSI_Parser *P, size_t n)
                        P->eof = P->lim;
                }
 
-               if (P->flags & PSI_PARSER_DEBUG) {
+               if (P->flags & PSI_DEBUG) {
                        fprintf(stderr, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
                                consumed, reserved, available, didread);
                }
        }
-       if (P->flags & PSI_PARSER_DEBUG) {
-               fprintf(stderr, "PSI> Fill: avail=%zu\n", P->lim - P->cur);
+       if (P->flags & PSI_DEBUG) {
+               fprintf(stderr, "PSI> Fill: avail=%td\n", P->lim - P->cur);
        }
        return P->lim - P->cur;
 }
 
-void PSI_ParserParse(PSI_Parser *P, PSI_Token *T)
+void psi_parser_parse(struct psi_parser *P, struct psi_token *T)
 {
        if (T) {
-               PSI_ParserProc(P->proc, T->type, T, P);
+               psi_parser_proc_(P->proc, T->type, T, P);
        } else {
-               PSI_ParserProc(P->proc, 0, NULL, P);
+               psi_parser_proc_(P->proc, 0, NULL, P);
        }
 }
 
-void PSI_ParserDtor(PSI_Parser *P)
+void psi_parser_dtor(struct psi_parser *P)
 {
-       PSI_ParserProcFree(P->proc, free);
+       psi_parser_proc_Free(P->proc, free);
 
        if (P->fp) {
                fclose(P->fp);
        }
 
-       PSI_DataDtor((PSI_Data *) P);
+       psi_data_dtor(PSI_DATA(P));
 
        memset(P, 0, sizeof(*P));
 }
 
-void PSI_ParserFree(PSI_Parser **P)
+void psi_parser_free(struct psi_parser **P)
 {
        if (*P) {
-               PSI_ParserDtor(*P);
+               psi_parser_dtor(*P);
                free(*P);
                *P = NULL;
        }
@@ -129,10 +124,10 @@ void PSI_ParserFree(PSI_Parser **P)
 
 #define RETURN(t) do { \
        P->num = t; \
-       if (P->flags & PSI_PARSER_DEBUG) { \
+       if (P->flags & PSI_DEBUG) { \
                fprintf(stderr, "PSI> TOKEN: %d %.*s (EOF=%d %s:%u:%u)\n", \
                                P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF, \
-                               P->psi.file.fn, P->line, P->col); \
+                               P->file.fn, P->line, P->col); \
        } \
        return t; \
 } while(1)
@@ -145,7 +140,7 @@ void PSI_ParserFree(PSI_Parser **P)
        ++P->line; \
        goto label
 
-token_t PSI_ParserScan(PSI_Parser *P)
+token_t psi_parser_scan(struct psi_parser *P)
 {
        for (;;) {
                ADDCOLS;
@@ -157,14 +152,14 @@ token_t PSI_ParserScan(PSI_Parser *P)
                re2c:define:YYCURSOR = P->cur;
                re2c:define:YYLIMIT = P->lim;
                re2c:define:YYMARKER = P->mrk;
-               re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(PSI_T_EOF); }";
+               re2c:define:YYFILL = "{ if (!psi_parser_fill(P,@@)) RETURN(PSI_T_EOF); }";
                re2c:yyfill:parameter = 0;
 
                B = [^a-zA-Z0-9_];
                W = [a-zA-Z0-9_];
                NAME = [a-zA-Z_]W*;
                NSNAME = (NAME)? ("\\" NAME)+;
-               DOLLAR_NAME = '$' NAME;
+               DOLLAR_NAME = '$' W+;
                QUOTED_STRING = "\"" ([^\"])+ "\"";
                NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
 
@@ -215,6 +210,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                'ARRAY' {RETURN(PSI_T_ARRAY);}
                'OBJECT' {RETURN(PSI_T_OBJECT);}
                'CALLBACK' {RETURN(PSI_T_CALLBACK);}
+               'STATIC' {RETURN(PSI_T_STATIC);}
                'FUNCTION' {RETURN(PSI_T_FUNCTION);}
                'TYPEDEF' {RETURN(PSI_T_TYPEDEF);}
                'STRUCT' {RETURN(PSI_T_STRUCT);}
@@ -236,6 +232,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                'ARRVAL' {RETURN(PSI_T_ARRVAL);}
                'OBJVAL' {RETURN(PSI_T_OBJVAL);}
                'ZVAL' {RETURN(PSI_T_ZVAL);}
+               'COUNT' {RETURN(PSI_T_COUNT);}
                'CALLOC' {RETURN(PSI_T_CALLOC);}
                'TO_OBJECT' {RETURN(PSI_T_TO_OBJECT);}
                'TO_ARRAY' {RETURN(PSI_T_TO_ARRAY);}