[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