summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l')
-rw-r--r--ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l253
1 files changed, 253 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l b/ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l
new file mode 100644
index 00000000000..d8e67d5ad50
--- /dev/null
+++ b/ACE/TAO/orbsvcs/orbsvcs/Trader/constraint.l
@@ -0,0 +1,253 @@
+%{
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// constraint.l
+//
+// = AUTHOR
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "orbsvcs/Trader/Constraint_Interpreter.h"
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Tokens.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static TAO_Literal_Constraint* extract_string(const char*);
+static CORBA::LongLong trader_strtoll(const char* str, unsigned int base);
+static CORBA::ULongLong trader_strtoull(const char* str, unsigned int base);
+
+#define TAO_YY_LEX_DEBUG
+
+#ifdef TAO_CONSTRAINT_DEBUG
+#define TAO_YY_LEX_DEBUG ACE_OS::fprintf(stderr, "%s\n", yytext)
+#endif /* TAO_CONSTRAINT_DEBUG */
+
+
+%}
+
+white_space [ \t]
+letter [a-zA-Z]
+digit [0-9]
+alpha_num ({letter}|{digit})
+integer [-+]?{digit}+
+float [-+]?({digit}*\.{digit}+)([eE][-+]?{digit}+)?
+string '(([^'\\]*)|([^'\\]*\\')|([^'\\]*\\\\))*'
+ident {letter}({alpha_num}|[_])*
+newline \n
+unknown [^ \t]
+
+%%
+
+min { TAO_YY_LEX_DEBUG; return TAO_MIN; }
+max { TAO_YY_LEX_DEBUG; return TAO_MAX; }
+first { TAO_YY_LEX_DEBUG; return TAO_FIRST; }
+random { TAO_YY_LEX_DEBUG; return TAO_RANDOM; }
+with { TAO_YY_LEX_DEBUG; return TAO_WITH; }
+exist { TAO_YY_LEX_DEBUG; return TAO_EXIST; }
+not { TAO_YY_LEX_DEBUG; return TAO_NOT; }
+and { TAO_YY_LEX_DEBUG; return TAO_AND; }
+or { TAO_YY_LEX_DEBUG; return TAO_OR; }
+in { TAO_YY_LEX_DEBUG; return TAO_IN; }
+"~" { TAO_YY_LEX_DEBUG; return TAO_TWIDDLE; }
+"+" { TAO_YY_LEX_DEBUG; return TAO_PLUS; }
+"-" { TAO_YY_LEX_DEBUG; return TAO_MINUS; }
+"*" { TAO_YY_LEX_DEBUG; return TAO_MULT; }
+"/" { TAO_YY_LEX_DEBUG; return TAO_DIV; }
+"<" { TAO_YY_LEX_DEBUG; return TAO_LT; }
+"<=" { TAO_YY_LEX_DEBUG; return TAO_LE; }
+">" { TAO_YY_LEX_DEBUG; return TAO_GT; }
+">=" { TAO_YY_LEX_DEBUG; return TAO_GE; }
+"==" { TAO_YY_LEX_DEBUG; return TAO_EQ; }
+"!=" { TAO_YY_LEX_DEBUG; return TAO_NE; }
+"(" { TAO_YY_LEX_DEBUG; return TAO_LPAREN; }
+")" { TAO_YY_LEX_DEBUG; return TAO_RPAREN; }
+TRUE {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(true);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+FALSE {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(false);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+{integer} {
+ if (yytext[0] == '-')
+ {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(
+ trader_strtoll(yytext, 0));
+ }
+ else
+ {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(
+ trader_strtoull(yytext, 0));
+ }
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+{float} {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(ACE_OS::strtod(yytext, 0));
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+{string} {
+ yylval.constraint_ = extract_string(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_STRING;
+ }
+{ident} {
+ yylval.constraint_ =
+ new TAO_Property_Constraint(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_IDENT;
+ }
+{white_space} {}
+{unknown} {
+ TAO_YY_LEX_DEBUG; return TAO_UNKNOWN;
+ }
+%%
+
+TAO_Literal_Constraint*
+extract_string(const char* total)
+{
+ int prev_slash = 0,
+ ctr = 0;
+ char str[BUFSIZ],
+ *tmp = (char*) total + 1;
+
+ while (*tmp != '\0')
+ {
+ if (*tmp == '\\')
+ {
+ if (prev_slash)
+ prev_slash = 0;
+ else
+ {
+ prev_slash = 1;
+ continue;
+ }
+ }
+ else if (*tmp == '\'')
+ prev_slash = 0;
+
+ str[ctr++] = *tmp;
+ tmp++;
+ }
+
+ str[ctr - 1] = '\0';
+ return new TAO_Literal_Constraint(str);
+}
+
+CORBA::ULongLong
+trader_strtoull(const char* s, unsigned int base)
+{
+ CORBA::ULongLong result = 0;
+ CORBA::ULongLong previous = 0;
+
+ // Check for a valid base
+ if (!(base == 0 || base == 8 || base == 10 || base == 16))
+ {
+ errno = EINVAL;
+ return result;
+ }
+
+ if (*s == '+')
+ {
+ s++;
+ }
+
+ if ((base == 0 || base == 16) &&
+ *s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))
+ {
+ s += 2;
+ base = 16;
+ }
+ else if ((base == 0 || base == 8) && *s == '0')
+ {
+ s++;
+ base = 8;
+ }
+ else
+ {
+ base = 10;
+ }
+
+ for (; *s; ++s)
+ {
+ if (base == 8 && *s <= '7' && *s >= '0')
+ {
+ result = (result * base) + (*s - '0');
+ }
+ else if (base > 8 && *s <= '9' && *s >= '0')
+ {
+ result = (result * base) + (*s - '0');
+ }
+ else if (base > 10 && *s <= 'f' && *s >= 'a')
+ {
+ result = (result * base) + (*s - 'a' + 10);
+ }
+ else if (base > 10 && *s <= 'F' && *s >= 'A')
+ {
+ result = (result * base) + (*s - 'A' + 10);
+ }
+ else
+ {
+ break;
+ }
+
+ // If the previous value is greater than result, then we have
+ // exceeded the size of a CORBA::ULongLong and the result
+ // will be ACE_UINT64_MAX. However, errno will be set to ERANGE
+ if (previous > result)
+ {
+ errno = ERANGE;
+ result = ACE_UINT64_MAX;
+ break;
+ }
+ previous = result;
+ }
+
+ return result;
+}
+
+CORBA::LongLong
+trader_strtoll(const char* s, unsigned int base)
+{
+ // Check for the negative sign
+ bool negative = false;
+ if (*s == '-')
+ {
+ negative = true;
+ s++;
+ }
+
+ // Convert the raw text into a CORBA::LongLong
+ CORBA::LongLong result = static_cast<CORBA::LongLong> (
+ trader_strtoull(s, base));
+
+ // If the result that comes back is negative, then the value exceeded
+ // the maximum for CORBA::LongLong
+ if (result < 0)
+ {
+ errno = ERANGE;
+ return (negative ? ACE_INT64_MIN : ACE_INT64_MAX);
+ }
+
+ return (negative ? -result : result);
+}
+
+int
+yywrap (void)
+{
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL