Initial revision
[melted] / src / valerie / valerie_parser.c
1 /*
2 * valerie_parser.c -- Valerie Parser for Miracle
3 * Copyright (C) 2002-2003 Ushodaya Enterprises Limited
4 * Author: Charles Yates <charles.yates@pandora.be>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 /* System header files */
22 #include <stdio.h>
23 #include <stdarg.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 /* Application header files */
28 #include "valerie_parser.h"
29 #include "valerie_util.h"
30
31 /** Connect to the parser.
32 */
33
34 valerie_response valerie_parser_connect( valerie_parser parser )
35 {
36 return parser->connect( parser->real );
37 }
38
39 /** Execute a command via the parser.
40 */
41
42 valerie_response valerie_parser_execute( valerie_parser parser, char *command )
43 {
44 return parser->execute( parser->real, command );
45 }
46
47 /** Execute a formatted command via the parser.
48 */
49
50 valerie_response valerie_parser_executef( valerie_parser parser, char *format, ... )
51 {
52 char *command = malloc( 10240 );
53 valerie_response response = NULL;
54 if ( command != NULL )
55 {
56 va_list list;
57 va_start( list, format );
58 if ( vsnprintf( command, 10240, format, list ) != 0 )
59 response = valerie_parser_execute( parser, command );
60 va_end( list );
61 free( command );
62 }
63 return response;
64 }
65
66 /** Execute the contents of a file. Note the special case valerie_response returned.
67 */
68
69 valerie_response valerie_parser_run( valerie_parser parser, char *filename )
70 {
71 valerie_response response = valerie_response_init( );
72 if ( response != NULL )
73 {
74 FILE *file = fopen( filename, "r" );
75 if ( file != NULL )
76 {
77 char command[ 1024 ];
78 valerie_response_set_error( response, 201, "OK" );
79 while ( valerie_response_get_error_code( response ) == 201 && fgets( command, 1024, file ) )
80 {
81 valerie_util_trim( valerie_util_chomp( command ) );
82 if ( strcmp( command, "" ) && command[ 0 ] != '#' )
83 {
84 valerie_response temp = NULL;
85 valerie_response_printf( response, 1024, "%s\n", command );
86 temp = valerie_parser_execute( parser, command );
87 if ( temp != NULL )
88 {
89 int index = 0;
90 for ( index = 0; index < valerie_response_count( temp ); index ++ )
91 valerie_response_printf( response, 10240, "%s\n", valerie_response_get_line( temp, index ) );
92 valerie_response_close( temp );
93 }
94 else
95 {
96 valerie_response_set_error( response, 500, "Batch execution failed" );
97 }
98 }
99 }
100 fclose( file );
101 }
102 else
103 {
104 valerie_response_set_error( response, 404, "File not found." );
105 }
106 }
107 return response;
108 }
109
110 /** Get the notifier associated to the parser.
111 */
112
113 valerie_notifier valerie_parser_get_notifier( valerie_parser parser )
114 {
115 if ( parser->notifier == NULL )
116 parser->notifier = valerie_notifier_init( );
117 return parser->notifier;
118 }
119
120 /** Close the parser.
121 */
122
123 void valerie_parser_close( valerie_parser parser )
124 {
125 if ( parser != NULL )
126 {
127 parser->close( parser->real );
128 valerie_notifier_close( parser->notifier );
129 free( parser );
130 }
131 }