diff --git a/Makefile b/Makefile index 02c84fe..82e64b3 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,9 @@ dist: $(LN) . $(PACKAGE)-$(VERSION) @$(TAR) $(PACKAGE)-$(VERSION).tar.gz \ $(PACKAGE)-$(VERSION)/src/c99.c \ + $(PACKAGE)-$(VERSION)/src/tokenset.c \ + $(PACKAGE)-$(VERSION)/src/c99.h \ + $(PACKAGE)-$(VERSION)/src/tokenset.h \ $(PACKAGE)-$(VERSION)/src/project.conf \ $(PACKAGE)-$(VERSION)/project.conf $(RM) $(PACKAGE)-$(VERSION) diff --git a/src/Makefile b/src/Makefile index 31c4587..fc28350 100644 --- a/src/Makefile +++ b/src/Makefile @@ -6,7 +6,7 @@ CC = cc CPPFLAGS= CFLAGSF = -W CFLAGS = -Wall -ansi -g -LDFLAGSF= -L $(PREFIX)/lib -Wl,-rpath $(PREFIX)/lib -l System +LDFLAGSF= -L $(PREFIX)/lib -Wl,-rpath $(PREFIX)/lib -l cpp RM = rm -f MKDIR = mkdir -p INSTALL = install @@ -14,15 +14,18 @@ INSTALL = install all: $(TARGETS) -c99_OBJS = c99.o +c99_OBJS = c99.o tokenset.o c99_CFLAGS = $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) c99: $(c99_OBJS) $(CC) -o c99 $(c99_OBJS) $(LDFLAGSF) $(LDFLAGS) -c99.o: c99.c +c99.o: c99.c c99.h tokenset.h $(CC) $(c99_CFLAGS) -c c99.c +tokenset.o: tokenset.c c99.h tokenset.h + $(CC) $(c99_CFLAGS) -c tokenset.c + clean: $(RM) $(c99_OBJS) diff --git a/src/c99.c b/src/c99.c index 37ed5ba..99eca2c 100644 --- a/src/c99.c +++ b/src/c99.c @@ -13,6 +13,8 @@ * You should have received a copy of the Creative Commons Attribution- * NonCommercial-ShareAlike 3.0 along with c99; if not, browse to * http://creativecommons.org/licenses/by-nc-sa/3.0/ */ +/* FIXME: + * - place main() in main.c? */ @@ -21,7 +23,8 @@ #include #include #include -#include +#include "tokenset.h" +#include "c99.h" #include "../config.h" @@ -44,11 +47,61 @@ typedef struct _Prefs #define PREFS_g 0x4 #define PREFS_s 0x8 +typedef struct _C99Operator +{ + C99Code code; + char const * string; +} C99Operator; + /* prototypes */ static int _c99(Prefs * prefs, int filec, char * filev[]); +/* variables */ +static C99Operator _operators[] = +{ + { C99_CODE_KEYWORD_AUTO, "auto" }, + { C99_CODE_KEYWORD_BREAK, "break" }, + { C99_CODE_KEYWORD_CASE, "case" }, + { C99_CODE_KEYWORD_CHAR, "char" }, + { C99_CODE_KEYWORD_CONST, "const" }, + { C99_CODE_KEYWORD_CONTINUE, "continue" }, + { C99_CODE_KEYWORD_DEFAULT, "default" }, + { C99_CODE_KEYWORD_DO, "do" }, + { C99_CODE_KEYWORD_DOUBLE, "double" }, + { C99_CODE_KEYWORD_ELSE, "else" }, + { C99_CODE_KEYWORD_ENUM, "enum" }, + { C99_CODE_KEYWORD_EXTERN, "extern" }, + { C99_CODE_KEYWORD_FLOAT, "float" }, + { C99_CODE_KEYWORD_FOR, "for" }, + { C99_CODE_KEYWORD_GOTO, "goto" }, + { C99_CODE_KEYWORD_IF, "if" }, + { C99_CODE_KEYWORD_INLINE, "inline" }, + { C99_CODE_KEYWORD_INT, "int" }, + { C99_CODE_KEYWORD_LONG, "long" }, + { C99_CODE_KEYWORD_REGISTER, "register" }, + { C99_CODE_KEYWORD_RESTRICT, "restrict" }, + { C99_CODE_KEYWORD_RETURN, "return" }, + { C99_CODE_KEYWORD_SHORT, "short" }, + { C99_CODE_KEYWORD_SIGNED, "signed" }, + { C99_CODE_KEYWORD_SIZEOF, "sizeof" }, + { C99_CODE_KEYWORD_STATIC, "static" }, + { C99_CODE_KEYWORD_STRUCT, "struct" }, + { C99_CODE_KEYWORD_SWITCH, "switch" }, + { C99_CODE_KEYWORD_TYPEDEF, "typedef" }, + { C99_CODE_KEYWORD_UNION, "union" }, + { C99_CODE_KEYWORD_UNSIGNED, "unsigned" }, + { C99_CODE_KEYWORD_VOID, "void" }, + { C99_CODE_KEYWORD_VOLATILE, "volatile" }, + { C99_CODE_KEYWORD_WHILE, "while" }, + { C99_CODE_KEYWORD__BOOL, "_Bool" }, + { C99_CODE_KEYWORD__COMPLEX, "_Complex" }, + { C99_CODE_KEYWORD__IMAGINARY, "_Imaginary" } +}; +static size_t _operators_cnt = sizeof(_operators) / sizeof(*_operators); + + /* functions */ /* c99 */ static int _c99_do(Prefs * prefs, FILE * outfp, char const * infile); @@ -187,6 +240,32 @@ static int _c99_do_o(Prefs * prefs, FILE * outfp, char const * infile, } +/* useful */ +/* c99_scan */ +int c99_scan(C99 * c99, Token ** token) +{ + int ret; + char const * string; + size_t i; + + if((ret = cpp_scan(c99, token)) != 0) + return ret; + if(token == NULL) + return 0; + if(token_get_code(*token) != C99_CODE_WORD) + return 0; + if((string = token_get_string(*token)) == NULL) + return 0; + for(i = 0; i < _operators_cnt; i++) + if(strcmp(_operators[i].string, string) == 0) + { + token_set_code(*token, _operators[i].code); + return 0; + } + return 0; +} + + /* usage */ static int _usage(void) { diff --git a/src/c99.h b/src/c99.h new file mode 100644 index 0000000..0b91b9b --- /dev/null +++ b/src/c99.h @@ -0,0 +1,145 @@ +/* $Id$ */ +/* Copyright (c) 2008 Pierre Pronchery */ +/* This file is part of DeforaOS Devel c99 */ +/* c99 is not free software; you can redistribute it and/or modify it under the + * terms of the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 + * Unported as published by the Creative Commons organization. + * + * c99 is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the Creative Commons Attribution-NonCommercial- + * ShareAlike 3.0 Unported license for more details. + * + * You should have received a copy of the Creative Commons Attribution- + * NonCommercial-ShareAlike 3.0 along with c99; if not, browse to + * http://creativecommons.org/licenses/by-nc-sa/3.0/ */ + + + +#ifndef C99_C99_H +# define C99_C99_H + +# include + + +/* C99 */ +/* protected */ +/* types */ +typedef Cpp C99; + +typedef enum _C99Code +{ + C99_CODE_NULL = CPP_CODE_NULL, + C99_CODE_COMMA = CPP_CODE_COMMA, + C99_CODE_DQUOTE = CPP_CODE_DQUOTE, + C99_CODE_META_DEFINE = CPP_CODE_META_DEFINE, + C99_CODE_META_ELIF = CPP_CODE_META_ELIF, + C99_CODE_META_ELSE = CPP_CODE_META_ELSE, + C99_CODE_META_ENDIF = CPP_CODE_META_ENDIF, + C99_CODE_META_ERROR = CPP_CODE_META_ERROR, + C99_CODE_META_IF = CPP_CODE_META_IF, + C99_CODE_META_IFDEF = CPP_CODE_META_IFDEF, + C99_CODE_META_IFNDEF = CPP_CODE_META_IFNDEF, + C99_CODE_META_INCLUDE = CPP_CODE_META_INCLUDE, + C99_CODE_META_LINE = CPP_CODE_META_LINE, + C99_CODE_META_PRAGMA = CPP_CODE_META_PRAGMA, + C99_CODE_META_UNDEF = CPP_CODE_META_UNDEF, + C99_CODE_META_WARNING = CPP_CODE_META_WARNING, + C99_CODE_OPERATOR_AEQUALS = CPP_CODE_OPERATOR_AEQUALS, + C99_CODE_OPERATOR_AMPERSAND = CPP_CODE_OPERATOR_AMPERSAND, + C99_CODE_OPERATOR_BAR = CPP_CODE_OPERATOR_BAR, + C99_CODE_OPERATOR_BEQUALS = CPP_CODE_OPERATOR_BEQUALS, + C99_CODE_OPERATOR_COLON = CPP_CODE_OPERATOR_COLON, + C99_CODE_OPERATOR_DAMPERSAND = CPP_CODE_OPERATOR_DAMPERSAND, + C99_CODE_OPERATOR_DBAR = CPP_CODE_OPERATOR_DBAR, + C99_CODE_OPERATOR_DEQUALS = CPP_CODE_OPERATOR_DEQUALS, + C99_CODE_OPERATOR_DGEQUALS = CPP_CODE_OPERATOR_DGEQUALS, + C99_CODE_OPERATOR_DGREATER = CPP_CODE_OPERATOR_DGREATER, + C99_CODE_OPERATOR_DHASH = CPP_CODE_OPERATOR_DHASH, + C99_CODE_OPERATOR_DIVIDE = CPP_CODE_OPERATOR_DIVIDE, + C99_CODE_OPERATOR_DLEQUALS = CPP_CODE_OPERATOR_DLEQUALS, + C99_CODE_OPERATOR_DLESS = CPP_CODE_OPERATOR_DLESS, + C99_CODE_OPERATOR_DMINUS = CPP_CODE_OPERATOR_DMINUS, + C99_CODE_OPERATOR_DOT = CPP_CODE_OPERATOR_DOT, + C99_CODE_OPERATOR_DOTDOTDOT = CPP_CODE_OPERATOR_DOTDOTDOT, + C99_CODE_OPERATOR_DPLUS = CPP_CODE_OPERATOR_DPLUS, + C99_CODE_OPERATOR_EQUALS = CPP_CODE_OPERATOR_EQUALS, + C99_CODE_OPERATOR_GEQUALS = CPP_CODE_OPERATOR_GEQUALS, + C99_CODE_OPERATOR_GREATER = CPP_CODE_OPERATOR_GREATER, + C99_CODE_OPERATOR_HASH = CPP_CODE_OPERATOR_HASH, + C99_CODE_OPERATOR_INVERSE = CPP_CODE_OPERATOR_INVERSE, + C99_CODE_OPERATOR_LBRACE = CPP_CODE_OPERATOR_LBRACE, + C99_CODE_OPERATOR_LBRACKET = CPP_CODE_OPERATOR_LBRACKET, + C99_CODE_OPERATOR_LEQUALS = CPP_CODE_OPERATOR_LEQUALS, + C99_CODE_OPERATOR_LESS = CPP_CODE_OPERATOR_LESS, + C99_CODE_OPERATOR_LPAREN = CPP_CODE_OPERATOR_LPAREN, + C99_CODE_OPERATOR_MASK = CPP_CODE_OPERATOR_MASK, + C99_CODE_OPERATOR_MEQUALS = CPP_CODE_OPERATOR_MEQUALS, + C99_CODE_OPERATOR_MGREATER = CPP_CODE_OPERATOR_MGREATER, + C99_CODE_OPERATOR_MINUS = CPP_CODE_OPERATOR_MINUS, + C99_CODE_OPERATOR_MODEQUALS = CPP_CODE_OPERATOR_MODEQUALS, + C99_CODE_OPERATOR_MODULO = CPP_CODE_OPERATOR_MODULO, + C99_CODE_OPERATOR_MORE = CPP_CODE_OPERATOR_MORE, + C99_CODE_OPERATOR_NEQUALS = CPP_CODE_OPERATOR_NEQUALS, + C99_CODE_OPERATOR_NOT = CPP_CODE_OPERATOR_NOT, + C99_CODE_OPERATOR_OR = CPP_CODE_OPERATOR_OR, + C99_CODE_OPERATOR_PEQUALS = CPP_CODE_OPERATOR_PEQUALS, + C99_CODE_OPERATOR_PLUS = CPP_CODE_OPERATOR_PLUS, + C99_CODE_OPERATOR_QUESTION = CPP_CODE_OPERATOR_QUESTION, + C99_CODE_OPERATOR_RBRACE = CPP_CODE_OPERATOR_RBRACE, + C99_CODE_OPERATOR_RBRACKET = CPP_CODE_OPERATOR_RBRACKET, + C99_CODE_OPERATOR_RPAREN = CPP_CODE_OPERATOR_RPAREN, + C99_CODE_OPERATOR_SEMICOLON = CPP_CODE_OPERATOR_SEMICOLON, + C99_CODE_OPERATOR_TEQUALS = CPP_CODE_OPERATOR_TEQUALS, + C99_CODE_OPERATOR_TILDE = CPP_CODE_OPERATOR_TILDE, + C99_CODE_OPERATOR_TIMES = CPP_CODE_OPERATOR_TIMES, + C99_CODE_OPERATOR_XEQUALS = CPP_CODE_OPERATOR_XEQUALS, + C99_CODE_OPERATOR_XOR = CPP_CODE_OPERATOR_XOR, + C99_CODE_SQUOTE = CPP_CODE_SQUOTE, + C99_CODE_WHITESPACE = CPP_CODE_WHITESPACE, + C99_CODE_WORD = CPP_CODE_WORD, + C99_CODE_KEYWORD_AUTO, + C99_CODE_KEYWORD_BREAK, + C99_CODE_KEYWORD_CASE, + C99_CODE_KEYWORD_CHAR, + C99_CODE_KEYWORD_CONST, + C99_CODE_KEYWORD_CONTINUE, + C99_CODE_KEYWORD_DEFAULT, + C99_CODE_KEYWORD_DO, + C99_CODE_KEYWORD_DOUBLE, + C99_CODE_KEYWORD_ELSE, + C99_CODE_KEYWORD_ENUM, + C99_CODE_KEYWORD_EXTERN, + C99_CODE_KEYWORD_FLOAT, + C99_CODE_KEYWORD_FOR, + C99_CODE_KEYWORD_GOTO, + C99_CODE_KEYWORD_IF, + C99_CODE_KEYWORD_INLINE, + C99_CODE_KEYWORD_INT, + C99_CODE_KEYWORD_LONG, + C99_CODE_KEYWORD_REGISTER, + C99_CODE_KEYWORD_RESTRICT, + C99_CODE_KEYWORD_RETURN, + C99_CODE_KEYWORD_SHORT, + C99_CODE_KEYWORD_SIGNED, + C99_CODE_KEYWORD_SIZEOF, + C99_CODE_KEYWORD_STATIC, + C99_CODE_KEYWORD_STRUCT, + C99_CODE_KEYWORD_SWITCH, + C99_CODE_KEYWORD_TYPEDEF, + C99_CODE_KEYWORD_UNION, + C99_CODE_KEYWORD_UNSIGNED, + C99_CODE_KEYWORD_VOID, + C99_CODE_KEYWORD_VOLATILE, + C99_CODE_KEYWORD_WHILE, + C99_CODE_KEYWORD__BOOL, + C99_CODE_KEYWORD__COMPLEX, + C99_CODE_KEYWORD__IMAGINARY +} C99Code; + + +/* functions */ +/* useful */ +int c99_scan(C99 * c99, Token ** token); + +#endif /* !C99_C99_H */ diff --git a/src/project.conf b/src/project.conf index c02b6af..32f6d24 100644 --- a/src/project.conf +++ b/src/project.conf @@ -1,8 +1,15 @@ targets=c99 cflags_force=-W cflags=-Wall -ansi -g -ldflags_force=-L $(PREFIX)/lib -Wl,-rpath $(PREFIX)/lib -l System +ldflags_force=-L $(PREFIX)/lib -Wl,-rpath $(PREFIX)/lib -l cpp +dist=c99.h,tokenset.h [c99] type=binary -sources=c99.c +sources=c99.c,tokenset.c + +[c99.c] +depends=c99.h,tokenset.h + +[tokenset.c] +depends=c99.h,tokenset.h diff --git a/src/tokenset.c b/src/tokenset.c new file mode 100644 index 0000000..0585da6 --- /dev/null +++ b/src/tokenset.c @@ -0,0 +1,139 @@ +/* $Id$ */ +/* Copyright (c) 2008 Pierre Pronchery */ +/* This file is part of DeforaOS Devel c99 */ +/* c99 is not free software; you can redistribute it and/or modify it under the + * terms of the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 + * Unported as published by the Creative Commons organization. + * + * c99 is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the Creative Commons Attribution-NonCommercial- + * ShareAlike 3.0 Unported license for more details. + * + * You should have received a copy of the Creative Commons Attribution- + * NonCommercial-ShareAlike 3.0 along with c99; if not, browse to + * http://creativecommons.org/licenses/by-nc-sa/3.0/ */ + + + +#include "c99.h" +#include "tokenset.h" + + +/* protected */ +/* variables */ +/* keyword */ +static TokenCode _c99set_keyword[] = +{ + C99_CODE_KEYWORD_AUTO, + C99_CODE_KEYWORD_BREAK, + C99_CODE_KEYWORD_CASE, + C99_CODE_KEYWORD_CHAR, + C99_CODE_KEYWORD_CONST, + C99_CODE_KEYWORD_CONTINUE, + C99_CODE_KEYWORD_DEFAULT, + C99_CODE_KEYWORD_DO, + C99_CODE_KEYWORD_DOUBLE, + C99_CODE_KEYWORD_ELSE, + C99_CODE_KEYWORD_ENUM, + C99_CODE_KEYWORD_EXTERN, + C99_CODE_KEYWORD_FLOAT, + C99_CODE_KEYWORD_FOR, + C99_CODE_KEYWORD_GOTO, + C99_CODE_KEYWORD_IF, + C99_CODE_KEYWORD_INLINE, + C99_CODE_KEYWORD_INT, + C99_CODE_KEYWORD_LONG, + C99_CODE_KEYWORD_REGISTER, + C99_CODE_KEYWORD_RESTRICT, + C99_CODE_KEYWORD_RETURN, + C99_CODE_KEYWORD_SHORT, + C99_CODE_KEYWORD_SIGNED, + C99_CODE_KEYWORD_SIZEOF, + C99_CODE_KEYWORD_STATIC, + C99_CODE_KEYWORD_STRUCT, + C99_CODE_KEYWORD_SWITCH, + C99_CODE_KEYWORD_TYPEDEF, + C99_CODE_KEYWORD_UNION, + C99_CODE_KEYWORD_UNSIGNED, + C99_CODE_KEYWORD_VOID, + C99_CODE_KEYWORD_VOLATILE, + C99_CODE_KEYWORD_WHILE, + C99_CODE_KEYWORD__BOOL, + C99_CODE_KEYWORD__COMPLEX, + C99_CODE_KEYWORD__IMAGINARY, + C99_CODE_NULL +}; + +TokenSet c99set_keyword = _c99set_keyword; + + +/* punctuator */ +static TokenCode _c99set_punctuator[] = +{ + C99_CODE_OPERATOR_LBRACKET, + C99_CODE_OPERATOR_RBRACKET, + C99_CODE_OPERATOR_LPAREN, + C99_CODE_OPERATOR_RPAREN, + C99_CODE_OPERATOR_LBRACE, + C99_CODE_OPERATOR_RBRACE, + C99_CODE_OPERATOR_DOT, + C99_CODE_OPERATOR_MGREATER, + C99_CODE_OPERATOR_DPLUS, + C99_CODE_OPERATOR_DMINUS, + C99_CODE_OPERATOR_AMPERSAND, + C99_CODE_OPERATOR_TIMES, + C99_CODE_OPERATOR_PLUS, + C99_CODE_OPERATOR_MINUS, + C99_CODE_OPERATOR_TILDE, + C99_CODE_OPERATOR_NOT, + C99_CODE_OPERATOR_DIVIDE, + C99_CODE_OPERATOR_MODULO, + C99_CODE_OPERATOR_DLESS, + C99_CODE_OPERATOR_DGREATER, + C99_CODE_OPERATOR_LESS, + C99_CODE_OPERATOR_GREATER, + C99_CODE_OPERATOR_LEQUALS, + C99_CODE_OPERATOR_GEQUALS, + C99_CODE_OPERATOR_DEQUALS, + C99_CODE_OPERATOR_NEQUALS, + C99_CODE_OPERATOR_XOR, + C99_CODE_OPERATOR_BAR, + C99_CODE_OPERATOR_DAMPERSAND, + C99_CODE_OPERATOR_DBAR, + C99_CODE_OPERATOR_QUESTION, + C99_CODE_OPERATOR_COLON, + C99_CODE_OPERATOR_SEMICOLON, + C99_CODE_OPERATOR_DOTDOTDOT, + C99_CODE_OPERATOR_EQUALS, + C99_CODE_OPERATOR_TEQUALS, + C99_CODE_OPERATOR_DEQUALS, /* FIXME "/=" ambiguity with "==" */ + C99_CODE_OPERATOR_MODEQUALS, + C99_CODE_OPERATOR_PEQUALS, + C99_CODE_OPERATOR_MEQUALS, + C99_CODE_OPERATOR_DLEQUALS, + C99_CODE_OPERATOR_DGEQUALS, + C99_CODE_OPERATOR_AEQUALS, + C99_CODE_OPERATOR_XEQUALS, + C99_CODE_OPERATOR_BEQUALS, + C99_CODE_COMMA, + C99_CODE_OPERATOR_HASH, + C99_CODE_OPERATOR_DHASH, + C99_CODE_NULL +}; + +TokenSet c99set_punctuator = _c99set_punctuator; + + +/* storage class specifier */ +static TokenCode _c99set_storage_class_specifier[] = +{ + C99_CODE_KEYWORD_TYPEDEF, + C99_CODE_KEYWORD_EXTERN, + C99_CODE_KEYWORD_STATIC, + C99_CODE_KEYWORD_AUTO, + C99_CODE_KEYWORD_REGISTER, + C99_CODE_NULL +}; + +TokenSet c99set_storage_class_specifier = _c99set_storage_class_specifier; diff --git a/src/tokenset.h b/src/tokenset.h new file mode 100644 index 0000000..8bc40fa --- /dev/null +++ b/src/tokenset.h @@ -0,0 +1,30 @@ +/* $Id$ */ +/* Copyright (c) 2008 Pierre Pronchery */ +/* This file is part of DeforaOS Devel c99 */ +/* c99 is not free software; you can redistribute it and/or modify it under the + * terms of the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 + * Unported as published by the Creative Commons organization. + * + * c99 is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the Creative Commons Attribution-NonCommercial- + * ShareAlike 3.0 Unported license for more details. + * + * You should have received a copy of the Creative Commons Attribution- + * NonCommercial-ShareAlike 3.0 along with c99; if not, browse to + * http://creativecommons.org/licenses/by-nc-sa/3.0/ */ + + + +#ifndef C99_TOKENSET_H +# define C99_TOKENSET_H + +# include + + +/* protected */ +extern TokenSet c99set_keyword; +extern TokenSet c99set_punctuator; +extern TokenSet c99set_storage_class_specifier; + +#endif /* !C99_TOKENSET_H */