CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
tokenizer.c-Dateireferenz
#include "stdlib.h"
#include "stddef.h"
#include "string.h"
#include "ctype.h"
#include "stdio.h"
#include "tokenizer.h"
+ Include-Abhängigkeitsdiagramm für tokenizer.c:

gehe zum Quellcode dieser Datei

Datenstrukturen

struct  keyword_token
 

Makrodefinitionen

#define DEBUG_PRINTF(...)
 
#define MAX_NUMLEN   6
 

Funktionen

static int singlechar (void)
 
static int get_next_token (void)
 
void tokenizer_init (const char *program)
 
int tokenizer_token (void)
 
void tokenizer_next (void)
 
int tokenizer_num (void)
 
void tokenizer_string (char *dest, int len)
 
void tokenizer_label (char *dest, int len)
 
void tokenizer_error_print (void)
 
int tokenizer_finished (void)
 
int tokenizer_variable_num (void)
 
int tokenizer_line_number (void)
 

Variablen

static char constptr
 
static char constnextptr
 
static ubasic_token current_token = TOKENIZER_ERROR
 
static int current_line = 0
 
static struct keyword_token keywords []
 

Makro-Dokumentation

#define DEBUG_PRINTF (   ...)

Definiert in Zeile 34 der Datei tokenizer.c.

#define MAX_NUMLEN   6

Definiert in Zeile 47 der Datei tokenizer.c.

Dokumentation der Funktionen

static int get_next_token ( void  )
static

Definiert in Zeile 316 der Datei tokenizer.c.

317 {
318  struct keyword_token const *kt;
319  int i;
320 
321  DEBUG_PRINTF("get_next_token(): '%s'\n", ptr);
322 
323  // eat all whitespace
324  while(*ptr == ' ' || *ptr == '\t' || *ptr == '\r') ptr++;
325 
326  if(*ptr == 0) {
327  return TOKENIZER_ENDOFINPUT;
328  }
329 
330  // UnknStatement should have size, otherwise hanging-up in ubasic.c possible for some cases
331  nextptr = ptr + 1;
332 
333  if(isdigit(*ptr)) {
334  for(i = 0; i < (MAX_NUMLEN+1); ++i) {
335  if(!isdigit(ptr[i])) {
336  if(i > 0) {
337  nextptr = ptr + i;
338  return TOKENIZER_NUMBER;
339  } else {
340  DEBUG_PRINTF("get_next_token: error due to too short number\n");
341  return TOKENIZER_ERROR;
342  }
343  }
344  if(!isdigit(ptr[i])) {
345  DEBUG_PRINTF("get_next_token: error due to malformed number\n");
346  return TOKENIZER_ERROR;
347  }
348  }
349  DEBUG_PRINTF("get_next_token: error due to too long number\n");
350  return TOKENIZER_ERROR;
351  } else if(*ptr == ':') {
352  // label
353  nextptr = ptr;
354  do {
355  ++nextptr;
356  } while(*nextptr != ' ' && *nextptr != '\r' && *nextptr != '\n' && *nextptr != '\t');
357  return TOKENIZER_LABEL;
358  } else if((i=singlechar()) != 0) {
359  if (i == TOKENIZER_CR){
360  // move to next line, and skip all following empty lines as well
361  while (singlechar() == TOKENIZER_CR)
362  {
363  current_line++;
364  ptr++;
365  // eat all whitespace
366  while(*ptr == ' ' || *ptr == '\t' || *ptr == '\r') ptr++;
367  };
368  ptr--;
369  // dangelo: now the last char might point to a whitespace instead of
370  // a CR. I hope that doesn't break anything.
371  }
372  nextptr = ptr + 1;
373  return i;
374  } else if(*ptr == '"') {
375  nextptr = ptr;
376  do {
377  ++nextptr;
378  } while(*nextptr != '"');
379  ++nextptr;
380  return TOKENIZER_STRING;
381  } else {
382  for(kt = keywords; kt->keyword != NULL; ++kt) {
383  if(strncmp(ptr, kt->keyword, strlen(kt->keyword)) == 0) {
384  nextptr = ptr + strlen(kt->keyword);
385  if (kt->token == TOKENIZER_REM) {
386  while(*nextptr != 0 && *nextptr != '\r' && *nextptr != '\n') ++nextptr;
387  }
388  return kt->token;
389  }
390  }
391  }
392 
393  if((*ptr >= 'a' && *ptr <= 'z') || (*ptr >= 'A' && *ptr <= 'Z')) {
394  nextptr = ptr + 1;
395  return TOKENIZER_VARIABLE;
396  }
397 
398 
399  return TOKENIZER_ERROR;
400 }
static int singlechar ( void  )
static

