예제 #1
0
/*----------------------------------------------------------------------------*/
static double scanner_get_length (scanner_t * s, double resolution)
{
  double val = scanner_get_double (s);

  if (!s || s->err)
    return (0);
  if (s->eof) {
    scanner_error (s, "length expected");
    return (0);
  }
  if (s->c - ';') {
    if (resolution <= 0.0) {
      scanner_error (s, "resolution not set");
      return (0);
    }
    s->resolution_used = 1;
    if (scanner_get_id (s))
      return (0);
    if (!strcmp (s->id, "INCH"))
      val *= resolution;
    else if (!strcmp (s->id, "CM"))
      val *= (resolution / 2.54);
    else if (!strcmp (s->id, "MM"))
      val *= (resolution / 25.4);
    else {
      scanner_error (s, "unknown length unit");
      return (0);
    }
  }
  return val;
}                               /* scanner_get_length */
예제 #2
0
static int 
tokenize(mvc * c, int cur)
{
	struct scanner *lc = &c->scanner;
	while (1) {
		if (cur == 0xFEFF) {
			/* on Linux at least, iswpunct returns TRUE
			 * for U+FEFF, but we don't want that, we just
			 * want to go to the scanner_error case
			 * below */
			;
		} else if (iswspace(cur)) {
			if ((cur = skip_white_space(lc)) == EOF)
				return cur;
			continue;  /* try again */
		} else if (iswdigit(cur)) {
			return number(c, cur);
		} else if (iswalpha(cur) || cur == '_') {
			return keyword_or_ident(c, cur);
		} else if (iswpunct(cur)) {
			return scanner_symbol(c, cur);
		}
		if (cur == EOF) {
			if (lc->mode == LINE_1 || !lc->started )
				return cur;
			return scanner_error(c, cur);
		}
		/* none of the above: error */
		return scanner_error(c, cur);
	}
}
예제 #3
0
/*----------------------------------------------------------------------------*/
static int scanner_nextchar (scanner_t * s, int expect)
{
  if (!s || s->err || s->eof)
    return (0);
  while (s->pos + 1 >= s->txtlen) {
    int mes_stat = mes_ability (0);
    int err = mes_realloc ((void**)&(s->txt), sizeof(*(s->txt))*(s->txtlen + 256));
    mes_ability (mes_stat);

    if (err) {
      scanner_error (s, "line too long");
      return (-1);
    }
    else
      s->txtlen += 256;
  }
  s->txt[s->pos] = s->c;
  if (s->c == '\n') {
    s->pos = 0;
    s->line++;
  }
  else
    s->pos++;
  s->txt[s->pos] = 0;

  scanner_fgetc (s);
  if (s->eof && expect) {
    scanner_error (s, "unexpected end of file");
    return (-1);
  }
  return (0);
}                               /* scanner_nextchar */
예제 #4
0
int matrix_i_read (scanner_t * s, int **matrix, int max_zeile, int max_spalte)
{
#define CUR_PROC "matrix_i_read"
  int len = 0, zeile = 0;
  scanner_consume (s, '{');
  if (s->err)
    return (-1);
  while (!s->eof && !s->err && s->c - '}') {
    if (zeile >= max_zeile) {
      scanner_error (s, "too many rows in matrix");
      return (-1);
    }
    /* Memory allocation takes place in scanner_get_int_array */
    matrix[zeile] = scanner_get_int_array (s, &len);
    if (len != max_spalte) {
      scanner_error (s, "wrong number of elements in matrix");
      return (-1);
    }
    scanner_consume (s, ';');
    if (s->err) {
      scanner_error (s, "missing ';' or wrong number of columns");
      return (-1);
    }
    zeile++;
  }
  scanner_consume (s, '}');
  if (s->err)
    return (-1);
  if (zeile < max_zeile) {
    scanner_error (s, "rows missing in matrix");
    return (-1);
  }
  return (0);
#undef CUR_PROC
}                               /* matrix_i_read */
예제 #5
0
/*----------------------------------------------------------------------------*/
static int scanner_digit (int *val, scanner_t * s, int radix, int expect)
{
  switch (radix) {
  case 10:
    if ('0' <= s->c && s->c <= '9')
      *val = *val * 10 + s->c - '0';
    else if (expect) {
      scanner_error (s, "decimal digit expected");
      return (-1);
    }
    else
      return (1);
    break;
  case 16:
    if (s->c >= '0' && s->c <= '9')
      *val = *val * 16 + s->c - '0';
    else if ('A' <= s->c && s->c <= 'F')
      *val = *val * 16 + s->c - 'A' + 10;
    else if ('a' <= s->c && s->c <= 'f')
      *val = *val * 16 + s->c - 'a' + 10;
    else if (expect) {
      scanner_error (s, "decimal digit expected");
      return (-1);
    }
    else
      return (1);
    break;
  case 2:
    if (s->c >= '0' && s->c <= '1')
      *val = *val * 2 + s->c - '0';
    else if (expect) {
      scanner_error (s, "binary digit expected");
      return (-1);
    }
    else
      return (1);
    break;
  case 8:
    if (s->c >= '0' && s->c <= '7')
      *val = *val * 8 + s->c - '0';
    else if (expect) {
      scanner_error (s, "octal digit expected");
      return (-1);
    }
    else
      return (1);
    break;
  default:
    return (1);
  }
  return (0);
}                               /* scanner_digit */
예제 #6
0
static int randvar_read_PHI ()
{
# define CUR_PROC "randvar_read_PHI"
  int res = -1;
  char filename = "ghmm/PHI_001_20.dat";
  scanner_t *s = NULL;

//#warning "PHI_DATA_FILE deprecated!"
  s = scanner_alloc (filename);
  if (!s) {
    mes_proc ();
    goto STOP;
  }
  scanner_get_name (s);
  scanner_consume (s, '=');
  if (s->err)
    goto STOP;
  if (!strcmp (s->id, "PHI")) {
    scanner_consume (s, '{');
    if (s->err)
      goto STOP;
    PHI = scanner_get_double_earray (s, &PHI_len);
    if (s->err)
      goto STOP;
    scanner_consume (s, ';');
    if (s->err)
      goto STOP;
    scanner_consume (s, '}');
    if (s->err)
      goto STOP;
    scanner_consume (s, ';');
    if (s->err)
      goto STOP;
  }
  else {
    scanner_error (s, "unknown identifier");
    goto STOP;
  }
  // printf("%.4f\n", PHI[PHI_len-1]); 

  res = 0;;
STOP:
  scanner_free (&s);
  return res;
# undef CUR_PROC
}       
예제 #7
0
int
_xkbcommon_lex(YYSTYPE *yylval, struct scanner *s)
{
    int tok;

skip_more_whitespace_and_comments:
    /* Skip spaces. */
    while (is_space(peek(s))) next(s);

    /* Skip comments. */
    if (lit(s, "//") || chr(s, '#')) {
        while (!eof(s) && !eol(s)) next(s);
        goto skip_more_whitespace_and_comments;
    }

    /* See if we're done. */
    if (eof(s)) return END_OF_FILE;

    /* New token. */
    s->token_line = s->line;
    s->token_column = s->column;
    s->buf_pos = 0;

    /* String literal. */
    if (chr(s, '\"')) {
        while (!eof(s) && !eol(s) && peek(s) != '\"') {
            if (chr(s, '\\')) {
                uint8_t o;
                if      (chr(s, '\\')) buf_append(s, '\\');
                else if (chr(s, 'n'))  buf_append(s, '\n');
                else if (chr(s, 't'))  buf_append(s, '\t');
                else if (chr(s, 'r'))  buf_append(s, '\r');
                else if (chr(s, 'b'))  buf_append(s, '\b');
                else if (chr(s, 'f'))  buf_append(s, '\f');
                else if (chr(s, 'v'))  buf_append(s, '\v');
                else if (chr(s, 'e'))  buf_append(s, '\033');
                else if (oct(s, &o))   buf_append(s, (char) o);
                else {
                    scanner_warn(s, "unknown escape sequence in string literal");
                    /* Ignore. */
                }
            } else {
                buf_append(s, next(s));
            }
        }
        if (!buf_append(s, '\0') || !chr(s, '\"'))
            return scanner_error(s, "unterminated string literal");
        yylval->str = strdup(s->buf);
        if (!yylval->str)
            return scanner_error(s, "scanner out of memory");
        return STRING;
    }

    /* Key name literal. */
    if (chr(s, '<')) {
        while (is_graph(peek(s)) && peek(s) != '>')
            buf_append(s, next(s));
        if (!buf_append(s, '\0') || !chr(s, '>'))
            return scanner_error(s, "unterminated key name literal");
        /* Empty key name literals are allowed. */
        yylval->sval = xkb_atom_intern(s->ctx, s->buf, s->buf_pos - 1);
        return KEYNAME;
    }

    /* Operators and punctuation. */
    if (chr(s, ';')) return SEMI;
    if (chr(s, '{')) return OBRACE;
    if (chr(s, '}')) return CBRACE;
    if (chr(s, '=')) return EQUALS;
    if (chr(s, '[')) return OBRACKET;
    if (chr(s, ']')) return CBRACKET;
    if (chr(s, '(')) return OPAREN;
    if (chr(s, ')')) return CPAREN;
    if (chr(s, '.')) return DOT;
    if (chr(s, ',')) return COMMA;
    if (chr(s, '+')) return PLUS;
    if (chr(s, '-')) return MINUS;
    if (chr(s, '*')) return TIMES;
    if (chr(s, '/')) return DIVIDE;
    if (chr(s, '!')) return EXCLAM;
    if (chr(s, '~')) return INVERT;

    /* Identifier. */
    if (is_alpha(peek(s)) || peek(s) == '_') {
        s->buf_pos = 0;
        while (is_alnum(peek(s)) || peek(s) == '_')
            buf_append(s, next(s));
        if (!buf_append(s, '\0'))
            return scanner_error(s, "identifier too long");

        /* Keyword. */
        tok = keyword_to_token(s->buf);
        if (tok != -1) return tok;

        yylval->str = strdup(s->buf);
        if (!yylval->str)
            return scanner_error(s, "scanner out of memory");
        return IDENT;
    }

    /* Number literal (hexadecimal / decimal / float). */
    if (number(s, &yylval->num, &tok)) {
        if (tok == ERROR_TOK)
            return scanner_error(s, "malformed number literal");
        return tok;
    }

    return scanner_error(s, "unrecognized token");
}