📄 cgic.cpp
字号:
if (crCount || lfCount) {
int lfsAdd = crCount;
if (lfCount > crCount) {
lfsAdd = lfCount;
}
/* Stomp all newlines if desired */
if (!newlines) {
lfsAdd = 0;
}
while (lfsAdd) {
if (len >= avail) {
truncated = 1;
break;
}
*dp = 10;
dp++;
lfsAdd--;
len++;
}
crCount = 0;
lfCount = 0;
}
if (ch == '\0') {
/* The end of the source string */
break;
}
/* 1.06: check available space before adding
the character, because a previously added
LF may have brought us to the limit */
if (len >= avail) {
truncated = 1;
break;
}
*dp = ch;
dp++;
len++;
}
sp++;
}
*dp = '\0';
if (truncated) {
return cgiFormTruncated;
} else if (!len) {
return cgiFormEmpty;
} else {
return cgiFormSuccess;
}
}
static int cgiFirstNonspaceChar(char *s);
cgiFormResultType cgiFormInteger(
char *name, int *result, int defaultV) {
cgiFormEntry *e;
int ch;
e = cgiFormEntryFindFirst(name);
if (!e) {
*result = defaultV;
return cgiFormNotFound;
}
if (!strlen(e->value)) {
*result = defaultV;
return cgiFormEmpty;
}
ch = cgiFirstNonspaceChar(e->value);
if (!(isdigit(ch)) && (ch != '-') && (ch != '+')) {
*result = defaultV;
return cgiFormBadType;
} else {
*result = atoi(e->value);
return cgiFormSuccess;
}
}
cgiFormResultType cgiFormIntegerBounded(
char *name, int *result, int min, int max, int defaultV) {
cgiFormResultType error = cgiFormInteger(name, result, defaultV);
if (error != cgiFormSuccess) {
return error;
}
if (*result < min) {
*result = min;
return cgiFormConstrained;
}
if (*result > max) {
*result = max;
return cgiFormConstrained;
}
return cgiFormSuccess;
}
cgiFormResultType cgiFormDouble(
char *name, double *result, double defaultV) {
cgiFormEntry *e;
int ch;
e = cgiFormEntryFindFirst(name);
if (!e) {
*result = defaultV;
return cgiFormNotFound;
}
if (!strlen(e->value)) {
*result = defaultV;
return cgiFormEmpty;
}
ch = cgiFirstNonspaceChar(e->value);
if (!(isdigit(ch)) && (ch != '.') && (ch != '-') && (ch != '+')) {
*result = defaultV;
return cgiFormBadType;
} else {
*result = atof(e->value);
return cgiFormSuccess;
}
}
cgiFormResultType cgiFormDoubleBounded(
char *name, double *result, double min, double max, double defaultV) {
cgiFormResultType error = cgiFormDouble(name, result, defaultV);
if (error != cgiFormSuccess) {
return error;
}
if (*result < min) {
*result = min;
return cgiFormConstrained;
}
if (*result > max) {
*result = max;
return cgiFormConstrained;
}
return cgiFormSuccess;
}
cgiFormResultType cgiFormSelectSingle(
char *name, char **choicesText, int choicesTotal,
int *result, int defaultV)
{
cgiFormEntry *e;
int i;
e = cgiFormEntryFindFirst(name);
#ifdef CGICDEBUG
CGICDEBUGSTART
fprintf(dout, "%d\n", (int) e);
CGICDEBUGEND
#endif /* CGICDEBUG */
if (!e) {
*result = defaultV;
return cgiFormNotFound;
}
for (i=0; (i < choicesTotal); i++) {
#ifdef CGICDEBUG
CGICDEBUGSTART
fprintf(dout, "%s %s\n", choicesText[i], e->value);
CGICDEBUGEND
#endif /* CGICDEBUG */
if (cgiStrEq(choicesText[i], e->value)) {
#ifdef CGICDEBUG
CGICDEBUGSTART
fprintf(dout, "MATCH\n");
CGICDEBUGEND
#endif /* CGICDEBUG */
*result = i;
return cgiFormSuccess;
}
}
*result = defaultV;
return cgiFormNoSuchChoice;
}
cgiFormResultType cgiFormSelectMultiple(
char *name, char **choicesText, int choicesTotal,
int *result, int *invalid)
{
cgiFormEntry *e;
int i;
int hits = 0;
int invalidE = 0;
for (i=0; (i < choicesTotal); i++) {
result[i] = 0;
}
e = cgiFormEntryFindFirst(name);
if (!e) {
*invalid = invalidE;
return cgiFormNotFound;
}
do {
int hit = 0;
for (i=0; (i < choicesTotal); i++) {
if (cgiStrEq(choicesText[i], e->value)) {
result[i] = 1;
hits++;
hit = 1;
break;
}
}
if (!(hit)) {
invalidE++;
}
} while ((e = cgiFormEntryFindNext()) != 0);
*invalid = invalidE;
if (hits) {
return cgiFormSuccess;
} else {
return cgiFormNotFound;
}
}
cgiFormResultType cgiFormCheckboxSingle(
char *name)
{
cgiFormEntry *e;
e = cgiFormEntryFindFirst(name);
if (!e) {
return cgiFormNotFound;
}
return cgiFormSuccess;
}
extern cgiFormResultType cgiFormCheckboxMultiple(
char *name, char **valuesText, int valuesTotal,
int *result, int *invalid)
{
/* Implementation is identical to cgiFormSelectMultiple. */
return cgiFormSelectMultiple(name, valuesText,
valuesTotal, result, invalid);
}
cgiFormResultType cgiFormRadio(
char *name,
char **valuesText, int valuesTotal, int *result, int defaultV)
{
/* Implementation is identical to cgiFormSelectSingle. */
return cgiFormSelectSingle(name, valuesText, valuesTotal,
result, defaultV);
}
void cgiHeaderLocation(char *redirectUrl) {
fprintf(cgiOut, "Location: %s%c%c", redirectUrl, 10, 10);
}
void cgiHeaderStatus(int status, char *statusMessage) {
fprintf(cgiOut, "Status: %d %s%c%c", status, statusMessage,
10, 10);
}
void cgiHeaderContentType(char *mimeType) {
fprintf(cgiOut, "Content-type: %s%c%c", mimeType, 10, 10);
}
static int cgiWriteString(FILE *out, char *s);
static int cgiWriteInt(FILE *out, int i);
cgiEnvironmentResultType cgiWriteEnvironment(char *filename) {
FILE *out;
cgiFormEntry *e;
/* Be sure to open in binary mode */
out = fopen(filename, "wb");
if (!out) {
/* Can't create file */
return cgiEnvironmentIO;
}
if (!cgiWriteString(out, cgiServerSoftware)) {
goto error;
}
if (!cgiWriteString(out, cgiServerName)) {
goto error;
}
if (!cgiWriteString(out, cgiGatewayInterface)) {
goto error;
}
if (!cgiWriteString(out, cgiServerProtocol)) {
goto error;
}
if (!cgiWriteString(out, cgiServerPort)) {
goto error;
}
if (!cgiWriteString(out, cgiRequestMethod)) {
goto error;
}
if (!cgiWriteString(out, cgiPathInfo)) {
goto error;
}
if (!cgiWriteString(out, cgiPathTranslated)) {
goto error;
}
if (!cgiWriteString(out, cgiScriptName)) {
goto error;
}
if (!cgiWriteString(out, cgiQueryString)) {
goto error;
}
if (!cgiWriteString(out, cgiRemoteHost)) {
goto error;
}
if (!cgiWriteString(out, cgiRemoteAddr)) {
goto error;
}
if (!cgiWriteString(out, cgiAuthType)) {
goto error;
}
if (!cgiWriteString(out, cgiRemoteUser)) {
goto error;
}
if (!cgiWriteString(out, cgiRemoteIdent)) {
goto error;
}
if (!cgiWriteString(out, cgiContentType)) {
goto error;
}
if (!cgiWriteString(out, cgiAccept)) {
goto error;
}
if (!cgiWriteString(out, cgiUserAgent)) {
goto error;
}
if (!cgiWriteString(out, cgiReferrer)) {
goto error;
}
if (!cgiWriteInt(out, cgiContentLength)) {
goto error;
}
e = cgiFormEntryFirst;
while (e) {
if (!cgiWriteString(out, e->attr)) {
goto error;
}
if (!cgiWriteString(out, e->value)) {
goto error;
}
e = e->next;
}
fclose(out);
return cgiEnvironmentSuccess;
error:
fclose(out);
/* If this function is not defined in your system,
you must substitute the appropriate
file-deletion function. */
unlink(filename);
return cgiEnvironmentIO;
}
static int cgiWriteString(FILE *out, char *s) {
int len = strlen(s);
cgiWriteInt(out, len);
if (fwrite(s, 1, len, out) != len) {
return 0;
}
return 1;
}
static int cgiWriteInt(FILE *out, int i) {
if (!fwrite(&i, sizeof(int), 1, out)) {
return 0;
}
return 1;
}
static int cgiReadString(FILE *out, char **s);
static int cgiReadInt(FILE *out, int *i);
cgiEnvironmentResultType cgiReadEnvironment(char *filename) {
FILE *in;
cgiFormEntry *e, *p;
/* Free any existing data first */
cgiFreeResources();
/* Be sure to open in binary mode */
in = fopen(filename, "rb");
if (!in) {
/* Can't access file */
return cgiEnvironmentIO;
}
if (!cgiReadString(in, &cgiServerSoftware)) {
goto error;
}
if (!cgiReadString(in, &cgiServerName)) {
goto error;
}
if (!cgiReadString(in, &cgiGatewayInterface)) {
goto error;
}
if (!cgiReadString(in, &cgiServerProtocol)) {
goto error;
}
if (!cgiReadString(in, &cgiServerPort)) {
goto error;
}
if (!cgiReadString(in, &cgiRequestMethod)) {
goto error;
}
if (!cgiReadString(in, &cgiPathInfo)) {
goto error;
}
if (!cgiReadString(in, &cgiPathTranslated)) {
goto error;
}
if (!cgiReadString(in, &cgiScriptName)) {
goto error;
}
if (!cgiReadString(in, &cgiQueryString)) {
goto error;
}
if (!cgiReadString(in, &cgiRemoteHost)) {
goto error;
}
if (!cgiReadString(in, &cgiRemoteAddr)) {
goto error;
}
if (!cgiReadString(in, &cgiAuthType)) {
goto error;
}
if (!cgiReadString(in, &cgiRemoteUser)) {
goto error;
}
if (!cgiReadString(in, &cgiRemoteIdent)) {
goto error;
}
if (!cgiReadString(in, &cgiContentType)) {
goto error;
}
if (!cgiReadString(in, &cgiAccept)) {
goto error;
}
if (!cgiReadString(in, &cgiUserAgent)) {
goto error;
}
if (!cgiReadString(in, &cgiReferrer)) {
goto error;
}
if (!cgiReadInt(in, &cgiContentLength)) {
goto error;
}
p = 0;
while (1) {
e = (cgiFormEntry *) malloc(sizeof(cgiFormEntry));
if (!e) {
cgiFreeResources();
fclose(in);
return cgiEnvironmentMemory;
}
if (!cgiReadString(in, &e->attr)) {
/* This means we've reached the end of the list. */
free(e);
break;
}
if (!cgiReadString(in, &e->value)) {
free(e);
goto error;
}
e->next = 0;
if (p) {
p->next = e;
} else {
cgiFormEntryFirst = e;
}
p = e;
}
fclose(in);
cgiRestored = 1;
return cgiEnvironmentSuccess;
error:
cgiFreeResources();
fclose(in);
return cgiEnvironmentIO;
}
static int cgiReadString(FILE *in, char **s) {
int len;
cgiReadInt(in, &len);
*s = (char *) malloc(len + 1);
if (!(*s)) {
return 0;
}
if (fread(*s, 1, len, in) != len) {
return 0;
}
(*s)[len] = '\0';
return 1;
}
static int cgiReadInt(FILE *out, int *i) {
if (!fread(i, sizeof(int), 1, out)) {
return 0;
}
return 1;
}
static int cgiStrEqNc(char *s1, char *s2) {
while(1) {
if (!(*s1)) {
if (!(*s2)) {
return 1;
} else {
return 0;
}
} else if (!(*s2)) {
return 0;
}
if (isalpha(*s1)) {
if (tolower(*s1) != tolower(*s2)) {
return 0;
}
} else if ((*s1) != (*s2)) {
return 0;
}
s1++;
s2++;
}
}
static char *cgiFindTarget = 0;
static cgiFormEntry *cgiFindPos = 0;
static cgiFormEntry *cgiFormEntryFindFirst(char *name) {
cgiFindTarget = name;
cgiFindPos = cgiFormEntryFirst;
return cgiFormEntryFindNext();
}
static cgiFormEntry *cgiFormEntryFindNext() {
while (cgiFindPos) {
cgiFormEntry *c = cgiFindPos;
cgiFindPos = c->next;
if (!strcmp(c -> attr, cgiFindTarget)) {
return c;
}
}
return 0;
}
static int cgiFirstNonspaceChar(char *s) {
int len = strspn(s, " \n\r\t");
return s[len];
}
void cgiStringArrayFree(char **stringArray) {
char *p;
p = *stringArray;
while (p) {
free(p);
stringArray++;
p = *stringArray;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -