Menu

[r5829]: / trunk / fuse-basic / parse.c  Maximize  Restore  History

Download this file

103 lines (75 with data), 2.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
/* parse.c: routines to parse a buffer to the specified type
Copyright (c) 2004 Philip Kendall
$Id$
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Author contact information:
E-mail: philip-fuse@shadowmagic.org.uk
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parse.h"
/* The buffer we're parsing from */
static const char *parse_buffer;
/* The number of bytes left in parse_buffer */
static size_t parse_buffer_length;
/* What we want to parse to */
enum parse_target_type parse_target;
/* The various things we can parse to */
struct program *parse_program_target;
struct numexp *parse_numexp_target;
struct strexp *parse_strexp_target;
/* Need to declare these somewhere */
extern int yydebug;
int yyparse( void );
struct program *
parse_program( const char *buffer, size_t length )
{
parse_target = PARSE_PROGRAM;
parse_buffer = buffer;
parse_buffer_length = length;
return yyparse() ? NULL : parse_program_target;
}
struct numexp *
parse_numexp( const char *buffer, size_t length )
{
parse_target = PARSE_NUMEXP;
parse_buffer = buffer;
parse_buffer_length = length;
return yyparse() ? NULL : parse_numexp_target;
}
struct strexp *
parse_strexp( const char *buffer, size_t length )
{
parse_target = PARSE_STREXP;
parse_buffer = buffer;
parse_buffer_length = length;
return yyparse() ? NULL : parse_strexp_target;
}
/* Called to get up to 'max_size' bytes of the buffer */
int
parse_fill_buffer( char *buf, int *result, int max_size )
{
size_t length;
if( !parse_buffer_length ) return 0;
length = parse_buffer_length < max_size ? parse_buffer_length : max_size;
memcpy( buf, parse_buffer, length );
*result = length; parse_buffer += length; parse_buffer_length -= length;
return 1;
}
/* Really interesting error reporting function */
void
yyerror( char *s )
{
fprintf( stderr, "%s\n", s );
}
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.