This repository has been archived on 2025-02-12. You can view files and clone it, but cannot push or open issues or pull requests.
NeoStats/sqlsrv/token.l

219 lines
5.1 KiB
Text
Executable file

/***************************************************************
* Run Time Access
* Copyright (C) 2003 Robert W Smith (bsmith@linuxtoys.org)
*
* This program is distributed under the terms of the GNU LGPL.
* See the file COPYING file.
**************************************************************/
/***************************************************************
* token.l -- Lex tokenizer for SQL commands.
**************************************************************/
%option noyywrap
%option never-interactive
%{
#define __USE_GNU
#include <string.h>
#include "do_sql.h"
#include "parse.tab.h"
#include "config.h"
#ifndef HAVE_STRNDUP
#include "support.h"
#endif
void dosql_init();
extern int yylval;
extern int yydebug;
extern struct Sql_Cmd cmd;
extern char *parsestr[];
#define YY_NO_UNPUT
%}
%%
[Aa][Nn][Dd] { return(AND); }
[Ff][Rr][Oo][Mm] { return(FROM); }
[Ll][Ii][Mm][Ii][Tt] { return(LIMIT); }
[Oo][Ff][Ff][Ss][Ee][Tt] { return(OFFSET); }
[Ss][Ee][Ll][Ee][Cc][Tt] { return(SELECT); }
[Ss][Ee][Tt] { return(SET); }
[Uu][Pp][Dd][Aa][Tt][Ee] { return(UPDATE); }
[Ww][Hh][Ee][Rr][Ee] { return(WHERE); }
[Bb][Ee][Gg][Ii][Nn] { return(SQLBEGIN); }
[Cc][Oo][Mm][Mm][Ii][Tt] { return(SQLCOMMIT); }
\"[A-Za-z][_A-Za-z0-9 \t]*\" |
\'[A-Za-z][_A-Za-z0-9 \t]*\' {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strndup(&yytext[1], yyleng-2);
break;
}
}
yylval = i;
return(NAME);
}
\* |
[A-Za-z][_A-Za-z0-9]* {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strdup(yytext);
break;
}
}
yylval = i;
return(NAME);
}
\"-?[0-9]+\" |
\'-?[0-9]+\' {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strndup(&yytext[1], yyleng-2);
break;
}
}
yylval = i;
return(INTEGER);
}
-?[0-9]+ {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strdup(yytext);
break;
}
}
yylval = i;
return(INTEGER);
}
\"-?[0-9]+\.[0-9]*\" |
\'-?[0-9]+\.[0-9]*\' {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strndup(&yytext[1], yyleng-2);
break;
}
}
yylval = i;
return(REALNUM);
}
-?[0-9]+\.[0-9]* {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strdup(yytext);
break;
}
}
yylval = i;
return(REALNUM);
}
= { return(EQ); }
\!= { return(NE); }
\> { return(GT); }
\< { return(LT); }
\>= { return(GE); }
\<= { return(LE); }
\, { return((int)','); }
\( { return((int)'('); }
\) { return((int)')'); }
\; { return((int)';'); }
\. { return((int)'.'); }
\"[A-Za-z0-9 \t!@#$%^&*()_+-={}|;:<>?~`\[\]'\\]*\" |
\'[A-Za-z0-9 \t!@#$%^&*()_+-={}|;:<>?~`\[\]"\\]*\' {
int i;
for (i=0; i<MXPARSESTR; i++) {
if (parsestr[i] == (char *) NULL) {
parsestr[i] = strndup(&yytext[1], yyleng-2);
break;
}
}
yylval = i;
return(STRING);
}
[ \t\n]+ { }
%%
void SQL_string(char *s, char *out, int *nout)
{
extern int yyparse();
YY_BUFFER_STATE x;
dosql_init();
cmd.out = out;
cmd.nout = nout;
cmd.sqlcmd = s;
/* We need to store the start addr of the buffer in case we
* we need to send an error message after we've started
* sending a reply. */
cmd.errout = out;
cmd.nerrout = *nout;
cmd.nlineout = 0;
x = yy_scan_string(s);
while(yyparse() == 0) {
/* At this point we have parsed the command. */
/* If no errors were detected, we can continue processing */
if (!cmd.err) {
/* everything is set. do the command */
do_sql(&out[cmd.nerrout - *nout], nout);
}
else {
yy_delete_buffer(x);
return;
}
dosql_init(); /* free memory and re-init the cmd structure */
}
/* We are done processing the command and have assembled response */
/* Tell the other end that we are ready for a new command. */
out[cmd.nerrout - *nout] = 'Z'; /* Ready */
(*nout)--;
yy_delete_buffer(x);
return;
}
#ifdef xxxx
#ifdef DEBUG
printf("N-out = %d\n", *cmd.nout);
printf("Scanning ---%s---\n", s);
#endif
#ifdef DEBUG
printf("Limit = %d\n", cmd.limit);
printf("Offset = %d\n", cmd.offset);
#endif
#ifdef DEBUG
printf("Command = %d\n", cmd.command);
for (i=0; i<cmd.ncols; i++)
printf(" %s %s\n",cmd.cols[i],cmd.updvals[i]);
printf("Table = %s\n", cmd.tbl);
for (i=0; i<cmd.nwhrcols; i++)
printf(" %s %d %s\n",cmd.whrcols[i],
cmd.whrrel[i], cmd.whrvals[i]);
printf("Limit = %d\n", cmd.limit);
printf("Offset = %d\n", cmd.offset);
printf("N-out = %d\n", *cmd.nout);
printf("Error = %d\n", cmd.err);
#endif
#endif