コード例 #1
0
ファイル: picol.c プロジェクト: ivanovev/stm32f4
int picolParseString(picolParser *p) {
  int newword = (p->type == PT_SEP || p->type == PT_EOL || p->type == PT_STR);
  if(p->len >= 3 && !mystrncmp(p->p,"{*}",3)) {
    p->expand = 1;
    p->p += 3; p->len -= 3; /* skip the {*} expand indicator */
  }
  if (newword && *p->p == '{') {return picolParseBrace(p);}
  else if (newword && *p->p == '"') {
    p->insidequote = 1;
    p->p++; p->len--;
  }
  for(p->start = p->p; 1; p->p++, p->len--) {
    if (p->len == 0)       RETURN_PARSED(PT_ESC);
    switch(*p->p) {
    case '\\':             if (p->len >= 2) { p->p++; p->len--; }; break;
    case '$': case '[':    RETURN_PARSED(PT_ESC);
    case ' ': case '\t': case '\n': case '\r': case ';':
      if (!p->insidequote) RETURN_PARSED(PT_ESC);
      break;
    case '"':
      if (p->insidequote) {
        p->end = p->p-1;
        p->type = PT_ESC;
        p->p++; p->len--;
        p->insidequote = 0;
        return PICOL_OK;
      }
      break;
    }
  }
}
コード例 #2
0
int picolParseString(struct picolParser *p) {
	int newword = (p->type == PT_SEP || p->type == PT_EOL || p->type == PT_STR);
	if (newword && *p->p == '{')
		return picolParseBrace(p);
	else if (newword && *p->p == '"') {
		p->insidequote = 1;
		p->p++;
		p->len--;
	}
	p->start = p->p;
	while (1) {
		if (p->len == 0) {
			p->end = p->p - 1;
			p->type = PT_ESC;
			return PICOL_OK;
		}
		switch (*p->p) {
		case '\\':
			if (p->len >= 2) {
				p->p++;
				p->len--;
			}
			break;
		case '$':
		case '[':
			p->end = p->p - 1;
			p->type = PT_ESC;
			return PICOL_OK;
		case ' ':
		case '\t':
		case '\n':
		case '\r':
		case ';':
			if (!p->insidequote) {
				p->end = p->p - 1;
				p->type = PT_ESC;
				return PICOL_OK;
			}
			break;
		case '"':
			if (p->insidequote) {
				p->end = p->p - 1;
				p->type = PT_ESC;
				p->p++;
				p->len--;
				p->insidequote = 0;
				return PICOL_OK;
			}
			break;
		}
		p->p++;
		p->len--;
	}
	return PICOL_OK; /* unreached */
}
コード例 #3
0
ファイル: picol.c プロジェクト: ivanovev/stm32f4
int picolParseVar(picolParser *p) {
    int parened = 0;
    p->start = ++p->p; p->len--; /* skip the $ */
    if (*p->p == '{') {
        picolParseBrace(p);
        p->type = PT_VAR;
        return PICOL_OK;
    }
    if(COLONED(p->p)) {p->p += 2; p->len -= 2;}
    /*  while(isalnum(*p->p) || strchr("()_",*p->p)) { p->p++; p->len--; }*/
#if 1
    while(myisalnum(*p->p) || *p->p == '_' || *p->p=='('||*p->p==')') {
        if(*p->p=='(') parened = 1;
        p->p++; p->len--;
    }
    if(!parened && *(p->p-1)==')') {p->p--; p->len++;}
#endif
    if (p->start == p->p) { /* It's just a single char string "$" */
        picolParseString(p);
        p->start--; p->len++; /* back to the $ sign */
        p->type = PT_VAR;
        return PICOL_OK;
    } else RETURN_PARSED(PT_VAR);
}