pike.git/
src/
modules/
Parser/
pike.c
Branch:
Tag:
Non-build tags
All tags
No tags
2004-10-05
2004-10-05 21:14:47 by Martin Nilsson <mani@lysator.liu.se>
55355aaaa851fc02c79d6486961d2cfb58f7e461 (
120
lines) (+
120
/-
0
)
[
Show
|
Annotate
]
Branch:
7.9
Pike parser, take 1.
Rev: src/modules/Parser/pike.c:1.1
Rev: src/modules/Parser/pike_tokenizer.h:1.1
1:
+
/*! array(array(string),string) split( string x )
+
*! Returns an array with Pike-level tokens and the remainder (a
+
*! partial token), if any.
+
*/
+
#include "global.h"
+
#include "config.h"
-
+
#include "pike_macros.h"
+
#include "object.h"
+
#include "constants.h"
+
#include "interpret.h"
+
#include "svalue.h"
+
#include "threads.h"
+
#include "array.h"
+
#include "pike_error.h"
+
#include "operators.h"
+
#include "builtin_functions.h"
+
#include "module_support.h"
+
#include "mapping.h"
+
#include "stralloc.h"
+
#include "program_id.h"
+
#include "block_alloc.h"
+
#include <ctype.h>
+
+
#include "parser.h"
+
+
INLINE static int m_isidchar( unsigned int x )
+
{
+
if( (x >= 'a' && x <= 'z') || (x>='A' && x<='Z') || x>128 || x == '_')
+
return 1;
+
return 0;
+
}
+
+
INLINE static int m_isidchar2( unsigned int x )
+
{
+
if( (x >= 'a' && x <= 'z') || (x>='A' && x<='Z') || x>128 || x=='_' ||
+
(x>='0'&&x<='9')||x=='$')
+
return 1;
+
return 0;
+
}
+
+
+
#define PUSH_TOKEN push_token0
+
#define TOKENIZE tokenize0
+
#define CHAR p_wchar0
+
#include "pike_tokenizer.h"
+
#undef TOKENIZE
+
#undef CHAR
+
#undef PUSH_TOKEN
+
+
#define PUSH_TOKEN push_token1
+
#define TOKENIZE tokenize1
+
#define CHAR p_wchar1
+
#include "pike_tokenizer.h"
+
#undef TOKENIZE
+
#undef CHAR
+
#undef PUSH_TOKEN
+
+
#define PUSH_TOKEN push_token2
+
#define TOKENIZE tokenize2
+
#define CHAR p_wchar2
+
#include "pike_tokenizer.h"
+
#undef TOKENIZE
+
#undef CHAR
+
#undef PUSH_TOKEN
+
+
static void do_free_arrayptr( struct array **x )
+
{
+
free_array( *x );
+
}
+
+
static void f_tokenize( INT32 args )
+
{
+
struct array *res = allocate_array_no_init( 0, 128 );
+
struct pike_string *left_s = 0; /* Make gcc happy. */
+
int left;
+
ONERROR tmp;
+
+
if( Pike_sp[-1].type != PIKE_T_STRING )
+
Pike_error("Expected string argument\n");
+
+
SET_ONERROR(tmp, do_free_arrayptr, &res);
+
+
switch( Pike_sp[-1].u.string->size_shift )
+
{
+
case 0:
+
left=tokenize0(&res,(p_wchar0*)Pike_sp[-1].u.string->str,Pike_sp[-1].u.string->len);
+
left_s = make_shared_binary_string0( (p_wchar0*)Pike_sp[-1].u.string->str+left,
+
Pike_sp[-1].u.string->len-left);
+
break;
+
case 1:
+
left=tokenize1(&res,(p_wchar1*)Pike_sp[-1].u.string->str,Pike_sp[-1].u.string->len);
+
left_s = make_shared_binary_string1( (p_wchar1*)Pike_sp[-1].u.string->str+left,
+
Pike_sp[-1].u.string->len-left);
+
break;
+
case 2:
+
left=tokenize2(&res,(p_wchar2*)Pike_sp[-1].u.string->str,Pike_sp[-1].u.string->len);
+
left_s = make_shared_binary_string1( (p_wchar1*)Pike_sp[-1].u.string->str+left,
+
Pike_sp[-1].u.string->len-left);
+
break;
+
#ifdef PIKE_DEBUG
+
default:
+
Pike_error("Unknown shift size %d.\n", Pike_sp[-1].u.string->size_shift);
+
#endif
+
}
+
pop_n_elems(args);
+
push_array(res);
+
push_string( left_s );
+
f_aggregate( 2 );
+
}
+
+
+
void init_parser_pike()
+
{
+
ADD_FUNCTION("tokenize",f_tokenize,tFunc(tStr,tArr(tStr)),0);
+
}
+
+
void exit_parser_pike()
+
{
+
}
Newline at end of file added.