static int getVars(char ***cgiKeys, char *buf, size_t buflen) { char **keyList, *eq, *cp, *pp, *newbuf; int i, keyCount; if (buflen > 0) { if ((newbuf = malloc(buflen + 1)) == 0) { error("Can't allocate memory"); return 0; } strncpy(newbuf, buf, buflen); newbuf[buflen] = '\0'; buf = newbuf; } /* Change all plus signs back to spaces */ keyCount = (buflen > 0) ? 1 : 0; for (cp = buf; cp < &buf[buflen]; cp++) { if (*cp == '+') { *cp = ' '; } else if (*cp == '&') { keyCount++; } } if (keyCount == 0) { return 0; } /* Crack the input into name/value pairs */ keyList = malloc((keyCount * 2) * sizeof(char**)); i = 0; for (pp = strtok(buf, "&"); pp; pp = strtok(0, "&")) { if ((eq = strchr(pp, '=')) != 0) { *eq++ = '\0'; descape(pp); descape(eq); } else { descape(pp); } if (i < (keyCount * 2)) { keyList[i++] = pp; keyList[i++] = eq; } } *cgiKeys = keyList; return keyCount; }
int main( int argc, char **argv ) { int i = 1, j = 0, sch = 0; while ( i < argc ) { if ( (argv[i][0] == '-') && isin(argv[i][1],"en-") && getopts(argv[i]+1) ) i++; if ( stopargs ) break; } char skip = 0; while ( i < argc ) { if ( !(opt&O_ESC) ) { fputs(argv[i],stdout); putchar(((i+1)==argc)?((opt&O_NONL)?'\0':'\n'):' '); i++; continue; } j = skip = 0; while ( !skip ) { sch = descape(argv[i]+j); j += sch; if ( sch == -1 ) return 0; if ( !sch ) skip = 1; } putchar((i<(argc-1))?' ':'\n'); i++; } return 0; }
static int getVars(MprCtx ctx, char ***cgiKeys, char *buf, int buflen) { char **keyList; char *eq, *cp, *pp; int i, keyCount; /* * Change all plus signs back to spaces */ keyCount = (buflen > 0) ? 1 : 0; for (cp = buf; cp < &buf[buflen]; cp++) { if (*cp == '+') { *cp = ' '; } else if (*cp == '&') { keyCount++; } } if (keyCount == 0) { return 0; } /* * Crack the input into name/value pairs */ keyList = (char**) mprAlloc(ctx, (keyCount * 2) * (int) sizeof(char**)); i = 0; for (pp = strtok(buf, "&"); pp; pp = strtok(0, "&")) { if ((eq = strchr(pp, '=')) != 0) { *eq++ = '\0'; descape(pp); descape(eq); } else { descape(pp); } if (i < (keyCount * 2)) { keyList[i++] = pp; keyList[i++] = eq; } } *cgiKeys = keyList; return keyCount; }
/* If there is a HTTP_SWITCHES argument in the query string, examine that instead of the original argv */ static int getArgv(int *pargc, char ***pargv, int originalArgc, char **originalArgv) { char *switches, *next, sbuf[1024]; int i; *pargc = 0; if (getQueryString(&queryBuf, &queryLen) < 0) { return -1; } numQueryKeys = getVars(&queryKeys, queryBuf, queryLen); switches = 0; for (i = 0; i < numQueryKeys; i += 2) { if (strcmp(queryKeys[i], "HTTP_SWITCHES") == 0) { switches = queryKeys[i+1]; break; } } if (switches == 0) { switches = getenv("HTTP_SWITCHES"); } if (switches) { strncpy(sbuf, switches, sizeof(sbuf) - 1); descape(sbuf); next = strtok(sbuf, " \t\n"); i = 1; for (i = 1; next && i < (MAX_ARGV - 1); i++) { argvList[i] = next; next = strtok(0, " \t\n"); } argvList[0] = originalArgv[0]; *pargv = argvList; *pargc = i; } else { *pargc = originalArgc; *pargv = originalArgv; } return 0; }
int main( void ) { int prec[ 2 ], pstc[ 2 ]; // PRE-Conversion, POST-Conversion int cnvstt = DFLT; // CoNVersion STaTe while( ( prec[ 1 ] = getchar() ) != EOF ) { /* Reads ahead if the latest input character is a '\' */ if( prec[ 1 ] == '\\' ) { prec[ 0 ] = prec[ 1 ]; if( ( prec[ 1 ] = getchar() ) == EOF ) // prevents overflow { putchar( prec[ 0 ] ); break; } } /* Determines conversion state: escape character to literal representation, or vice versa */ if( cnvstt == DFLT ) { if( prec[ 0 ] == '\\' ) { switch( prec[ 1 ] ) { case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v': case '?': case '\'': case '"': cnvstt = LR2EC; } } else { switch( prec[ 1 ] ) { case '\a': case '\b': case '\f': case '\n': case '\r': case '\t': case '\v': case '\?': case '\'': case '\"': cnvstt = EC2LR; } } } /* Prints output */ if( prec[ 0 ] == '\\' ) { if( descape( prec, pstc ) && cnvstt == LR2EC ) { putchar( pstc[ 1 ] ); } else { printf( "%c%c", pstc[ 0 ], pstc[ 1 ] ); } prec[ 0 ] = 'X'; // prec[ 0 ] must be set to anything but '\\' } else if( cnvstt == EC2LR && escape( prec, pstc ) ) { printf( "%c%c", pstc[ 0 ], pstc[ 1 ] ); } else { putchar( prec[ 1 ] ); } } return 0; }