C-sparse
view release on metacpan or search on metacpan
src/sparse-0.4.4/tokenize.c view on Meta::CPAN
{
static char buffer[MAX_STRING + 4];
char *p = buffer;
if (prefix)
*p++ = prefix;
*p++ = delim;
memcpy(p, s, len);
p += len;
*p++ = delim;
*p++ = '\0';
return buffer;
}
static const char *quote_char(SCTX_ const char *s, size_t len, char prefix, char delim)
{
static char buffer[2*MAX_STRING + 6];
size_t i;
char *p = buffer;
if (prefix)
*p++ = prefix;
if (delim == '"')
*p++ = '\\';
*p++ = delim;
for (i = 0; i < len; i++) {
if (s[i] == '"' || s[i] == '\\')
*p++ = '\\';
*p++ = s[i];
}
if (delim == '"')
*p++ = '\\';
*p++ = delim;
*p++ = '\0';
return buffer;
}
const char *show_token(SCTX_ const struct token *token)
{
static char buffer[256];
if (!token)
return "<no token>";
switch (token_type(token)) {
case TOKEN_ERROR:
return "syntax error";
case TOKEN_EOF:
return "end-of-input";
case TOKEN_IDENT:
return show_ident(sctx_ token->ident);
case TOKEN_NUMBER:
return token->number;
case TOKEN_SPECIAL:
return show_special(sctx_ token->special);
case TOKEN_CHAR:
return show_char(sctx_ token->string->data,
token->string->length - 1, 0, '\'');
case TOKEN_CHAR_EMBEDDED_0 ... TOKEN_CHAR_EMBEDDED_3:
return show_char(sctx_ token->embedded,
token_type(token) - TOKEN_CHAR, 0, '\'');
case TOKEN_WIDE_CHAR:
return show_char(sctx_ token->string->data,
token->string->length - 1, 'L', '\'');
case TOKEN_WIDE_CHAR_EMBEDDED_0 ... TOKEN_WIDE_CHAR_EMBEDDED_3:
return show_char(sctx_ token->embedded,
token_type(token) - TOKEN_WIDE_CHAR, 'L', '\'');
case TOKEN_STRING:
return show_char(sctx_ token->string->data,
token->string->length - 1, 0, '"');
case TOKEN_WIDE_STRING:
return show_char(sctx_ token->string->data,
token->string->length - 1, 'L', '"');
case TOKEN_STREAMBEGIN:
sprintf(buffer, "<beginning of '%s'>", stream_name(sctx_ token->pos.stream));
return buffer;
case TOKEN_STREAMEND:
sprintf(buffer, "<end of '%s'>", stream_name(sctx_ token->pos.stream));
return buffer;
case TOKEN_UNTAINT:
sprintf(buffer, "<untaint>");
return buffer;
case TOKEN_ARG_COUNT:
sprintf(buffer, "<argcnt>");
return buffer;
case TOKEN_CONS:
sprintf(buffer, "<cons>");
return buffer;
default:
sprintf(buffer, "unhandled token type '%d' ", token_type(token));
return buffer;
}
}
const char *quote_token(SCTX_ const struct token *token)
{
static char buffer[256];
switch (token_type(token)) {
case TOKEN_ERROR:
return "syntax error";
case TOKEN_IDENT:
return show_ident(sctx_ token->ident);
case TOKEN_NUMBER:
return token->number;
case TOKEN_SPECIAL:
return show_special(sctx_ token->special);
case TOKEN_CHAR:
return quote_char(sctx_ token->string->data,
token->string->length - 1, 0, '\'');
case TOKEN_CHAR_EMBEDDED_0 ... TOKEN_CHAR_EMBEDDED_3:
return quote_char(sctx_ token->embedded,
token_type(token) - TOKEN_CHAR, 0, '\'');
case TOKEN_WIDE_CHAR:
return quote_char(sctx_ token->string->data,
token->string->length - 1, 'L', '\'');
case TOKEN_WIDE_CHAR_EMBEDDED_0 ... TOKEN_WIDE_CHAR_EMBEDDED_3:
return quote_char(sctx_ token->embedded,
token_type(token) - TOKEN_WIDE_CHAR, 'L', '\'');
case TOKEN_STRING:
return quote_char(sctx_ token->string->data,
token->string->length - 1, 0, '"');
case TOKEN_WIDE_STRING:
return quote_char(sctx_ token->string->data,
token->string->length - 1, 'L', '"');
default:
sprintf(buffer, "unhandled token type '%d' ", token_type(token));
return buffer;
}
}
/* ctx.h
#define HASHED_INPUT_BITS (6)
#define HASHED_INPUT (1 << HASHED_INPUT_BITS)
#define HASH_PRIME 0x9e370001UL
*/
#ifndef DO_CTX
static int input_stream_hashes[HASHED_INPUT] = { [0 ... HASHED_INPUT-1] = -1 };
#endif
int *hash_stream(SCTX_ const char *name)
{
uint32_t hash = 0;
unsigned char c;
while ((c = *name++) != 0)
hash = (hash + (c << 4) + (c >> 4)) * 11;
hash *= HASH_PRIME;
hash >>= 32 - HASHED_INPUT_BITS;
return sctxp input_stream_hashes + hash;
}
/* called from symbol.c:"builtin" and pro-processor.c:"pre-processsor" */
struct stream *init_stream(SCTX_ const char *name, int fd, const char **next_path)
{
int stream = sctxp input_stream_nr, *hash;
struct stream *current;
if (stream >= sctxp input_streams_allocated) {
int newalloc = stream * 4 / 3 + 10;
sctxp input_streams = realloc(sctxp input_streams, newalloc * sizeof(struct stream));
if (!sctxp input_streams)
sparse_die(sctx_ "Unable to allocate more streams space");
sctxp input_streams_allocated = newalloc;
}
current = sctxp input_streams + stream;
memset(current, 0, sizeof(*current));
current->name = name;
current->fd = fd;
current->next_path = next_path;
current->issys = ppre_issys(sctx_ next_path);
current->path = NULL;
current->constant = CONSTANT_FILE_MAYBE;
sctxp input_stream_nr = stream+1;
hash = hash_stream(sctx_ name);
( run in 0.733 second using v1.01-cache-2.11-cpan-71847e10f99 )