#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ccgi.h> extern char **environ; #ifdef _WIN32 #define EOL "\n" #else #define EOL "\r\n" #endif int alpha_cmp(const void *a, const void *b) { return strcmp(*(const char **) a, *(const char **) b); } int main(void) { puts("Content-Type: text/html" EOL "Status: 201 Created" EOL EOL); puts("<pre>" EOL "<h1>Environment</h1>" EOL); { const char *sorted_env[500]; size_t i, num_env; for (num_env = 0; environ[num_env] != 0; num_env++) { sorted_env[num_env] = environ[num_env]; } qsort(sorted_env, num_env, sizeof(const char *), alpha_cmp); for (i = 0; i < num_env; i++) { printf("E: %s" EOL, sorted_env[i]); } } puts(EOL "<h1>Query string</h1>" EOL); { const char *k; CGI_varlist *vl = CGI_get_query(NULL); for (k = CGI_first_name(vl); k != NULL; k = CGI_next_name(vl)) { printf("Q: %s=%s" EOL, k, CGI_lookup(vl, k)); } CGI_free_varlist(vl); } puts(EOL "<h1>Form variables</h1>" EOL); { const char *k; CGI_varlist *vl = CGI_get_post(NULL, NULL); for (k = CGI_first_name(vl); k != NULL; k = CGI_next_name(vl)) { printf("P: %s=%s" EOL, k, CGI_lookup(vl, k)); } CGI_free_varlist(vl); } puts(EOL "</pre>" EOL); return 0; } /* Some functions for libccgi that are missing on Windows (VC6). */ #ifdef _WIN32 static int lowercase(const char *s) { return tolower(*(const unsigned char *) s); } int strncasecmp(const char *s1, const char *s2, size_t len) { int diff = 0; if (len > 0) do { diff = lowercase(s1++) - lowercase(s2++); } while (diff == 0 && s1[-1] != '\0' && --len > 0); return diff; } int strcasecmp(const char *s1, const char *s2) { return strncasecmp(s1, s2, (size_t) ~0); } int mkstemp(char *template) { return -1; /* Not used by us. */ } #endif