Definiert in Zeile 281 der Datei tokenizer.c.

282 {
283  if(*ptr == '\n') {
284  return TOKENIZER_CR;
285  } else if(*ptr == ',') {
286  return TOKENIZER_COMMA;
287  } else if(*ptr == ';') {
288  return TOKENIZER_SEMICOLON;
289  } else if(*ptr == '+') {
290  return TOKENIZER_PLUS;
291  } else if(*ptr == '-') {
292  return TOKENIZER_MINUS;
293  } else if(*ptr == '&') {
294  return TOKENIZER_AND;
295  } else if(*ptr == '|') {
296  return TOKENIZER_OR;
297  } else if(*ptr == '^') {
298  return TOKENIZER_XOR;
299  } else if(*ptr == '*') {
300  return TOKENIZER_ASTR;
301  } else if(*ptr == '/') {
302  return TOKENIZER_SLASH;
303  } else if(*ptr == '%') {
304  return TOKENIZER_MOD;
305  } else if(*ptr == '(') {
306  return TOKENIZER_LEFTPAREN;
307  } else if(*ptr == ')') {
308  return TOKENIZER_RIGHTPAREN;
309  } else if(*ptr == '=') {
310  return TOKENIZER_EQ;
311  }
312  return 0;
313 }
void tokenizer_error_print ( void  )

Definiert in Zeile 486 der Datei tokenizer.c.

487 {
488  DEBUG_PRINTF("tokenizer_error_print: '%s'\n", ptr);
489 }
int tokenizer_finished ( void  )

Definiert in Zeile 492 der Datei tokenizer.c.

493 {
494  return *ptr == 0 || current_token == TOKENIZER_ENDOFINPUT;
495 }
void tokenizer_init ( const char *  program)

Definiert in Zeile 403 der Datei tokenizer.c.

404 {
405  ptr = program;
406  current_line = 1;
409 }
void tokenizer_label ( char *  dest,
int  len 
)

Definiert in Zeile 463 der Datei tokenizer.c.

464 {
465  char *string_end;
466  int string_len;
467 
469  return;
470  }
471  // allow string \r, \n, tabulation and space to end labels
472  string_end = strpbrk(ptr + 1, " \t\r\n");
473 
474  if(string_end == NULL) {
475  return;
476  }
477  string_len = string_end - ptr - 1;
478  if(len < string_len) {
479  string_len = len;
480  }
481  memcpy(dest, ptr + 1, string_len);
482  dest[string_len] = 0;
483 }
int tokenizer_line_number ( void  )

Definiert in Zeile 503 der Datei tokenizer.c.

504 {
505  return current_line;
506 }
void tokenizer_next ( void  )

Definiert in Zeile 418 der Datei tokenizer.c.

419 {
420 
421  if(tokenizer_finished()) {
422  return;
423  }
424 
425  DEBUG_PRINTF("tokenizer_next: %p\n", nextptr);
426  ptr = nextptr;
427  while((*ptr == ' ') || (*ptr == '\t')) {
428  ++ptr;
429  }
431  DEBUG_PRINTF("tokenizer_next: '%s' %d\n", ptr, current_token);
432  return;
433 }
int tokenizer_num ( void  )

Definiert in Zeile 436 der Datei tokenizer.c.

437 {
438  return atoi(ptr);
439 }
void tokenizer_string ( char *  dest,
int  len 
)

Definiert in Zeile 442 der Datei tokenizer.c.

443 {
444  char *string_end;
445  int string_len;
446 
448  return;
449  }
450  string_end = strchr(ptr + 1, '"');
451  if(string_end == NULL) {
452  return;
453  }
454  string_len = string_end - ptr - 1;
455  if(len < string_len) {
456  string_len = len;
457  }
458  memcpy(dest, ptr + 1, string_len);
459  dest[string_len] = 0;
460 }
int tokenizer_token ( void  )

Definiert in Zeile 412 der Datei tokenizer.c.

413 {
414  return current_token;
415 }
int tokenizer_variable_num ( void  )

Definiert in Zeile 498 der Datei tokenizer.c.

499 {
500  return *ptr - (*ptr>='a'?'a':('A'-26));
501 }

Variablen-Dokumentation

int current_line = 0
static

Definiert in Zeile 55 der Datei tokenizer.c.

ubasic_token current_token = TOKENIZER_ERROR
static

Definiert in Zeile 54 der Datei tokenizer.c.

struct keyword_token keywords[]
static

Definiert in Zeile 57 der Datei tokenizer.c.

char const * nextptr
static

Definiert in Zeile 45 der Datei tokenizer.c.

char const* ptr
static

Definiert in Zeile 45 der Datei tokenizer.c.