[Kst] branches/work/kst/portto4/kst/src/libkstmath
Barth Netterfield
netterfield at astro.utoronto.ca
Sun Jan 16 00:07:04 CET 2011
SVN commit 1214694 by netterfield:
-Update escan.cpp using flex 3.5. This contains optimizations for ia64.
I think I ported all of Peters windows fixes, but I haven't tested that.
-Fix a memory leak in equation parsing.
M +5 -0 equation.cpp
M +129 -65 escan.cpp
--- branches/work/kst/portto4/kst/src/libkstmath/equation.cpp #1214693:1214694
@@ -39,6 +39,7 @@
/*extern "C"*/ int yyparse(Kst::ObjectStore *store);
extern void *ParsedEquation;
/*extern "C"*/ struct yy_buffer_state *yy_scan_string(const char*);
+int yylex_destroy (void );
namespace Kst {
@@ -146,6 +147,7 @@
return (_equation);
}
+ yylex_destroy();
yy_scan_string(_equation.toLatin1());
ParsedEquation = 0L;
int rc = yyparse(store());
@@ -170,6 +172,7 @@
// the optimizer
if (!_equation.isEmpty()) {
QMutexLocker ml(&Equations::mutex());
+ yylex_destroy();
yy_scan_string(_equation.toLatin1());
ParsedEquation = 0L;
int rc = yyparse(store());
@@ -209,6 +212,7 @@
_pe = 0L;
if (!_equation.isEmpty()) {
Equations::mutex().lock();
+ yylex_destroy();
yy_scan_string(_equation.toLatin1());
int rc = yyparse(store());
_pe = static_cast<Equations::Node*>(ParsedEquation);
@@ -447,6 +451,7 @@
}
QMutexLocker ml(&Equations::mutex());
+ yylex_destroy();
yy_scan_string(_equation.toLatin1());
int rc = yyparse(store());
_pe = static_cast<Equations::Node*>(ParsedEquation);
--- branches/work/kst/portto4/kst/src/libkstmath/escan.cpp #1214693:1214694
@@ -1,11 +1,8 @@
#include "kstmath_export.h"
-
#ifdef Q_CC_MSVC
#define strdup _strdup
#endif
-
-#line 3 "lex.yy.c"
-
+#line 4 "escan.cpp"
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
@@ -13,7 +10,7 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 33
+#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@@ -35,7 +32,7 @@
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-#if __STDC_VERSION__ >= 199901L
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
@@ -58,7 +55,6 @@
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -89,6 +85,8 @@
#define UINT32_MAX (4294967295U)
#endif
+#endif /* ! C99 */
+
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
@@ -98,11 +96,12 @@
#else /* ! __cplusplus */
-#if __STDC__
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
#define YY_USE_CONST
-#endif /* __STDC__ */
+#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
@@ -144,7 +143,15 @@
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
#endif
/* The state buf must be large enough to hold one state per character in the main buffer.
@@ -180,16 +187,11 @@
} \
while ( 0 )
-#define unput(c) yyunput( c, (yytext_ptr) )
+//#define unput(c) yyunput( c, (yytext_ptr) )
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
+typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -340,7 +342,7 @@
/* Begin user sect3 */
-#define yywrap() 1
+#define yywrap(n) 1
#define YY_SKIP_YYWRAP
typedef unsigned char YY_CHAR;
@@ -350,6 +352,9 @@
typedef int yy_state_type;
extern int yylineno;
+
+int yylineno = 1;
+
extern char *yytext;
#define yytext_ptr yytext
@@ -483,9 +488,9 @@
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
-#line 1 "../../../src/libkstmath/escan.l"
+#line 1 "escan.l"
-#line 4 "../../../src/libkstmath/escan.l"
+#line 4 "escan.l"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -498,7 +503,7 @@
//void yyerror(Kst::ObjectStore *store, const char *s);
#define YY_DECL int yylex(Kst::ObjectStore *store)
-#line 497 "lex.yy.c"
+#line 506 "escan.cpp"
#define INITIAL 0
#define DATA 1
@@ -519,6 +524,35 @@
static int yy_init_globals (void );
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy (void );
+
+int yyget_debug (void );
+
+void yyset_debug (int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra (void );
+
+void yyset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in (void );
+
+void yyset_in (FILE * in_str );
+
+FILE *yyget_out (void );
+
+void yyset_out (FILE * out_str );
+
+int yyget_leng (void );
+
+char *yyget_text (void );
+
+int yyget_lineno (void );
+
+void yyset_lineno (int line_number );
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
@@ -553,7 +587,12 @@
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
#endif
/* Copy whatever the last rule matched to the standard output. */
@@ -561,7 +600,7 @@
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
@@ -654,10 +693,10 @@
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 21 "../../../src/libkstmath/escan.l"
+#line 21 "escan.l"
-#line 654 "lex.yy.c"
+#line 697 "escan.cpp"
if ( !(yy_init) )
{
@@ -742,7 +781,7 @@
case 1:
YY_RULE_SETUP
-#line 23 "../../../src/libkstmath/escan.l"
+#line 23 "escan.l"
{
yylval.number = atof(yytext);
/*printf("Found a number %.15f\n", yylval.number);*/
@@ -751,7 +790,7 @@
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 30 "../../../src/libkstmath/escan.l"
+#line 30 "escan.l"
{
yylval.data = strdup(yytext);
/*printf("Found an ID [%s]\n", yylval.data);*/
@@ -760,7 +799,7 @@
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 36 "../../../src/libkstmath/escan.l"
+#line 36 "escan.l"
{
switch (*yytext) {
case '[':
@@ -792,7 +831,7 @@
}
YY_BREAK
case YY_STATE_EOF(DATA):
-#line 66 "../../../src/libkstmath/escan.l"
+#line 66 "escan.l"
{
yyerror(store, "Invalid data reference.");
yy_flush_buffer(YY_CURRENT_BUFFER);
@@ -802,7 +841,7 @@
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 73 "../../../src/libkstmath/escan.l"
+#line 73 "escan.l"
{
bracketCount = 1;
dataSpecPtr = dataSpec;
@@ -812,7 +851,7 @@
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 80 "../../../src/libkstmath/escan.l"
+#line 80 "escan.l"
{
yyerror(store, "Unmatched ']'.");
yy_flush_buffer(YY_CURRENT_BUFFER);
@@ -821,117 +860,117 @@
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 86 "../../../src/libkstmath/escan.l"
+#line 86 "escan.l"
return T_NOT;
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 88 "../../../src/libkstmath/escan.l"
+#line 88 "escan.l"
return T_AND;
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 90 "../../../src/libkstmath/escan.l"
+#line 90 "escan.l"
return T_OR;
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 92 "../../../src/libkstmath/escan.l"
+#line 92 "escan.l"
return T_LAND;
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 94 "../../../src/libkstmath/escan.l"
+#line 94 "escan.l"
return T_LOR;
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 96 "../../../src/libkstmath/escan.l"
+#line 96 "escan.l"
return T_LT;
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 98 "../../../src/libkstmath/escan.l"
+#line 98 "escan.l"
return T_LE;
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 100 "../../../src/libkstmath/escan.l"
+#line 100 "escan.l"
return T_GT;
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 102 "../../../src/libkstmath/escan.l"
+#line 102 "escan.l"
return T_GE;
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 104 "../../../src/libkstmath/escan.l"
+#line 104 "escan.l"
return T_EQ;
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 106 "../../../src/libkstmath/escan.l"
+#line 106 "escan.l"
return T_EQ;
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 108 "../../../src/libkstmath/escan.l"
+#line 108 "escan.l"
return T_NE;
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 110 "../../../src/libkstmath/escan.l"
+#line 110 "escan.l"
return T_ADD;
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 112 "../../../src/libkstmath/escan.l"
+#line 112 "escan.l"
return T_SUBTRACT;
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 114 "../../../src/libkstmath/escan.l"
+#line 114 "escan.l"
return T_MULTIPLY;
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 116 "../../../src/libkstmath/escan.l"
+#line 116 "escan.l"
return T_DIVIDE;
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 118 "../../../src/libkstmath/escan.l"
+#line 118 "escan.l"
return T_MOD;
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 120 "../../../src/libkstmath/escan.l"
+#line 120 "escan.l"
return T_EXP;
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 122 "../../../src/libkstmath/escan.l"
+#line 122 "escan.l"
return T_OPENPAR;
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 124 "../../../src/libkstmath/escan.l"
+#line 124 "escan.l"
return T_CLOSEPAR;
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 126 "../../../src/libkstmath/escan.l"
+#line 126 "escan.l"
return T_COMMA;
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 128 "../../../src/libkstmath/escan.l"
+#line 128 "escan.l"
{}
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 130 "../../../src/libkstmath/escan.l"
+#line 130 "escan.l"
{
/*printf("Found char '%c'\n", yytext[0]);*/
yylval.character = yytext[0];
@@ -939,7 +978,7 @@
}
YY_BREAK
case YY_STATE_EOF(INITIAL):
-#line 137 "../../../src/libkstmath/escan.l"
+#line 137 "escan.l"
{
/*printf("yyterminate\n");*/
yyterminate();
@@ -947,10 +986,10 @@
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 142 "../../../src/libkstmath/escan.l"
+#line 142 "escan.l"
ECHO;
YY_BREAK
-#line 947 "lex.yy.c"
+#line 990 "escan.cpp"
case YY_END_OF_BUFFER:
{
@@ -1203,6 +1242,14 @@
else
ret_val = EOB_ACT_CONTINUE_SCAN;
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
(yy_n_chars) += number_to_move;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
@@ -1268,10 +1315,7 @@
return yy_is_jam ? 0 : yy_current_state;
}
-
-
#if 0
-// Not used
static void yyunput (int c, register char * yy_bp )
{
register char *yy_cp;
@@ -1309,7 +1353,6 @@
(yy_c_buf_p) = yy_cp;
}
#endif
-
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput (void)
@@ -1522,13 +1565,11 @@
b->yy_bs_lineno = 1;
b->yy_bs_column = 0;
}
-
#ifdef Q_WS_WIN32
b->yy_is_interactive = false;
#else
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
#endif
-
errno = oerrno;
}
@@ -1628,6 +1669,8 @@
(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
(num_to_alloc * sizeof(struct yy_buffer_state*)
);
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
@@ -1646,6 +1689,8 @@
((yy_buffer_stack),
num_to_alloc * sizeof(struct yy_buffer_state*)
);
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
/* zero only the new slots.*/
memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -1690,7 +1735,7 @@
/** Setup the input buffer state to scan a string. The next call to yylex() will
* scan from a @e copy of @a str.
- * @param str a NUL-terminated string to scan
+ * @param yystr a NUL-terminated string to scan
*
* @return the newly allocated buffer state object.
* @note If you want to scan bytes that may contain NUL values, then use
@@ -1704,8 +1749,8 @@
/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
* scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
*
* @return the newly allocated buffer state object.
*/
@@ -1768,6 +1813,15 @@
/* Accessor methods (get/set functions) to struct members. */
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
/** Get the input stream.
*
*/
@@ -1801,6 +1855,16 @@
return yytext;
}
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void yyset_lineno (int line_number )
+{
+
+ yylineno = line_number;
+}
+
/** Set the input stream. This does not discard the current
* input buffer.
* @param in_str A readable stream.
@@ -1925,7 +1989,7 @@
#define YYTABLES_NAME "yytables"
-#line 142 "../../../src/libkstmath/escan.l"
+#line 142 "escan.l"
More information about the Kst
mailing list