Str* ParseLex(char* s,Err* err,int* i){ int len=0; static char op='\0'; Str* S=NULL; S=StrInit(); int noStep=0; char c; ParseLexStates prevstate,state=BLANK; if (s!=NULL) len=strlen(s); else return NULL; while ((*i)<len && s[*i]==' ') (*i)++; for (;(state!=ERROR && (*i)<=len);){ c=s[*i]; prevstate=state; switch (state){ case BLANK: if (c=='"') state=QUOTE; else if (CharOp(c)) { if (S->len==0 && CharDoubleOp(c)){ if ((*i)<len-1 && s[(*i)+1]==c){ StrPutChar(S,c); StrPutChar(S,c); StrPutChar(S,'\0'); (*i)+=2; state=END; } else { StrPutChar(S,c); StrPutChar(S,'\0'); (*i)++; state=END; } } if (S->len==0 && CharSimpleOp(c)){ StrPutChar(S,c); StrPutChar(S,'\0'); state=END; (*i)++; } } else if (c==' ' || c=='\0') state=BLANK; else { StrPutChar(S,c); state=WORD; } break; case QUOTE: if (c!='"') StrPutChar(S,c); if (c=='"') { StrPutChar(S,'\0'); state=END; (*i)++; } else if ((*i)==len-1) state=ERROR; break; case OPERATOR: if (c==op && CharDoubleOp(c)){ StrPutChar(S,c);StrPutChar(S,c); StrPutChar(S,'\0'); state=END; (*i)++; } else { StrPutChar(S,c); StrPutChar(S,'\0'); state=END; } break; case WORD: if (c=='"') state=WORD; else if (c==' '){ /*StrPutChar(S,' ');*/ state=END; } else if (CharOp(c)) { state=END; op=c; } else { StrPutChar(S,c); } break; default: break; } if (state==END ) { if (StrLast(S)!='\0') StrPutChar(S,'\0'); /*printf("%d\n",*i);*/ return S; } if (!noStep) (*i)++; if (state==ERROR){ if (prevstate==QUOTE) { err->pres=1; (err->err)=myrealloc(err->err,50); strcpy(err->err,"Unfinished Quote\0"); } i=NULL; return NULL; } if ((*i)>=len){ if (state==BLANK) return NULL; if (state!=BLANK) { if (StrLast(S)!='\0') StrPutChar(S,'\0'); return S; } } } i=NULL; return S; }
void GenericPrintf(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs, char * str) { const char *FPos; struct Value *NextArg = Param[0]; struct ValueType *FormatType; int ArgCount = 1; int LeftJustify = FALSE; int ZeroPad = FALSE; int FieldWidth = 0; const char *Format = Param[0]->Val->Pointer; int l; for (FPos = Format; *FPos != '\0'; FPos++) { if (*FPos == '%') { FPos++; if (*FPos == '-') { /* a leading '-' means left justify */ LeftJustify = TRUE; FPos++; } if (*FPos == '0') { /* a leading zero means zero pad a decimal number */ ZeroPad = TRUE; FPos++; } /* get any field width in the format */ while (isdigit((int)*FPos)) FieldWidth = FieldWidth * 10 + (*FPos++ - '0'); /* now check the format type */ switch (*FPos) { case 's': FormatType = CharPtrType; break; case 'd': case 'u': case 'x': case 'b': case 'c': FormatType = &IntType; break; case 'f': FormatType = &FPType; break; case '%': StrPutChar(str,'%');++str;FormatType = NULL; break; case '\0': FPos--; FormatType = NULL; break; default: StrPutChar(str,*FPos);++str; FormatType = NULL; break; } if (FormatType != NULL) { /* we have to format something */ if (ArgCount >= NumArgs) { l = StrPutStr(str,"XXX");str+=l; } else { // It won't compile if I don't add this. If you have an idea why, please tell me... actually this is defined in platform.h #define ALIGN_TYPE void * NextArg = (struct Value *)((char *)NextArg + MEM_ALIGN(sizeof(struct Value) + TypeStackSizeValue(NextArg))); if (NextArg->Typ != FormatType && !((FormatType == &IntType || *FPos == 'f') && IS_NUMERIC_COERCIBLE(NextArg)) && !(FormatType == CharPtrType && (NextArg->Typ->Base == TypePointer || (NextArg->Typ->Base == TypeArray && NextArg->Typ->FromType->Base == TypeChar) ) ) ) { l = StrPutStr(str,"XXX");str+=l; } else { switch (*FPos) { case 's': { char *Str; if (NextArg->Typ->Base == TypePointer) Str = NextArg->Val->Pointer; else Str = &NextArg->Val->ArrayMem[0]; if (Str == NULL) { l = StrPutStr(str,"NULL");str+=l; } else { l = StrPutStr(str,Str);str+=l; } break; } case 'd': l = sprintf(str,"%d",ExpressionCoerceInteger(NextArg));str+=l; break; case 'u': l = sprintf(str,"%u",ExpressionCoerceUnsignedInteger(NextArg));str+=l; break; case 'x': l = sprintf(str,"%x",ExpressionCoerceUnsignedInteger(NextArg));str+=l; break; case 'b': l = sprintf(str,"%b",ExpressionCoerceUnsignedInteger(NextArg));str+=l; break; case 'c': l = sprintf(str,"%c",ExpressionCoerceUnsignedInteger(NextArg));str+=l; break; case 'f': l = sprintf(str,"%f",ExpressionCoerceFP(NextArg));str+=l; break; } } } ArgCount++; } } else { StrPutChar(str,*FPos);++str; } } }