$1_OBJ := $($($1_C)_OBJ)
$1_OUT := $($($1_C)_OUT)
$1_AROBJ := $($($1_C)_AROBJ)
-$1_SOURCES := $(subst ./,,$(shell find -name "*.$1"))
+$1_SOURCES := $(subst ./,,$(shell find -name "*.$1" -not -name ".*"))
$1_DBG := $($($1_C)_DBG)
$1_AR := $($($1_C)_AR)
)
/* Public */
int lexer_init(void);
int lexer(void);
+int lexer_lexfile(const char*);
void lexer_pushtok(int, YYSTYPE);
extern //lexer_lex.rl
int lexer_lex(const char*);
()
{start:
while (DE_LEN() > 0) //lex any directory entries in our stack
- if (lexer_lex(DE_POP()->d_name) == 0) //fail if it generates no tokens
+ if (lexer_lexfile(DE_POP()->d_name) == 0)
FAIL("Lexer failed to tokenize [%s]\n",(*DE_STACKP)->d_name);
if (TK_EMPTY) //if there are no tokens,
{ TK_INIT(); //initialize the token stack back to 0
TK_PUSH(tok, lval);
printf("Pushed Token %i | %i\n", TK_STACK[TK_LEN() - 1].tok_t, TK_STACK[TK_LEN() - 1].lval.val);
}
+
+/* Lexical analysis of a file
+ Strips a filename to its base name, then sends it to lexer_lex
+*/
+int lexer_lexfile
+#define MAX_FNAME 2048
+#define HIDDEN_WARNING "%s is hidden and will not be parsed!\n", filename
+( const char *filename
+)
+{ static char fname[MAX_FNAME];
+ char *last_period = NULL, *iter;
+
+ if (*filename == '.')
+ { fprintf (stderr, HIDDEN_WARNING);
+ return 0;
+ }
+ strncpy(fname,filename,MAX_FNAME);
+ last_period = NULL;
+ for (iter = fname; *iter; iter++)
+ if (*iter == '.')
+ last_period = iter;
+ if (last_period)
+ *last_period = '\0';
+ return lexer_lex(fname);
+}
if (DL_CD_LEN() > 0) //There are entities to process
{ if ((direntp = DL_CD_POP()) == NULL)//If the dirent is null, the library
goto libfail; //function in dirent has failed
- printf("Lexdir %s\n",direntp->d_name);
lexer_lex(direntp->d_name); //lex the directory name
if (DL_LEN() >= DL_STACKSIZE) //fail if maxdepth exceeded
{ fprintf(stderr, ERR_DEPTH);
#define $($)#$ //stringifier
#define MAXSTR 255
#define MAXERR "-%c allows at most " $(MAXSTR) " input characters\n", opt
+#define OPTS "d:o:h-"
#define USAGE "Usage %s [-d dir_root][-o output_file][-h]\n", argv[0]
#define USAGE_LONG \
"\tOptions:\n" \
{ int opt;
getopt:
- switch (opt = getopt(argc, argv, "d:o:h-"))
+ switch (opt = getopt(argc, argv, OPTS))
{ case DONE:
break;
case 'd' :
+++ /dev/null
-/*!@file
- \brief Mail router for OCKoreanMartialArts.com
- \details This mail routing system is intended to run as a daemon for fastcgi
- and stores usage information in a database before sending mail to the
- administrator
- \author Ken
- \date Sept 2016
- ----------------------------------------------------------------------------*/
-/* Standard */
-#include <stdlib.h> //atoi
-#include <string.h> //mem
-/* Third Party */
-#include <fcgi_stdio.h>
-/* Internal */
-#include <ock/ock.h>
-
-int get_body(void);
-
-int
-main
-()
-{ if (db_init())
- return -1;
-
- while(FCGI_Accept() >= 0)
- { printf("Content-type: application/json\r\n\r\n");
- printf("{ \"submission\" : ");
- if (!get_body())
- printf("\"fail\"");
- printf("\"pass\"");
- printf(" }");
- }
- return 0;
-}
-
-int
-get_body
-()
-{ char *lencp;
- int len, i;
-
- if ((lencp = getenv("CONTENT_LENGTH")) == NULL
- || (len = atoi(lencp)) < 1)
- return -1;
- for (i = 0; i < len; i++)
- putchar(getchar());
-
- return 0;
-}
-
+++ /dev/null
--lfcgi -lmysqlclient
--- /dev/null
+/*!@file
+ \brief APC test driver
+ \details This driver does what APC does, but in staggered stages with
+ additional debugging information
+ \author Jordan Lavatai
+ \date Aug 2016
+ ----------------------------------------------------------------------------*/
+/* Standard */
+#include <stdio.h> //print
+#include <errno.h> //errors
+#include <string.h> //strnlen
+/* Posix */
+#include <stdlib.h> //exit
+#include <unistd.h> //getopt
+/* Internal */
+#include <apc/parser.tab.h> //bison
+#include <apc/ir.h> //ir
+
+/* Import apc.c but redefine its primary symbols for jumping */
+#define main apc_main
+#define yyparse testapc_yyparse
+#include <bin/tools/apc.c>
+#undef yyparse
+#undef main
+
+int main(int, char*[]);
+int testapc_yyparse(void);
+
+extern //bison
+int yyparse(void);
+extern //lexer.c
+int lexer_init(void);
+extern //apc.c
+const char* cargs['Z'];
+
+extern //apc/parser.tab.c
+YYSTYPE yylval;
+extern //lexer.c
+int lexer(void);
+
+/* Ansi Term Colors */
+#define RED "\x1b[31m"
+#define GREEN "\x1b[32m"
+#define YELLOW "\x1b[33m"
+#define BLUE "\x1b[34m"
+#define MAGENTA "\x1b[35m"
+#define CYAN "\x1b[36m"
+#define CLRC "\x1b[0m" //clear current color
+
+/* Main entry from terminal
+ parses debugging options for testing apc, and calls apc_main
+*/
+int main
+( int argc,
+ char* argv[]
+)
+{ apc_main(argc, argv);
+ printf(GREEN "PASS\n");
+ exit(EXIT_SUCCESS);
+}
+
+#define MAX_TOK 1024
+char tok_lval[MAX_TOK];
+
+/* yyparse intercept */
+int testapc_yyparse
+()
+{ int i, tok;
+ char* tok_pattern = "T[%i]L[%i]";
+ char* lval_type = tok_pattern + 8; //location of i
+ tok_lval[NUM] = 'i';
+ tok_lval[STR] = 's';
+ tok_lval[SS] = 'i';
+ tok_lval[NAME] = 's';
+ tok_lval[REF] = 'x';
+ tok_lval[SSD] = 'i';
+ tok_lval[FPTR] = 'x';
+ //lex 10 tokens
+ printf(YELLOW);
+ for (i = 0; i < 10; i++)
+ { if ((tok = lexer()) != 0)
+ { *lval_type = tok_lval[tok] ? tok_lval[tok] : 'i';
+ printf(tok_pattern, tok, yylval.val);
+ }
+ else
+ { printf(";");
+ break;
+ }
+ }
+ printf("\n" CLRC);
+}
+++ /dev/null
-/*!@file
- \brief Mail router for OCKoreanMartialArts.com
- \details This mail routing system is intended to run as a daemon for fastcgi
- and stores usage information in a database before sending mail to the
- administrator
- \author Ken
- \date Sept 2016
- ----------------------------------------------------------------------------*/
-/* Standard */
-#include <stdlib.h>
-#include <string.h> //mem
-/* Third Party */
-#include <curl/curl.h>
-/* Internal */
-#include <ock/ock.h>
-
-int send_mail(void);
-
-int
-send_mail
-()
-{ return 0;
-}
+++ /dev/null
-/*!@file
- \brief Database storage for OCK's promo handler
- \details
- \author Ken
- \date Sept 2016
- ----------------------------------------------------------------------------*/
-/* Standard */
-#include <stdio.h> //print
-#include <string.h> //mem
-/* Third Party */
-#include <mysql/mysql.h>
-/* Internal */
-#include <ock/ock.h>
-
-int db_init(void);
-int db_insert(char*,char*,char*,char*);
-
-MYSQL *mysql;
-
-int
-db_init
-()
-#define HOST "localhost"
-#define USER "ock"
-#define PASS "#0CK0r34!"
-#define DATABASE "ock_db"
-#define PORT 3306
-#define SOCKET NULL
-#define FLAGS 0
-#define DATTABLE "promo_submissions"
-#define DTABFMT \
- "id not null auto_increment," \
- "firstname varchar (32) not null," \
- "lastname varchar (32) not null," \
- "email varchar (64) not null," \
- "phone varchar (16) not null," \
- "primary key (id)"
-{ mysql = mysql_init(NULL);
- if ((mysql = mysql_real_connect(mysql, HOST, USER, PASS, DATABASE, PORT, SOCKET, FLAGS)) == NULL)
- { fprintf(stderr,"Failed to establish connection to db.\n");
- return -1;
- }
- if (mysql_query(mysql, "SHOW TABLES LIKE '" DATTABLE "';"))
- { fprintf(stderr,"Initial query failed\n");
- return -1;
- }
- if (mysql_num_rows(mysql_use_result(mysql)) < 1)
- if (mysql_query(mysql, "create table " DATTABLE " (" DTABFMT ");"))
- { fprintf(stderr,"Failed to create table.\n");
- return -1;
- }
- return 0;
-}
-
-int
-db_insert
-( char *fname,
- char *lname,
- char *email,
- char *phone
-)
-#define INSERT_FMT \
- "INSERT INTO " DATTABLE \
- " VALUES ('%s','%s','%s','%s')" \
- , fname, lname, email, phone
-#define INSERT_ERR "SQL Insertion Failed for %s %s - %s %s\n" \
- , fname, lname, email, phone
-{ char sqlinsert[256];
- sprintf(sqlinsert, INSERT_FMT);
- if (mysql_query(mysql, sqlinsert))
- { fprintf(stderr, INSERT_ERR);
- return -1;
- }
- return 0;
-}
+++ /dev/null
-#ifndef _OCK_H
-#define _OCK_H
-
-int db_init(void);
-int db_insert(char*,char*,char*,char*);
-
-#endif //_OCK_H