monitor.c.preserve
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:36k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /* A lexical scanner generated by flex */
  2. /* scanner skeleton version:
  3.  * $Header: /home/horse/u0/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp Locker: vern $
  4.  */
  5. #define FLEX_SCANNER
  6. #include <stdio.h>
  7. /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
  8. #ifdef c_plusplus
  9. #ifndef __cplusplus
  10. #define __cplusplus
  11. #endif
  12. #endif
  13. #ifdef __cplusplus
  14. #include <stdlib.h>
  15. #include <osfcn.h>
  16. /* use prototypes in function declarations */
  17. #define YY_USE_PROTOS
  18. /* the "const" storage-class-modifier is valid */
  19. #define YY_USE_CONST
  20. #else /* ! __cplusplus */
  21. #ifdef __STDC__
  22. #ifdef __GNUC__
  23. #include <stddef.h>
  24. void *malloc( size_t );
  25. void free( void* );
  26. #else
  27. #include <stdlib.h>
  28. #endif /* __GNUC__ */
  29. #define YY_USE_PROTOS
  30. #define YY_USE_CONST
  31. #endif /* __STDC__ */
  32. #endif /* ! __cplusplus */
  33. #ifdef __TURBOC__
  34. #define YY_USE_CONST
  35. #endif
  36. #ifndef YY_USE_CONST
  37. #define const
  38. #endif
  39. #ifdef YY_USE_PROTOS
  40. #define YY_PROTO(proto) proto
  41. #else
  42. #define YY_PROTO(proto) ()
  43. /* we can't get here if it's an ANSI C compiler, or a C++ compiler,
  44.  * so it's got to be a K&R compiler, and therefore there's no standard
  45.  * place from which to include these definitions
  46.  */
  47. char *malloc();
  48. int free();
  49. int read();
  50. #endif
  51. /* amount of stuff to slurp up with each read */
  52. #ifndef YY_READ_BUF_SIZE
  53. #define YY_READ_BUF_SIZE 8192
  54. #endif
  55. /* returned upon end-of-file */
  56. #define YY_END_TOK 0
  57. /* copy whatever the last rule matched to the standard output */
  58. /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */
  59. /* this used to be an fputs(), but since the string might contain NUL's,
  60.  * we now use fwrite()
  61.  */
  62. #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout )
  63. /* gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
  64.  * is returned in "result".
  65.  */
  66. #define YY_INPUT(buf,result,max_size) 
  67. if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) 
  68.     YY_FATAL_ERROR( "read() in flex scanner failed" );
  69. #define YY_NULL 0
  70. /* no semi-colon after return; correct usage is to write "yyterminate();" -
  71.  * we don't want an extra ';' after the "return" because that will cause
  72.  * some compilers to complain about unreachable statements.
  73.  */
  74. #define yyterminate() return ( YY_NULL )
  75. /* report a fatal error */
  76. /* The funky do-while is used to turn this macro definition into
  77.  * a single C statement (which needs a semi-colon terminator).
  78.  * This avoids problems with code like:
  79.  *
  80.  *  if ( something_happens )
  81.  * YY_FATAL_ERROR( "oops, the something happened" );
  82.  * else
  83.  * everything_okay();
  84.  *
  85.  * Prior to using the do-while the compiler would get upset at the
  86.  * "else" because it interpreted the "if" statement as being all
  87.  * done when it reached the ';' after the YY_FATAL_ERROR() call.
  88.  */
  89. #define YY_FATAL_ERROR(msg) 
  90. do 
  91. (void) fputs( msg, stderr ); 
  92. (void) putc( 'n', stderr ); 
  93. exit( 1 ); 
  94. while ( 0 )
  95. /* default yywrap function - always treat EOF as an EOF */
  96. #define yywrap() 1
  97. /* enter a start condition.  This macro really ought to take a parameter,
  98.  * but we do it the disgusting crufty way forced on us by the ()-less
  99.  * definition of BEGIN
  100.  */
  101. #define BEGIN yy_start = 1 + 2 *
  102. /* action number for EOF rule of a given start state */
  103. #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  104. /* special action meaning "start processing a new file" */
  105. #define YY_NEW_FILE 
  106. do 
  107. yy_init_buffer( yy_current_buffer, yyin ); 
  108. yy_load_buffer_state(); 
  109. while ( 0 )
  110. /* default declaration of generated scanner - a define so the user can
  111.  * easily add parameters
  112.  */
  113. #define YY_DECL int yylex YY_PROTO(( void )) 
  114. /* code executed at the end of each rule */
  115. #define YY_BREAK break;
  116. #define YY_END_OF_BUFFER_CHAR 0
  117. #ifndef YY_BUF_SIZE
  118. #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */
  119. #endif
  120. typedef struct yy_buffer_state *YY_BUFFER_STATE;
  121. #define FLEX_DEBUG
  122. #define YY_CHAR unsigned char
  123. # line 1 "monitor.l"
  124. #define INITIAL 0
  125. # line 2 "monitor.l"
  126. /*
  127.  *  monitor.l - DB line monitor
  128.  *            
  129.  *  $Id: monitor.l,v 1.248 1997/04/03 14:36:10 kml Exp $
  130.  *
  131.  *  This file is a part of GNU SQL Server
  132.  *
  133.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  134.  *  Developed at the Institute of System Programming, Russia
  135.  *  This file is written by Michael Kimelman.
  136.  * 
  137.  *  This program is free software; you can redistribute it and/or modify
  138.  *  it under the terms of the GNU General Public License as published by
  139.  *  the Free Software Foundation; either version 2 of the License, or
  140.  *  (at your option) any later version.
  141.  *
  142.  *  This program is distributed in the hope that it will be useful,
  143.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  144.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  145.  *  GNU General Public License for more details.
  146.  *
  147.  *  You should have received a copy of the GNU General Public License
  148.  *  along with this program; if not, write to the Free Software
  149.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  150.  *
  151.  *  Contact:  gss@ispras.ru
  152.  *
  153.  */
  154.   
  155. #include "xmem.h"
  156. #include "sql_decl.h"
  157. #include "sql.h"
  158. #include "dyn_funcs.h"
  159. #include <assert.h>
  160.   
  161. #define SWITCH_COND(cond)  { save_condition();BEGIN(cond);}
  162. #define REST_COND            rest_condition();
  163. #define SCANNER_NAME      yylex_extractor
  164. #ifdef YY_DECL
  165. #  undef YY_DECL
  166. #endif
  167. #define YY_DECL           i4_t SCANNER_NAME(void)
  168. YY_DECL;
  169. #define SQL_PROC(code)  if(code){return code;}
  170. static str_buf c_scanner_buffer={0,0,NULL};
  171. #define sql_str(s,l)  buffer_string(&c_scanner_buffer,s,l)
  172. static void  save_condition(YY_PROTO(void));
  173. static void  rest_condition(YY_PROTO(void));
  174. static char *statement_scanner_buffer=NULL;
  175. #define APPEND_BUFFER { sql_str(yytext,yyleng);} 
  176. #define POP_BUFFER pop_cl_buffer()
  177. #define NEW_LINE        {
  178.   if (smth_done) fprintf(stderr,"(:%d)>",++line_num);
  179.   else           fprintf(stderr,"FreeSQL(:%d)>",++line_num); }
  180. void pop_cl_buffer(void)
  181. {
  182.   register char *b=sql_str(NULL,0);
  183.   statement_scanner_buffer= (b?savestring(b):NULL);
  184. }
  185. #define SQL_str 1
  186. #define SQL_comment 2
  187. #define Start 3
  188. # line 84 "monitor.l"
  189. /* done after the current pattern has been matched and before the
  190.  * corresponding action - sets up yytext
  191.  */
  192. #define YY_DO_BEFORE_ACTION 
  193. yytext = yy_bp; 
  194. yyleng = yy_cp - yy_bp; 
  195. yy_hold_char = *yy_cp; 
  196. *yy_cp = ''; 
  197. yy_c_buf_p = yy_cp;
  198. #define EOB_ACT_CONTINUE_SCAN 0
  199. #define EOB_ACT_END_OF_FILE 1
  200. #define EOB_ACT_LAST_MATCH 2
  201. /* return all but the first 'n' matched characters back to the input stream */
  202. #define yyless(n) 
  203. do 
  204. /* undo effects of setting up yytext */ 
  205. *yy_cp = yy_hold_char; 
  206. yy_c_buf_p = yy_cp = yy_bp + n; 
  207. YY_DO_BEFORE_ACTION; /* set up yytext again */ 
  208. while ( 0 )
  209. #define unput(c) yyunput( c, yytext )
  210. struct yy_buffer_state
  211.     {
  212.     FILE *yy_input_file;
  213.     YY_CHAR *yy_ch_buf; /* input buffer */
  214.     YY_CHAR *yy_buf_pos; /* current position in input buffer */
  215.     /* size of input buffer in bytes, not including room for EOB characters */
  216.     int yy_buf_size;
  217.     /* number of characters read into yy_ch_buf, not including EOB characters */
  218.     int yy_n_chars;
  219.     int yy_eof_status; /* whether we've seen an EOF on this buffer */
  220. #define EOF_NOT_SEEN 0
  221.     /* "pending" happens when the EOF has been seen but there's still
  222.      * some text process
  223.      */
  224. #define EOF_PENDING 1
  225. #define EOF_DONE 2
  226.     };
  227. static YY_BUFFER_STATE yy_current_buffer;
  228. /* we provide macros for accessing buffer states in case in the
  229.  * future we want to put the buffer states in a more general
  230.  * "scanner state"
  231.  */
  232. #define YY_CURRENT_BUFFER yy_current_buffer
  233. /* yy_hold_char holds the character lost when yytext is formed */
  234. static YY_CHAR yy_hold_char;
  235. static int yy_n_chars; /* number of characters read into yy_ch_buf */
  236. #ifndef YY_USER_ACTION
  237. #define YY_USER_ACTION
  238. #endif
  239. #ifndef YY_USER_INIT
  240. #define YY_USER_INIT
  241. #endif
  242. extern YY_CHAR *yytext;
  243. extern int yyleng;
  244. extern FILE *yyin, *yyout;
  245. YY_CHAR *yytext;
  246. int yyleng;
  247. FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
  248. #define YY_END_OF_BUFFER 17
  249. typedef int yy_state_type;
  250. static const short int yy_accept[29] =
  251.     {   0,
  252.         0,    0,    0,    0,    0,    0,    0,    0,   17,    7,
  253.         2,    6,    4,    3,    7,    1,   10,    9,   12,   13,
  254.        14,   15,    2,    5,   10,   11,    8,    0
  255.     } ;
  256. static const YY_CHAR yy_ec[256] =
  257.     {   0,
  258.         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
  259.         1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
  260.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  261.         1,    2,    1,    4,    1,    1,    1,    1,    5,    1,
  262.         1,    1,    1,    1,    6,    1,    1,    1,    1,    1,
  263.         1,    1,    1,    1,    1,    1,    1,    1,    7,    1,
  264.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  265.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  266.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  267.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  268.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  269.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  270.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  271.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  272.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  273.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  274.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  275.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  276.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  277.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  278.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  279.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  280.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  281.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  282.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  283.         1,    1,    1,    1,    1
  284.     } ;
  285. static const YY_CHAR yy_meta[8] =
  286.     {   0,
  287.         1,    1,    2,    2,    2,    1,    1
  288.     } ;
  289. static const short int yy_base[31] =
  290.     {   0,
  291.         0,    0,    7,    0,   22,   21,    0,    0,   23,   26,
  292.        20,   26,   26,   26,   15,   26,    0,   26,   16,   14,
  293.        26,   26,   16,   26,    0,   26,   26,   26,   14,   16
  294.     } ;
  295. static const short int yy_def[31] =
  296.     {   0,
  297.        28,    1,   28,    3,   29,   29,    1,    1,   28,   28,
  298.        28,   28,   28,   28,   28,   28,   30,   28,   28,   28,
  299.        28,   28,   28,   28,   30,   28,   28,    0,   28,   28
  300.     } ;
  301. static const short int yy_nxt[34] =
  302.     {   0,
  303.        10,   11,   12,   13,   14,   15,   16,   17,   17,   18,
  304.        19,   20,   17,   17,   21,   21,   25,   23,   27,   26,
  305.        24,   23,   28,   22,   22,    9,   28,   28,   28,   28,
  306.        28,   28,   28
  307.     } ;
  308. static const short int yy_chk[34] =
  309.     {   0,
  310.         1,    1,    1,    1,    1,    1,    1,    3,    3,    3,
  311.         3,    3,    3,    3,   29,   29,   30,   23,   20,   19,
  312.        15,   11,    9,    6,    5,   28,   28,   28,   28,   28,
  313.        28,   28,   28
  314.     } ;
  315. static yy_state_type yy_last_accepting_state;
  316. static YY_CHAR *yy_last_accepting_cpos;
  317. extern int yy_flex_debug;
  318. int yy_flex_debug = 1;
  319. static const short int yy_rule_linenum[16] =
  320.     {   0,
  321.        93,   97,   98,  103,  109,  112,  119,  126,  127,  132,
  322.       133,  134,  142,  152,  153
  323.     } ;
  324. /* the intent behind this definition is that it'll catch
  325.  * any uses of REJECT which flex missed
  326.  */
  327. #define REJECT reject_used_but_not_detected
  328. #define yymore() yymore_used_but_not_detected
  329. #define YY_MORE_ADJ 0
  330. /* these variables are all declared out here so that section 3 code can
  331.  * manipulate them
  332.  */
  333. /* points to current character in buffer */
  334. static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0;
  335. static int yy_init = 1; /* whether we need to initialize */
  336. static int yy_start = 0; /* start state number */
  337. /* flag which is used to allow yywrap()'s to do buffer switches
  338.  * instead of setting up a fresh yyin.  A bit of a hack ...
  339.  */
  340. static int yy_did_buffer_switch_on_eof;
  341. static yy_state_type yy_get_previous_state YY_PROTO(( void ));
  342. static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
  343. static int yy_get_next_buffer YY_PROTO(( void ));
  344. static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr ));
  345. void yyrestart YY_PROTO(( FILE *input_file ));
  346. void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
  347. void yy_load_buffer_state YY_PROTO(( void ));
  348. YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
  349. void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
  350. void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
  351. #define yy_new_buffer yy_create_buffer
  352. #ifdef __cplusplus
  353. static int yyinput YY_PROTO(( void ));
  354. #else
  355. static int input YY_PROTO(( void ));
  356. #endif
  357. YY_DECL
  358.     {
  359.     register yy_state_type yy_current_state;
  360.     register YY_CHAR *yy_cp, *yy_bp;
  361.     register int yy_act;
  362.     i4_t sql_str_d_quote=0;
  363.     static i4_t line_num = 0;
  364.     i4_t smth_done = 0;
  365.                          NEW_LINE;
  366.   /*********************************************
  367.    *        lexics of embedded SQL in C        *
  368.    *********************************************/
  369.     if ( yy_init )
  370. {
  371. YY_USER_INIT;
  372. if ( ! yy_start )
  373.     yy_start = 1; /* first start state */
  374. if ( ! yyin )
  375.     yyin = stdin;
  376. if ( ! yyout )
  377.     yyout = stdout;
  378. if ( yy_current_buffer )
  379.     yy_init_buffer( yy_current_buffer, yyin );
  380. else
  381.     yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
  382. yy_load_buffer_state();
  383. yy_init = 0;
  384. }
  385.     while ( 1 ) /* loops until end-of-file is reached */
  386. {
  387. yy_cp = yy_c_buf_p;
  388. /* support of yytext */
  389. *yy_cp = yy_hold_char;
  390. /* yy_bp points to the position in yy_ch_buf of the start of the
  391.  * current run.
  392.  */
  393. yy_bp = yy_cp;
  394. yy_current_state = yy_start;
  395. yy_match:
  396. do
  397.     {
  398.     register YY_CHAR yy_c = yy_ec[*yy_cp];
  399.     if ( yy_accept[yy_current_state] )
  400. {
  401. yy_last_accepting_state = yy_current_state;
  402. yy_last_accepting_cpos = yy_cp;
  403. }
  404.     while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  405. {
  406. yy_current_state = yy_def[yy_current_state];
  407. if ( yy_current_state >= 29 )
  408.     yy_c = yy_meta[yy_c];
  409. }
  410.     yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
  411.     ++yy_cp;
  412.     }
  413. while ( yy_current_state != 28 );
  414. yy_cp = yy_last_accepting_cpos;
  415. yy_current_state = yy_last_accepting_state;
  416. yy_find_action:
  417. yy_act = yy_accept[yy_current_state];
  418. YY_DO_BEFORE_ACTION;
  419. YY_USER_ACTION;
  420. do_action: /* this label is used only to access EOF actions */
  421. if ( yy_flex_debug )
  422.     {
  423.     if ( yy_act == 0 )
  424. fprintf( stderr, "--scanner backtrackingn" );
  425.     else if ( yy_act < 16 )
  426. fprintf( stderr, "--accepting rule at line %d ("%s")n",
  427.          yy_rule_linenum[yy_act], yytext );
  428.     else if ( yy_act == 16 )
  429. fprintf( stderr, "--accepting default rule ("%s")n",
  430.          yytext );
  431.     else if ( yy_act == 17 )
  432. fprintf( stderr, "--(end of buffer or a NUL)n" );
  433.     else
  434. fprintf( stderr, "--EOFn" );
  435.     }
  436. switch ( yy_act )
  437.     {
  438.     case 0: /* must backtrack */
  439.     /* undo the effects of YY_DO_BEFORE_ACTION */
  440.     *yy_cp = yy_hold_char;
  441.     yy_cp = yy_last_accepting_cpos;
  442.     yy_current_state = yy_last_accepting_state;
  443.     goto yy_find_action;
  444. case 1:
  445. # line 93 "monitor.l"
  446. {
  447.    POP_BUFFER;
  448.    SQL_PROC(1); 
  449.  }
  450. YY_BREAK
  451. case 2:
  452. # line 97 "monitor.l"
  453. { if(smth_done) { APPEND_BUFFER; } }
  454. YY_BREAK
  455. case 3:
  456. # line 98 "monitor.l"
  457. {
  458.                            APPEND_BUFFER;
  459.                            smth_done = 1;
  460.    SWITCH_COND(SQL_str);
  461.  }
  462. YY_BREAK
  463. case 4:
  464. # line 103 "monitor.l"
  465. {
  466.                            APPEND_BUFFER;
  467.                            smth_done = 1;
  468.    sql_str_d_quote=1;
  469.    SWITCH_COND(SQL_str);
  470.  }
  471. YY_BREAK
  472. case 5:
  473. # line 109 "monitor.l"
  474. {
  475.                            SWITCH_COND(SQL_comment);  
  476.  }
  477. YY_BREAK
  478. case 6:
  479. # line 112 "monitor.l"
  480. {
  481.                            if (smth_done)
  482.                              {
  483.                                APPEND_BUFFER;
  484.                              }
  485.                            NEW_LINE;
  486.  }
  487. YY_BREAK
  488. case 7:
  489. # line 119 "monitor.l"
  490. {
  491.                            APPEND_BUFFER;
  492.                            smth_done = 1;
  493.  }
  494. YY_BREAK
  495.   /*********************************************
  496.    *             SQL string recognizer         *
  497.    *********************************************/
  498. case 8:
  499. # line 126 "monitor.l"
  500. { APPEND_BUFFER; }
  501. YY_BREAK
  502. case 9:
  503. # line 127 "monitor.l"
  504. {
  505.                            yyerror(" Unterminated SQL string ");
  506.                            NEW_LINE;
  507.    REST_COND;
  508.          }
  509. YY_BREAK
  510. case 10:
  511. # line 132 "monitor.l"
  512. { APPEND_BUFFER; }
  513. YY_BREAK
  514. case 11:
  515. # line 133 "monitor.l"
  516. { APPEND_BUFFER; }
  517. YY_BREAK
  518. case 12:
  519. # line 134 "monitor.l"
  520. {
  521.    APPEND_BUFFER ;
  522.            if(sql_str_d_quote) 
  523.                              {
  524.        sql_str_d_quote=0;
  525.        REST_COND;
  526.      }
  527.  }
  528. YY_BREAK
  529. case 13:
  530. # line 142 "monitor.l"
  531. {
  532.                            APPEND_BUFFER;
  533.    if(!sql_str_d_quote) 
  534.      {
  535.        REST_COND;
  536.      }
  537.  }
  538. YY_BREAK
  539.   /*********************************************
  540.    *             SQL comment recognizer        *
  541.    *********************************************/
  542. case 14:
  543. # line 152 "monitor.l"
  544. /* do nothing */;
  545. YY_BREAK
  546. case 15:
  547. # line 153 "monitor.l"
  548. {
  549.                            NEW_LINE;
  550.    REST_COND;
  551.  }
  552. YY_BREAK
  553. case 16:
  554. # line 157 "monitor.l"
  555. ECHO;
  556. YY_BREAK
  557. case YY_STATE_EOF(INITIAL):
  558. case YY_STATE_EOF(SQL_str):
  559. case YY_STATE_EOF(SQL_comment):
  560. case YY_STATE_EOF(Start):
  561.     yyterminate();
  562.     case YY_END_OF_BUFFER:
  563. {
  564. /* amount of text matched not including the EOB char */
  565. int yy_amount_of_matched_text = yy_cp - yytext - 1;
  566. /* undo the effects of YY_DO_BEFORE_ACTION */
  567. *yy_cp = yy_hold_char;
  568. /* note that here we test for yy_c_buf_p "<=" to the position
  569.  * of the first EOB in the buffer, since yy_c_buf_p will
  570.  * already have been incremented past the NUL character
  571.  * (since all states make transitions on EOB to the end-
  572.  * of-buffer state).  Contrast this with the test in yyinput().
  573.  */
  574. if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
  575.     /* this was really a NUL */
  576.     {
  577.     yy_state_type yy_next_state;
  578.     yy_c_buf_p = yytext + yy_amount_of_matched_text;
  579.     yy_current_state = yy_get_previous_state();
  580.     /* okay, we're now positioned to make the
  581.      * NUL transition.  We couldn't have
  582.      * yy_get_previous_state() go ahead and do it
  583.      * for us because it doesn't know how to deal
  584.      * with the possibility of jamming (and we
  585.      * don't want to build jamming into it because
  586.      * then it will run more slowly)
  587.      */
  588.     yy_next_state = yy_try_NUL_trans( yy_current_state );
  589.     yy_bp = yytext + YY_MORE_ADJ;
  590.     if ( yy_next_state )
  591. {
  592. /* consume the NUL */
  593. yy_cp = ++yy_c_buf_p;
  594. yy_current_state = yy_next_state;
  595. goto yy_match;
  596. }
  597.     else
  598. {
  599.     yy_cp = yy_last_accepting_cpos;
  600.     yy_current_state = yy_last_accepting_state;
  601. goto yy_find_action;
  602. }
  603.     }
  604. else switch ( yy_get_next_buffer() )
  605.     {
  606.     case EOB_ACT_END_OF_FILE:
  607. {
  608. yy_did_buffer_switch_on_eof = 0;
  609. if ( yywrap() )
  610.     {
  611.     /* note: because we've taken care in
  612.      * yy_get_next_buffer() to have set up yytext,
  613.      * we can now set up yy_c_buf_p so that if some
  614.      * total hoser (like flex itself) wants
  615.      * to call the scanner after we return the
  616.      * YY_NULL, it'll still work - another YY_NULL
  617.      * will get returned.
  618.      */
  619.     yy_c_buf_p = yytext + YY_MORE_ADJ;
  620.     yy_act = YY_STATE_EOF((yy_start - 1) / 2);
  621.     goto do_action;
  622.     }
  623. else
  624.     {
  625.     if ( ! yy_did_buffer_switch_on_eof )
  626. YY_NEW_FILE;
  627.     }
  628. }
  629. break;
  630.     case EOB_ACT_CONTINUE_SCAN:
  631. yy_c_buf_p = yytext + yy_amount_of_matched_text;
  632. yy_current_state = yy_get_previous_state();
  633. yy_cp = yy_c_buf_p;
  634. yy_bp = yytext + YY_MORE_ADJ;
  635. goto yy_match;
  636.     case EOB_ACT_LAST_MATCH:
  637. yy_c_buf_p =
  638.     &yy_current_buffer->yy_ch_buf[yy_n_chars];
  639. yy_current_state = yy_get_previous_state();
  640. yy_cp = yy_c_buf_p;
  641. yy_bp = yytext + YY_MORE_ADJ;
  642. goto yy_find_action;
  643.     }
  644. break;
  645. }
  646.     default:
  647. #ifdef FLEX_DEBUG
  648. printf( "action # %dn", yy_act );
  649. #endif
  650. YY_FATAL_ERROR(
  651. "fatal flex scanner internal error--no action found" );
  652.     }
  653. }
  654.     }
  655. /* yy_get_next_buffer - try to read in a new buffer
  656.  *
  657.  * synopsis
  658.  *     int yy_get_next_buffer();
  659.  *     
  660.  * returns a code representing an action
  661.  *     EOB_ACT_LAST_MATCH - 
  662.  *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  663.  *     EOB_ACT_END_OF_FILE - end of file
  664.  */
  665. static int yy_get_next_buffer()
  666.     {
  667.     register YY_CHAR *dest = yy_current_buffer->yy_ch_buf;
  668.     register YY_CHAR *source = yytext - 1; /* copy prev. char, too */
  669.     register int number_to_move, i;
  670.     int ret_val;
  671.     if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
  672. YY_FATAL_ERROR(
  673. "fatal flex scanner internal error--end of buffer missed" );
  674.     /* try to read more data */
  675.     /* first move last chars to start of buffer */
  676.     number_to_move = yy_c_buf_p - yytext;
  677.     for ( i = 0; i < number_to_move; ++i )
  678. *(dest++) = *(source++);
  679.     if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN )
  680. /* don't do the read, it's not guaranteed to return an EOF,
  681.  * just force an EOF
  682.  */
  683. yy_n_chars = 0;
  684.     else
  685. {
  686. int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1;
  687. if ( num_to_read > YY_READ_BUF_SIZE )
  688.     num_to_read = YY_READ_BUF_SIZE;
  689. else if ( num_to_read <= 0 )
  690.     YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" );
  691. /* read in more data */
  692. YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
  693.   yy_n_chars, num_to_read );
  694. }
  695.     if ( yy_n_chars == 0 )
  696. {
  697. if ( number_to_move - YY_MORE_ADJ == 1 )
  698.     {
  699.     ret_val = EOB_ACT_END_OF_FILE;
  700.     yy_current_buffer->yy_eof_status = EOF_DONE;
  701.     }
  702. else
  703.     {
  704.     ret_val = EOB_ACT_LAST_MATCH;
  705.     yy_current_buffer->yy_eof_status = EOF_PENDING;
  706.     }
  707. }
  708.     else
  709. ret_val = EOB_ACT_CONTINUE_SCAN;
  710.     yy_n_chars += number_to_move;
  711.     yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
  712.     yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
  713.     /* yytext begins at the second character in yy_ch_buf; the first
  714.      * character is the one which preceded it before reading in the latest
  715.      * buffer; it needs to be kept around in case it's a newline, so
  716.      * yy_get_previous_state() will have with '^' rules active
  717.      */
  718.     yytext = &yy_current_buffer->yy_ch_buf[1];
  719.     return ( ret_val );
  720.     }
  721. /* yy_get_previous_state - get the state just before the EOB char was reached
  722.  *
  723.  * synopsis
  724.  *     yy_state_type yy_get_previous_state();
  725.  */
  726. static yy_state_type yy_get_previous_state()
  727.     {
  728.     register yy_state_type yy_current_state;
  729.     register YY_CHAR *yy_cp;
  730.     yy_current_state = yy_start;
  731.     for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
  732. {
  733. register YY_CHAR yy_c = (*yy_cp ? yy_ec[*yy_cp] : 1);
  734. if ( yy_accept[yy_current_state] )
  735.     {
  736.     yy_last_accepting_state = yy_current_state;
  737.     yy_last_accepting_cpos = yy_cp;
  738.     }
  739. while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  740.     {
  741.     yy_current_state = yy_def[yy_current_state];
  742.     if ( yy_current_state >= 29 )
  743. yy_c = yy_meta[yy_c];
  744.     }
  745. yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
  746. }
  747.     return ( yy_current_state );
  748.     }
  749. /* yy_try_NUL_trans - try to make a transition on the NUL character
  750.  *
  751.  * synopsis
  752.  *     next_state = yy_try_NUL_trans( current_state );
  753.  */
  754. #ifdef YY_USE_PROTOS
  755. static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state )
  756. #else
  757. static yy_state_type yy_try_NUL_trans( yy_current_state )
  758. register yy_state_type yy_current_state;
  759. #endif
  760.     {
  761.     register int yy_is_jam;
  762.     register YY_CHAR *yy_cp = yy_c_buf_p;
  763.     register YY_CHAR yy_c = 1;
  764.     if ( yy_accept[yy_current_state] )
  765. {
  766. yy_last_accepting_state = yy_current_state;
  767. yy_last_accepting_cpos = yy_cp;
  768. }
  769.     while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  770. {
  771. yy_current_state = yy_def[yy_current_state];
  772. if ( yy_current_state >= 29 )
  773.     yy_c = yy_meta[yy_c];
  774. }
  775.     yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
  776.     yy_is_jam = (yy_current_state == 28);
  777.     return ( yy_is_jam ? 0 : yy_current_state );
  778.     }
  779. #ifdef YY_USE_PROTOS
  780. static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp )
  781. #else
  782. static void yyunput( c, yy_bp )
  783. YY_CHAR c;
  784. register YY_CHAR *yy_bp;
  785. #endif
  786.     {
  787.     register YY_CHAR *yy_cp = yy_c_buf_p;
  788.     /* undo effects of setting up yytext */
  789.     *yy_cp = yy_hold_char;
  790.     if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
  791. { /* need to shift things up to make room */
  792. register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */
  793. register YY_CHAR *dest =
  794.     &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2];
  795. register YY_CHAR *source =
  796.     &yy_current_buffer->yy_ch_buf[number_to_move];
  797. while ( source > yy_current_buffer->yy_ch_buf )
  798.     *--dest = *--source;
  799. yy_cp += dest - source;
  800. yy_bp += dest - source;
  801. yy_n_chars = yy_current_buffer->yy_buf_size;
  802. if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
  803.     YY_FATAL_ERROR( "flex scanner push-back overflow" );
  804. }
  805.     if ( yy_cp > yy_bp && yy_cp[-1] == 'n' )
  806. yy_cp[-2] = 'n';
  807.     *--yy_cp = c;
  808.     /* note: the formal parameter *must* be called "yy_bp" for this
  809.      *       macro to now work correctly
  810.      */
  811.     YY_DO_BEFORE_ACTION; /* set up yytext again */
  812.     }
  813. #ifdef __cplusplus
  814. static int yyinput()
  815. #else
  816. static int input()
  817. #endif
  818.     {
  819.     int c;
  820.     YY_CHAR *yy_cp = yy_c_buf_p;
  821.     *yy_cp = yy_hold_char;
  822.     if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
  823. {
  824. /* yy_c_buf_p now points to the character we want to return.
  825.  * If this occurs *before* the EOB characters, then it's a
  826.  * valid NUL; if not, then we've hit the end of the buffer.
  827.  */
  828. if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
  829.     /* this was really a NUL */
  830.     *yy_c_buf_p = '';
  831. else
  832.     { /* need more input */
  833.     yytext = yy_c_buf_p;
  834.     ++yy_c_buf_p;
  835.     switch ( yy_get_next_buffer() )
  836. {
  837. case EOB_ACT_END_OF_FILE:
  838.     {
  839.     if ( yywrap() )
  840. {
  841. yy_c_buf_p = yytext + YY_MORE_ADJ;
  842. return ( EOF );
  843. }
  844.     YY_NEW_FILE;
  845. #ifdef __cplusplus
  846.     return ( yyinput() );
  847. #else
  848.     return ( input() );
  849. #endif
  850.     }
  851.     break;
  852. case EOB_ACT_CONTINUE_SCAN:
  853.     yy_c_buf_p = yytext + YY_MORE_ADJ;
  854.     break;
  855. case EOB_ACT_LAST_MATCH:
  856. #ifdef __cplusplus
  857.     YY_FATAL_ERROR( "unexpected last match in yyinput()" );
  858. #else
  859.     YY_FATAL_ERROR( "unexpected last match in input()" );
  860. #endif
  861. }
  862.     }
  863. }
  864.     c = *yy_c_buf_p;
  865.     yy_hold_char = *++yy_c_buf_p;
  866.     return ( c );
  867.     }
  868. #ifdef YY_USE_PROTOS
  869. void yyrestart( FILE *input_file )
  870. #else
  871. void yyrestart( input_file )
  872. FILE *input_file;
  873. #endif
  874.     {
  875.     yy_init_buffer( yy_current_buffer, input_file );
  876.     yy_load_buffer_state();
  877.     }
  878. #ifdef YY_USE_PROTOS
  879. void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
  880. #else
  881. void yy_switch_to_buffer( new_buffer )
  882. YY_BUFFER_STATE new_buffer;
  883. #endif
  884.     {
  885.     if ( yy_current_buffer == new_buffer )
  886. return;
  887.     if ( yy_current_buffer )
  888. {
  889. /* flush out information for old buffer */
  890. *yy_c_buf_p = yy_hold_char;
  891. yy_current_buffer->yy_buf_pos = yy_c_buf_p;
  892. yy_current_buffer->yy_n_chars = yy_n_chars;
  893. }
  894.     yy_current_buffer = new_buffer;
  895.     yy_load_buffer_state();
  896.     /* we don't actually know whether we did this switch during
  897.      * EOF (yywrap()) processing, but the only time this flag
  898.      * is looked at is after yywrap() is called, so it's safe
  899.      * to go ahead and always set it.
  900.      */
  901.     yy_did_buffer_switch_on_eof = 1;
  902.     }
  903. #ifdef YY_USE_PROTOS
  904. void yy_load_buffer_state( void )
  905. #else
  906. void yy_load_buffer_state()
  907. #endif
  908.     {
  909.     yy_n_chars = yy_current_buffer->yy_n_chars;
  910.     yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
  911.     yyin = yy_current_buffer->yy_input_file;
  912.     yy_hold_char = *yy_c_buf_p;
  913.     }
  914. #ifdef YY_USE_PROTOS
  915. YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
  916. #else
  917. YY_BUFFER_STATE yy_create_buffer( file, size )
  918. FILE *file;
  919. int size;
  920. #endif
  921.     {
  922.     YY_BUFFER_STATE b;
  923.     b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) );
  924.     if ( ! b )
  925. YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
  926.     b->yy_buf_size = size;
  927.     /* yy_ch_buf has to be 2 characters longer than the size given because
  928.      * we need to put in 2 end-of-buffer characters.
  929.      */
  930.     b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) );
  931.     if ( ! b->yy_ch_buf )
  932. YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
  933.     yy_init_buffer( b, file );
  934.     return ( b );
  935.     }
  936. #ifdef YY_USE_PROTOS
  937. void yy_delete_buffer( YY_BUFFER_STATE b )
  938. #else
  939. void yy_delete_buffer( b )
  940. YY_BUFFER_STATE b;
  941. #endif
  942.     {
  943.     if ( b == yy_current_buffer )
  944. yy_current_buffer = (YY_BUFFER_STATE) 0;
  945.     free( (char *) b->yy_ch_buf );
  946.     free( (char *) b );
  947.     }
  948. #ifdef YY_USE_PROTOS
  949. void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
  950. #else
  951. void yy_init_buffer( b, file )
  952. YY_BUFFER_STATE b;
  953. FILE *file;
  954. #endif
  955.     {
  956.     b->yy_input_file = file;
  957.     /* we put in the 'n' and start reading from [1] so that an
  958.      * initial match-at-newline will be true.
  959.      */
  960.     b->yy_ch_buf[0] = 'n';
  961.     b->yy_n_chars = 1;
  962.     /* we always need two end-of-buffer characters.  The first causes
  963.      * a transition to the end-of-buffer state.  The second causes
  964.      * a jam in that state.
  965.      */
  966.     b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
  967.     b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR;
  968.     b->yy_buf_pos = &b->yy_ch_buf[1];
  969.     b->yy_eof_status = EOF_NOT_SEEN;
  970.     }
  971. # line 157 "monitor.l"
  972. typedef struct save_yy_cond {
  973.       i4_t yy_cond;
  974.       struct save_yy_cond *nxt;
  975.     } *sv_ys_ptr;
  976. static sv_ys_ptr save_yy_start=NULL;
  977. static void
  978. save_condition(YY_PROTO(void))
  979. {
  980.   register sv_ys_ptr nptr=(sv_ys_ptr)xmalloc(sizeof(struct save_yy_cond));
  981.   nptr->yy_cond=yy_start;
  982.   nptr->nxt=save_yy_start;
  983.   save_yy_start=nptr;
  984. #ifdef FLEX_DEBUG
  985.   if(yy_flex_debug)
  986.     fprintf(stderr,"n Lex: save condition :%d => (%d)n",
  987.             yy_start,nptr->yy_cond);
  988. #endif
  989. }
  990. static void
  991. rest_condition(YY_PROTO(void))
  992. {
  993.   register sv_ys_ptr nptr=save_yy_start;
  994.   if(nptr==NULL)
  995.     fatal("Lex: Impossible restore conditions before save it !",NULL);
  996.   yy_start=nptr->yy_cond;
  997.   save_yy_start=nptr->nxt;
  998. #ifdef FLEX_DEBUG
  999.   if(yy_flex_debug)
  1000.     fprintf(stderr,"n Lex: restore condition :%d <=(%d)n",
  1001.             yy_start,nptr->yy_cond);
  1002. #endif
  1003.   xfree(nptr);
  1004. }
  1005. int
  1006. print_width(dyn_sql_type_code_t t,int len)
  1007. {
  1008.   switch(t)
  1009.     {
  1010.     case SQL__Long  : 
  1011.     case SQL__Real  : return 10;
  1012.     case SQL__Short : return  5;
  1013.     case SQL__Double: return 15;
  1014.     default:                   ;
  1015.     }
  1016.   return len; 
  1017. }
  1018. void
  1019. error_rprt(char *st,int rc, char *stmt)
  1020. {
  1021.   fprintf(stderr,"n#### Error occured in '%s'n%snat "%s"n",
  1022.           stmt,gsqlca.errmsg,st);
  1023. }
  1024. int
  1025. main(int argc, char *argv[])
  1026. {
  1027.   static char buffer[4096*4];
  1028.   int stmt = 0;
  1029.   int rc;
  1030.   int i,j;
  1031.   static char *sps =
  1032.     "                                                                       "
  1033.     "                                                                       "
  1034.     "                                                                       "
  1035.     "                                                                       "
  1036.     "                                                                       "
  1037.     ;
  1038.   yyin = stdin;
  1039.   yyout = stderr;
  1040. #if 0 
  1041.   if (argc > 1)
  1042.     {
  1043.       char *host , *user, *passwd;
  1044.       host   = argv[1];
  1045.       user   = (argc > 2 ? argv[2]: getlogin() );
  1046.       passwd = (argc > 3 ? argv[3]: NULL);
  1047.       if(SQL__session(host,user,passwd)!=0)       /* Not implemented yet */
  1048.         yyfatal("Can't connect to given host");
  1049.     }
  1050. #endif
  1051.   
  1052. #define CHECK(st) if((rc=SQL__##st)!=0){ error_rprt(#st,rc,statement_scanner_buffer); goto error; }
  1053.   while(SCANNER_NAME())
  1054.     {
  1055.       char *b;
  1056.       int   l = strlen(statement_scanner_buffer);
  1057.       int  *clms = NULL;
  1058.       
  1059.       SQL_DESCR in,out;
  1060.       
  1061.       if(statement_scanner_buffer==NULL)
  1062.         continue;
  1063.       if(strncmp(statement_scanner_buffer,"select",strlen("select")))
  1064.         {
  1065.           /* if not select statement */
  1066.           CHECK(execute_immediate(statement_scanner_buffer));
  1067.           stmt++;
  1068.           continue;
  1069.         }
  1070.       /* put select in parenthesys */
  1071.       b = xmalloc(l+3);
  1072.       b[0] = '(';
  1073.       strcpy(b+1,statement_scanner_buffer);
  1074.       strcat(b+1+l,")");
  1075.       xfree(statement_scanner_buffer);
  1076.       statement_scanner_buffer = b;
  1077.           
  1078.       b = xmalloc(20);
  1079.       sprintf(b,"%dth Stmt",stmt++);
  1080.       CHECK(prepare(b,statement_scanner_buffer));
  1081.       CHECK(allocate_cursor(b,"CURSOR"));
  1082.       in  = SQL__allocate_descr("IN",0);
  1083.       out = SQL__allocate_descr("OUT",0);
  1084.       CHECK(describe(b,1,in));
  1085.       CHECK(describe(b,0,out));
  1086.       clms = (int*)xmalloc(out->count*sizeof(int));
  1087.       
  1088.       /* open cursor and write headers */
  1089.       j=1;
  1090.       fprintf(stderr,"n|");
  1091.       for( i=0; i < out->count; i++)
  1092.         {
  1093.           int jj, k = 0;
  1094.           sql_descr_element_t *e = &(out->values[i]);
  1095.           if (e->unnamed)
  1096.             jj=fprintf(stderr," col_%03d ",i);
  1097.           else
  1098.             jj=fprintf(stderr," %s ",e->name);
  1099.           k = print_width(e->type,e->length) - jj;
  1100.           jj += fprintf(stderr,"%s|",sps+strlen(sps)- (k>0?k:0) );
  1101.           clms [i] = jj - 1;
  1102.           j += jj;
  1103.         }
  1104.       /* -------------------------------------------------*/
  1105.       fprintf(stderr,"n");
  1106.       for(i=j;i--;)
  1107.         fprintf(stderr,"-");
  1108.       if(in->count)
  1109.         {
  1110.           CHECK(open_cursor("CURSOR",in));
  1111.         }
  1112.       else
  1113.         {
  1114.           CHECK(open_cursor("CURSOR",NULL));
  1115.         }
  1116.         
  1117.       while(1)
  1118.         {
  1119.           char oline[1024];
  1120.           for( i=0; i < out->count; i++)
  1121.             out->values[i].indicator = 0;
  1122.           CHECK(fetch("CURSOR",out));
  1123.           
  1124.           if(SQLCODE!=0)
  1125.             break;
  1126.           
  1127.           sprintf(oline,"n|");
  1128.           for (i=0; i < out->count; i++)
  1129.             {
  1130.               int k ;
  1131.               int kk = 0 ;
  1132.               char buf[4096] ;
  1133.               sql_descr_element_t *e = &(out->values[i]) ;
  1134.               
  1135.               if (e->indicator < 0)
  1136.                 {
  1137.                   if (!e->nullable)
  1138.                     if (e->name)
  1139.                       fprintf(stderr,"nindicator < 0 for 'not null' field '%s'",e->name);
  1140.                     else
  1141.                       fprintf(stderr,"nindicator < 0 for 'not null' field '%d'",i);
  1142.                   sprintf(buf,"null");
  1143.                 }
  1144.               else switch(e->type)
  1145.                 {
  1146.                 case SQL__Char:
  1147.                 case SQL__CharVar:
  1148.                   sprintf(buf,"%s",(char*)e->data);
  1149.                   break;
  1150.                 case SQL__Double: /* DOUBLE */
  1151.                 case SQL__Float: /* FLOAT  */
  1152.                   sprintf(buf,"%g",*((double*)(e->data)));
  1153.                   break;
  1154.                 case SQL__Real: /* REAL   */
  1155.                   sprintf(buf,"%g",*((float*)(e->data)));
  1156.                   break;
  1157.                 case SQL__Int: /* int */
  1158.                   sprintf(buf,"%X",*((int*)(e->data)));
  1159.                   break;
  1160.                 case SQL__Short: /* small */
  1161.                   sprintf(buf,"%d",(int)*((short*)(e->data)));
  1162.                   break;
  1163.                 default:
  1164.                   sprintf(buf," **%d** ",e->type);
  1165.                 }
  1166.               assert(kk==0);
  1167.               k = (clms[i] - strlen(buf))/2; 
  1168.               if (k > 4*clms[i])
  1169.                 {
  1170.                   strcat(oline,"!!");
  1171.                   k = 0;
  1172.                 }
  1173.               k = sprintf(oline+strlen(oline),"%s%s",
  1174.                           sps + strlen(sps) - (k>0?k:0),buf);
  1175.               k = clms[i] - k;
  1176.               sprintf(oline+strlen(oline),"%s|",
  1177.                       sps + strlen(sps) - (k>0?k:0));
  1178.             }
  1179.           fprintf(stderr,"%s",oline);
  1180.         }
  1181.       
  1182.       /* -------------------------------------------------*/
  1183.       fprintf(stderr,"n");
  1184.       for(i=j;i--;)
  1185.         fprintf(stderr,"-");
  1186.       fprintf(stderr,"nn");
  1187.       CHECK(close_cursor("CURSOR"));
  1188.       CHECK(deallocate_prepare(b));
  1189.     error:
  1190.       SQL__deallocate_descr(&in);
  1191.       SQL__deallocate_descr(&out);
  1192.       xfree(clms);
  1193.       xfree(b);
  1194.       b = NULL;
  1195.     }
  1196.       
  1197.   _SQL_commit();
  1198.   return 0;
  1199. }
  1200. int yywrap() { return 1; }