#include "config.h"
#include <glib.h>
+#include <string.h>
#include "parse.h"
+#include "main.h"
+
+extern gboolean for_cpp;
static int parenth_depth = 0;
static int before_comment = INITIAL;
static int header_c = FALSE;
static GString *cbuf = NULL;
+int ccode_line = 1;
+
+GList *include_files = NULL;
+/* 0 no, 1 means yes, 2+ means don't even start looking anymore */
+static int look_for_includes = 0;
int line_no = 1;
<*>\n { line_no++; REJECT; }
+<*>MOTHERFUCKER { fprintf(stderr,"You are a bad bad person!\n"); REJECT; }
+
\/\/.*$ { ; /*comment, ignore*/ }
-<C_CODE>\/\/.*$ { ; /*comment, ignore*/ }
+<C_CODE>^#[ \t]*include[ \t][<"][^\n">]*[>"] {
+ if(look_for_includes==1) {
+ char *p;
+ char *file;
+ char *str = g_strdup(yytext);
+ file = strchr(str,'"');
+ if(!file) file = strchr(str,'<');
+ file++;
+ p = strchr(file,'"');
+ if(!p) p = strchr(file,'>');
+ *p = '\0';
+ include_files = g_list_prepend(include_files,g_strdup(file));
+ g_free(str);
+ }
+ REJECT;
+}
+
+<C_CODE>\/\/.*$ { add_to_cbuf(yytext); /*comment, ignore*/ }
<CLASS_CODE>\/\/.*$ { ; /*comment, ignore*/ }
<CLASS_CODE_I>\/\/.*$ { ; /*comment, ignore*/ }
\/\* {BEGIN(COMMENT); before_comment = INITIAL; }
-<C_CODE>\/\* {BEGIN(COMMENT); before_comment = C_CODE; }
+<C_CODE>\/\* {
+ add_to_cbuf(yytext);
+ BEGIN(COMMENT);
+ before_comment = C_CODE;
+}
<CLASS_CODE>\/\* {BEGIN(COMMENT); before_comment = CLASS_CODE; }
<CLASS_CODE_I>\/\* {BEGIN(COMMENT); before_comment = CLASS_CODE_I; }
-<COMMENT>\*\/ {BEGIN(before_comment);}
-<COMMENT>. { ; /* comment, ignore */ }
+<COMMENT>\*\/ {
+ if(before_comment == C_CODE) add_to_cbuf(yytext);
+ BEGIN(before_comment);
+ }
+<COMMENT>. {
+ /* comment, ignore */
+ if(before_comment == C_CODE) add_to_cbuf(yytext);
+ }
+<COMMENT>\n {
+ /* comment, ignore */
+ if(before_comment == C_CODE) add_to_cbuf(yytext);
+ }
^\%h\{ {
BEGIN(C_CODE);
class_after_c = FALSE;
header_c = TRUE;
clear_cbuf();
+ ccode_line = line_no;
}
^\%\{ {
BEGIN(C_CODE);
class_after_c = FALSE;
header_c = FALSE;
clear_cbuf();
+ ccode_line = line_no;
+ if(look_for_includes==0)
+ look_for_includes=1;
}
<C_CODE>^\%\} {
BEGIN(INITIAL);
yylval.cbuf = cbuf;
cbuf = NULL;
+ if(look_for_includes==1)
+ look_for_includes=0;
if(header_c)
return HCODE;
else
<C_CODE>\'\\\{\' { add_to_cbuf(yytext); }
<C_CODE>\'\}\' { add_to_cbuf(yytext); }
<C_CODE>\'\\\}\' { add_to_cbuf(yytext); }
+<C_CODE>\'\"\' { add_to_cbuf(yytext); }
+<C_CODE>\'\\\"\' { add_to_cbuf(yytext); }
<C_CODE>\\. { add_to_cbuf(yytext); }
<C_CODE>\" {
BEGIN(C_CODE_STRING);
add_to_cbuf(yytext);
}
-<C_CODE_STRING>\\. {
- add_to_cbuf(yytext);
- }
+<C_CODE_STRING>\\. { add_to_cbuf(yytext); }
<C_CODE_STRING>\" {
BEGIN(C_CODE);
add_to_cbuf(yytext);
}
-<C_CODE_STRING>. {
- add_to_cbuf(yytext);
- }
+<C_CODE_STRING>. { add_to_cbuf(yytext); }
+<C_CODE_STRING>\n { add_to_cbuf(yytext); }
<C_CODE>\{ {
parenth_depth++;
<C_CODE>\n { add_to_cbuf(yytext); }
class {
+ look_for_includes = 2;
BEGIN(CLASS_CODE);
return CLASS;
}
+<CLASS_CODE,CLASS_CODE_I>class|this {
+ if(for_cpp) {
+ char *s;
+ s = g_strdup_printf("'%s' keyword should not "
+ "be used when generating "
+ "C++ code",yytext);
+ print_error(TRUE,s, line_no);
+ g_free(s);
+ }
+ REJECT;
+ }
+
<CLASS_CODE>from {return FROM;}
<CLASS_CODE_I>void {return VOID;}
<CLASS_CODE_I>float {return FLOAT;}
<CLASS_CODE_I>double {return DOUBLE;}
<CLASS_CODE_I>char {return CHAR;}
+<CLASS_CODE_I>const {return CONST;}
+
+<CLASS_CODE_I>\.\.\. {return THREEDOTS;}
<CLASS_CODE_I>public {yylval.line = line_no; return PUBLIC;}
<CLASS_CODE_I>private {yylval.line = line_no; return PRIVATE;}
<CLASS_CODE_I>argument {yylval.line = line_no; return ARGUMENT;}
<CLASS_CODE_I>virtual {yylval.line = line_no; return VIRTUAL;}
<CLASS_CODE_I>signal {yylval.line = line_no; return SIGNAL;}
-<CLASS_CODE_I>last {return LAST;}
-<CLASS_CODE_I>first {return FIRST;}
<CLASS_CODE_I>override {yylval.line = line_no; return OVERRIDE;}
-<CLASS_CODE_I>check {return CHECK;}
-<CLASS_CODE_I>null {return CNULL;}
-<CLASS_CODE_I>type {return TYPE;}
<CLASS_CODE_I>onerror {return ONERROR;}
<CLASS_CODE_I>0|[1-9][0-9]*|0x[0-9a-fA-F]+|0[0-7]+|[0-9]*\.[0-9]+|\.[0-9][0-9]* {
yylval.id = g_strdup(yytext);
BEGIN(C_CODE);
parenth_depth=1;
class_after_c = TRUE;
+ ccode_line = line_no;
+ yylval.line = line_no;
return '{';
}
<CLASS_CODE_I>\} {
return '}';
}
-<CLASS_CODE,CLASS_CODE_I,INITIAL>[\n\t ] ; /*ignore*/
+<CLASS_CODE,CLASS_CODE_I,INITIAL>[\t ] ; /*ignore*/
<*>. {
yylval.line = line_no;
return yytext[0];
}
+
+<*>[\n\r] ; /*ignore*/