示例#1
0
/*
findSplitOperator
@param ptr pointer to start of str
@return ptr to end of string if no non-subshell operator is found,
  otherwise pointer to lowest precendencenon-subshell operator
*/
char *
findNextOperator(char *ptr, char *end) {
    ptr=skipWs(ptr);
    if (*ptr=='(') { //opening of subshell

        int openparen=1;
        while (openparen>0) {
            ptr++;
            char c=*ptr;
            if (c == '(') {
                openparen++;
            } else if (c==')') {
                openparen--;
            }
        }
    }
    char *op=strpbrk(ptr,";$*|");
    return op;

}
示例#2
0
文件: lexer.c 项目: cerik/scpi-parser
/**
 * Detect token Decimal number
 * @param state
 * @param token
 * @return 
 */
int scpiLex_DecimalNumericProgramData(lex_state_t * state, scpi_token_t * token) {
    char * rollback;
    token->ptr = state->pos;

    if (skipMantisa(state)) {
        rollback = state->pos;
        skipWs(state);
        if (!skipExponent(state)) {
            state->pos = rollback;
        }
    } else {
        state->pos = token->ptr;
    }

    token->len = state->pos - token->ptr;
    if (token->len > 0) {
        token->type = SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA;
    } else {
        token->type = SCPI_TOKEN_UNKNOWN;
    }

    return token->len;
}
示例#3
0
文件: badxml.c 项目: Zirias/badxml
static XmlElement *
parseElement(XmlDoc *doc, const char **xmlText, XmlElement *parent)
{
    XmlElement *element = 0;
    XmlElement *childnode = 0;
    XmlAttribute *attribute = 0;
    const char *startval = 0;
    const char *endval = 0;
    size_t valLen = 0;

    ++(*xmlText);
    if (!**xmlText) FAIL(XML_EOF);
    if (**xmlText == '/')
    {
	++(*xmlText);
	FAILS(XML_CLOSEWOOPEN, readBareWord(xmlText, ">"));
    }

    element = calloc(1, sizeof(XmlElement));
    element->prev = element->next = element;
    element->parent = parent;
    if (parent)
    {
	element->depth = parent->depth + 1;
    }
    else
    {
	element->depth = 0;
    }
    element->name = readBareWord(xmlText, ">");
    if (!element->name) FAIL(XML_UNNAMEDTAG);
    if (!**xmlText) FAIL(XML_EOF);

    while (1)
    {
	skipWs(doc, xmlText);
	if (!**xmlText) FAIL(XML_EOF);

	if (**xmlText == '>')
	{
	    ++(*xmlText);
	    break;
	}
	if (**xmlText == '/')
	{
	    ++(*xmlText);
	    skipWs(doc, xmlText);
	    if (!**xmlText) FAIL(XML_EOF);
	    if (**xmlText != '>') FAILC(XML_UNEXPECTED, **xmlText);
	    ++(*xmlText);
	    return element;
	}
	attribute = parseAttribute(doc, xmlText, element);
	if (!attribute) goto failp;
	if (element->attributes)
	{
	    attribute->prev = element->attributes->prev;
	    attribute->next = element->attributes;
	    element->attributes->prev->next = attribute;
	    element->attributes->prev = attribute;
	}
	else
	{
	    element->attributes = attribute;
	}
	attribute = 0;
	if (!**xmlText) FAIL(XML_EOF);
    }

    startval = *xmlText;
    while (**xmlText)
    {
	if (**xmlText == '<')
	{
	    if (hasNonWs(startval, *xmlText))
	    {
		endval = *xmlText;
		while (isspace(*(endval-1))) --endval;
		appendString(&(element->value), startval, &valLen,
			(size_t)(endval - startval));
	    }
	    if ((*xmlText)[1] == '/')
	    {
		*xmlText += 2;
		skipWs(doc, xmlText);
		if (!**xmlText) FAIL(XML_EOF);
		if (strncmp(*xmlText, element->name, strlen(element->name)))
		{
		    FAILS(XML_UNMATCHEDCLOSE, cloneString(element->name));
		}
		*xmlText += strlen(element->name);
		skipWs(doc, xmlText);
		if (!**xmlText) FAIL(XML_EOF);
		if (**xmlText != '>') FAILC(XML_UNEXPECTED, **xmlText);
		++(*xmlText);
		return element;
	    }
	    else
	    {
		childnode = parseElement(doc, xmlText, element);
		if (!childnode) goto failp;
		if (element->children)
		{
		    childnode->prev = element->children->prev;
		    childnode->next = element->children;
		    element->children->prev->next = childnode;
		    element->children->prev = childnode;
		}
		else
		{
		    element->children = childnode;
		}
		childnode = 0;
		startval = *xmlText;
	    }
	}
	else skipUntil(doc, xmlText, '<');
    }
    doc->err = XML_EOF;

fail:
    doc->col = *xmlText - doc->currLine + 1;
failp:
    freeElementList(element);
    return 0;
}
示例#4
0
command_t
parseCmd(char *start, char *end) {
    if (start>end/* || iters++>MAXITER*/) return NULL;

    //trim the start and end pointers
    start=skipWs(start);

    if (*start=='\0') return NULL;

    while (*end == ' ' || *end == '\t' || *end == '\n')
    {
        end--;
    }

    if (debug) printf("parsing: \"%.*s\" start = \'%c\' end = \'%c\'\n", end-start+1, start, *start, *end);

    command_t t = (command_t) checked_malloc(sizeof(struct command));
    char *ptr = start;
    //char *op = findNextOperator(ptr);
    char *op = strpbrk(skipSubshell(ptr), ";$*|");
    char *next = op;

    ////printf("parsing: start = %c op = %c next = %c \n", *ptr, *op, *next);

    while (next && next <= end) {

        char * prec = ";$*|";
        int opPrec = strchr(prec, *op) - prec;
        int nextPrec = strchr(prec, *next) - prec;
        //printf("parsing: [while] opPrec = %d nextPrec = %d \n", opPrec, nextPrec);
        if (((opPrec == 1 || opPrec == 2) && (nextPrec == 1 || nextPrec == 2))
                || (nextPrec < opPrec))
        {
            op = next;
        }
        //printf("parsing: [while] start = %c op = %c next = %c \n", *ptr, *op, *next);
        //next = findNextOperator(++next);
        next = strpbrk(skipSubshell(++next), ";$*|");

    }

    if (op && op<end) { // if operator in expression
        //////printf("op: %c\n",*op);
        switch(*op) {
        case ';':
            t->type=SEQUENCE_COMMAND;
            break;
        case '$':
            t->type=OR_COMMAND;
            break;
        case '*':
            t->type=AND_COMMAND;
            break;
        case '|':
            t->type=PIPE_COMMAND;
            break;
        default:
            error(1,0,"illegal operator detected");
            //should not get here
            break;
        }
        //printf("\ncomplex command type%d: %.*s,%.*s\n", t->type, op-start, start,end-op,op+1);
        //t->u.command=(command_t *) checked_malloc(sizeof(command_t)*2);

        t->u.command[0]=parseCmd(start,op-1);
        t->u.command[1]=parseCmd(op+1,end);


    } else if (*start == '(') { //if subshell
        //printf("subshell command\n");
        ptr = skipSubshell(ptr);
        t->type=SUBSHELL_COMMAND;
        t->u.subshell_command=(command_t) checked_malloc(sizeof(command_t));
        t->u.subshell_command=parseCmd(start+1,ptr-1);
    } else { //simple command with no op and no subshell
        //if (debug) printf("Building simple command\n");
        t->type=SIMPLE_COMMAND;

        int wdct=0;//word count tracker

        //construct the simple command struct from str - check for redirections
        char* s = start;
        char* e;

        while (s)
        {

            if(*s == '<')
            {
                s = nextWordStart(s, end);
                e = currWordEnd(s, end);
                size_t wsize = e-s+1;
                t->input=(char *) checked_malloc(wsize+1);
                memcpy(t->input,s,wsize);
                t->input[wsize]='\0';
                if(debug) printf("Building segments: \"%.*s\" -> \'%s\'\n", e-s+1, s, t->input);

            }
            else if(*s == '>')
            {
                s = nextWordStart(s, end);
                e = currWordEnd(s, end);
                size_t wsize = e-s+1;
                t->output=(char *) checked_malloc(wsize+1);
                memcpy(t->output,s,wsize);
                t->output[wsize]='\0';
                if(debug) printf("Building segments: \"%.*s\" -> \'%s\'\n", e-s+1, s, t->output);
            }
            else
            {
                e = currWordEnd(s, end);
                size_t wsize = e-s+1;
                size_t asize = sizeof(char*) * (wdct+2);
                t->u.word = (char **) checked_realloc(t->u.word, asize);
                t->u.word[wdct] = (char *) checked_malloc(wsize+1);
                memcpy(t->u.word[wdct],s,wsize);
                t->u.word[wdct][wsize]='\0';
                wdct++;
                if(debug) printf("Building segments: \"%.*s\" -> \'%s\'\n", e-s+1, s, t->u.word[wdct-1]);
            }
            s = nextWordStart(e, end);
        }
        *(t->u.word+wdct)=NULL;
    }
    return t;
}
示例#5
0
static bool ParseSvgPathData(const char* s, VecSegmented<SvgPathInstr>& instr) {
    s = skipWs(s);

    while (*s) {
        SvgPathInstr i(GetInstructionType(*s++));
        switch (i.type) {
            case PathInstr::Close:
            case PathInstr::Close2:
                break;

            case PathInstr::HLineAbs:
            case PathInstr::HLineRel:
            case PathInstr::VLineAbs:
            case PathInstr::VLineRel:
                s = str::Parse(s, "%f", &i.v[0]);
                break;

            case PathInstr::MoveAbs:
            case PathInstr::MoveRel:
            case PathInstr::LineToAbs:
            case PathInstr::LineToRel:
            case PathInstr::BezierTAbs:
            case PathInstr::BezierTRel:
                s = str::Parse(s, "%f%_%?,%_%f", &i.v[0], &i.v[1]);
                break;

            case PathInstr::BezierSAbs:
            case PathInstr::BezierSRel:
            case PathInstr::BezierQAbs:
            case PathInstr::BezierQRel:
                s = str::Parse(s, "%f%_%?,%_%f,%f%_%?,%_%f", &i.v[0], &i.v[1], &i.v[2], &i.v[3]);
                break;

            case PathInstr::BezierCAbs:
            case PathInstr::BezierCRel:
                s = str::Parse(s, "%f%_%?,%_%f,%f%_%?,%_%f,%f%_%?,%_%f", &i.v[0], &i.v[1], &i.v[2], &i.v[3], &i.v[4],
                               &i.v[5]);
                break;

            case PathInstr::ArcAbs:
            case PathInstr::ArcRel: {
                int largeArc, sweep;
                s = str::Parse(s, "%f%_%?,%_%f%_%?,%_%f%_%?,%_%d%_%?,%_%d%_%?,%_%f%_%?,%_%f", &i.v[0], &i.v[1], &i.v[2],
                               &largeArc, &sweep, &i.v[3], &i.v[4]);
                i.largeArc = (largeArc != 0);
                i.sweep = (sweep != 0);
            } break;

            default:
                CrashIf(true);
                return false;
        }

        if (!s) {
            return false;
        }
        instr.Append(i);

        s = skipWs(s);
    }

    return true;
}