char *HTTPQuote(char *RetBuff, char *Str) { char *RetStr=NULL, *Token=NULL, *ptr; int olen=0, ilen; RetStr=CopyStr(RetStr,""); ilen=StrLen(Str); for (ptr=Str; ptr < (Str+ilen); ptr++) { switch (*ptr) { case ' ': RetStr=AddCharToStr(RetStr,'+'); break; case '(': case ')': case '[': case ']': case '{': case '}': case '\t': case '?': case '&': case '!': case ',': case '+': case '\'': case ':': case ';': case '/': case '\r': case '\n': Token=FormatStr(Token,"%%%02X",*ptr); RetStr=CatStr(RetStr,Token); olen+=StrLen(Token); break; default: // RetStr=AddCharToBuffer(RetStr,olen,*ptr); RetStr=AddCharToStr(RetStr,*ptr); olen++; break; } } DestroyString(Token); return(RetStr); }
char *HTMLQuote(char *RetBuff, char *Str) { char *RetStr=NULL, *Token=NULL, *ptr; int len; RetStr=CopyStr(RetStr,""); len=StrLen(Str); for (ptr=Str; ptr < (Str+len); ptr++) { switch (*ptr) { case '&': RetStr=CatStr(RetStr,"&"); break; case '<': RetStr=CatStr(RetStr,"<"); break; case '>': RetStr=CatStr(RetStr,">"); break; default: RetStr=AddCharToStr(RetStr,*ptr); break; } } DestroyString(Token); return(RetStr); }
char *SlashTerminateDirectoryPath(char *DirPath) { char *ptr, *RetStr=NULL; if (! DirPath) return(CopyStr(DirPath,"/")); RetStr=DirPath; ptr=RetStr+StrLen(RetStr)-1; if (*ptr != '/') RetStr=AddCharToStr(RetStr,'/'); return(RetStr); }
char *ParseVar(char *Buff, const char **Line, ListNode *LocalVars, int Flags) { char *VarName=NULL, *OutStr=NULL, *Tempstr=NULL; const char *ptr, *vptr; OutStr=Buff; ptr=*Line; if (*ptr=='(') ptr++; while ((*ptr !=')') && (*ptr !='\0')) { if (*ptr=='$') { ptr++; Tempstr=ParseVar(Tempstr,&ptr,LocalVars,Flags); VarName=CatStr(VarName,Tempstr); } else VarName=AddCharToStr(VarName,*ptr); ptr++; } *Line=ptr; //very important! Otherwise the calling process will not //know we have consumed some of the text! //Now lookup var/format/append to output if (! (Flags & SUBS_CASE_VARNAMES)) strlwr(VarName); vptr=GetVar(LocalVars,VarName); if (Flags & SUBS_QUOTE_VARS) OutStr=CatStr(OutStr,"'"); if (Flags & SUBS_STRIP_VARS_WHITESPACE) { Tempstr=CopyStr(Tempstr,vptr); StripTrailingWhitespace(Tempstr); StripLeadingWhitespace(Tempstr); OutStr=CatStr(OutStr,Tempstr); } else OutStr=CatStr(OutStr, vptr); if (Flags & SUBS_QUOTE_VARS) OutStr=CatStr(OutStr,"'"); DestroyString(VarName); DestroyString(Tempstr); return(OutStr); }
//This parses those actions that take a string static const char *ParseStringAction(const char *Line, int Type, TCrayon *Crayon) { TCrayon *Action; char *Token=NULL; const char *ptr, *sptr; ptr=GetToken(Line," ",&Token,GETTOKEN_QUOTES); Action=NewCrayonAction(Crayon,Type); for (sptr=Token; *sptr != '\0'; sptr++) { if (*sptr=='\\') { sptr++; switch (*sptr) { case 'a': Action->String=AddCharToStr(Action->String,0x07); break; case 'b': Action->String=AddCharToStr(Action->String,0x08); break; case 'c': sptr++; if ((*sptr > 64) && (*sptr < 91)) Action->String=AddCharToStr(Action->String,*sptr-64); if ((*sptr > 96) && (*sptr < 123)) Action->String=AddCharToStr(Action->String,*sptr-96); break; case 'n': Action->String=AddCharToStr(Action->String,'\n'); break; case 'r': Action->String=AddCharToStr(Action->String,'\r'); break; case 't': Action->String=AddCharToStr(Action->String,' '); break; default: Action->String=AddCharToStr(Action->String, *sptr); break; } } else Action->String=AddCharToStr(Action->String, *sptr); } Destroy(Token); return(ptr); }
char *SubstituteVarsInString(char *Buffer, const char *Fmt, ListNode *Vars, int Flags) { char *ReturnStr=NULL, *VarName=NULL, *Tempstr=NULL; const char *FmtPtr; int count, VarIsPointer=FALSE; ListNode *Curr; int len=0, i; ReturnStr=CopyStr(Buffer,""); if (! Fmt) return(ReturnStr); FmtPtr=Fmt; while (*FmtPtr !=0) { switch (*FmtPtr) { case '\\': FmtPtr++; switch (*FmtPtr) { case 't': ReturnStr=AddCharToStr(ReturnStr,' '); len=StrLen(ReturnStr); while ((len % 4) !=0) { ReturnStr=AddCharToStr(ReturnStr,' '); len++; } break; case 'r': ReturnStr=AddCharToStr(ReturnStr,'\r'); len++; break; case 'n': ReturnStr=AddCharToStr(ReturnStr,'\n'); len++; break; default: ReturnStr=AddCharToStr(ReturnStr,*FmtPtr); len++; } break; case '$': FmtPtr++; /* if (*FmtPtr=='$') { VarIsPointer=TRUE; FmtPtr++; } if (*FmtPtr=='(') FmtPtr++; */ ReturnStr=ParseVar(ReturnStr, &FmtPtr, Vars, Flags); break; case '"': FmtPtr++; while (*FmtPtr && (*FmtPtr !='"')) { ReturnStr=AddCharToStr(ReturnStr,*FmtPtr); len++; FmtPtr++; } break; default: ReturnStr=AddCharToStr(ReturnStr,*FmtPtr); len++; } FmtPtr++; } DestroyString(Tempstr); DestroyString(VarName); return(ReturnStr); }