int main(void) { char *buf, *p; char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE]; int n1=0, n2=0; /* Extract the two arguments */ if ((buf = getenv("QUERY_STRING")) != NULL) { p = strchr(buf, '&'); *p = '\0'; strcpy(arg1, buf); strcpy(arg2, p+1); n1 = atoi(trim_arg(arg1)); n2 = atoi(trim_arg(arg2)); } else { sprintf(content, "Welcome to add.com: "); } /* Make the response body */ sprintf(content, "%sThe Internet addition portal.\r\n<p>", content); sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>", content, n1, n2, n1 + n2); sprintf(content, "%sThanks for visiting!\r\n", content); /* Generate the HTTP response */ printf("Content-length: %d\r\n", strlen(content)); printf("Content-type: text/html\r\n\r\n"); printf("%s", content); fflush(stdout); exit(0); }
int font::load_desc() { int nfonts = 0; FILE *fp; char *path; if ((fp = open_file("DESC", &path)) == 0) { error("can't find `DESC' file"); return 0; } text_file t(fp, path); t.skip_comments = 1; res = 0; while (t.next()) { char *p = strtok(t.buf, WS); int found = 0; unsigned int idx; for (idx = 0; !found && idx < sizeof(table)/sizeof(table[0]); idx++) if (strcmp(table[idx].command, p) == 0) found = 1; if (found) { char *q = strtok(0, WS); if (!q) { t.error("missing value for command `%1'", p); return 0; } //int *ptr = &(this->*(table[idx-1].ptr)); int *ptr = table[idx-1].ptr; if (sscanf(q, "%d", ptr) != 1) { t.error("bad number `%1'", q); return 0; } } else if (strcmp("family", p) == 0) { p = strtok(0, WS); if (!p) { t.error("family command requires an argument"); return 0; } char *tem = new char[strlen(p)+1]; strcpy(tem, p); family = tem; } else if (strcmp("fonts", p) == 0) { p = strtok(0, WS); if (!p || sscanf(p, "%d", &nfonts) != 1 || nfonts <= 0) { t.error("bad number of fonts `%1'", p); return 0; } font_name_table = (const char **)new char *[nfonts+1]; for (int i = 0; i < nfonts; i++) { p = strtok(0, WS); while (p == 0) { if (!t.next()) { t.error("end of file while reading list of fonts"); return 0; } p = strtok(t.buf, WS); } char *temp = new char[strlen(p)+1]; strcpy(temp, p); font_name_table[i] = temp; } p = strtok(0, WS); if (p != 0) { t.error("font count does not match number of fonts"); return 0; } font_name_table[nfonts] = 0; } else if (strcmp("papersize", p) == 0) { p = strtok(0, WS); if (!p) { t.error("papersize command requires an argument"); return 0; } int found_paper = 0; while (p) { double unscaled_paperwidth, unscaled_paperlength; if (scan_papersize(p, &papersize, &unscaled_paperlength, &unscaled_paperwidth)) { paperwidth = int(unscaled_paperwidth * res + 0.5); paperlength = int(unscaled_paperlength * res + 0.5); found_paper = 1; break; } p = strtok(0, WS); } if (!found_paper) { t.error("bad paper size"); return 0; } } else if (strcmp("unscaled_charwidths", p) == 0) unscaled_charwidths = 1; else if (strcmp("pass_filenames", p) == 0) pass_filenames = 1; else if (strcmp("sizes", p) == 0) { int n = 16; sizes = new int[n]; int i = 0; for (;;) { p = strtok(0, WS); while (p == 0) { if (!t.next()) { t.error("list of sizes must be terminated by `0'"); return 0; } p = strtok(t.buf, WS); } int lower, upper; switch (sscanf(p, "%d-%d", &lower, &upper)) { case 1: upper = lower; // fall through case 2: if (lower <= upper && lower >= 0) break; // fall through default: t.error("bad size range `%1'", p); return 0; } if (i + 2 > n) { int *old_sizes = sizes; sizes = new int[n*2]; memcpy(sizes, old_sizes, n*sizeof(int)); n *= 2; a_delete old_sizes; } sizes[i++] = lower; if (lower == 0) break; sizes[i++] = upper; } if (i == 1) { t.error("must have some sizes"); return 0; } } else if (strcmp("styles", p) == 0) { int style_table_size = 5; style_table = (const char **)new char *[style_table_size]; int j; for (j = 0; j < style_table_size; j++) style_table[j] = 0; int i = 0; for (;;) { p = strtok(0, WS); if (p == 0) break; // leave room for terminating 0 if (i + 1 >= style_table_size) { const char **old_style_table = style_table; style_table_size *= 2; style_table = (const char **)new char*[style_table_size]; for (j = 0; j < i; j++) style_table[j] = old_style_table[j]; for (; j < style_table_size; j++) style_table[j] = 0; a_delete old_style_table; } char *tem = new char[strlen(p) + 1]; strcpy(tem, p); style_table[i++] = tem; } } else if (strcmp("tcommand", p) == 0) tcommand = 1; else if (strcmp("use_charnames_in_special", p) == 0) use_charnames_in_special = 1; else if (strcmp("image_generator", p) == 0) { p = strtok(0, WS); if (!p) { t.error("image_generator command requires an argument"); return 0; } image_generator = strsave(p); } else if (strcmp("charset", p) == 0) break; else if (unknown_desc_command_handler) { char *command = p; p = strtok(0, "\n"); (*unknown_desc_command_handler)(command, trim_arg(p), t.path, t.lineno); } } if (res == 0) { t.error("missing `res' command"); return 0; } if (unitwidth == 0) { t.error("missing `unitwidth' command"); return 0; } if (font_name_table == 0) { t.error("missing `fonts' command"); return 0; } if (sizes == 0) { t.error("missing `sizes' command"); return 0; } if (sizescale < 1) { t.error("bad `sizescale' value"); return 0; } if (hor < 1) { t.error("bad `hor' value"); return 0; } if (vert < 1) { t.error("bad `vert' value"); return 0; } return 1; }
int font::load(int *not_found, int head_only) { char *path; FILE *fp; if ((fp = open_file(name, &path)) == NULL) { if (not_found) *not_found = 1; else error("can't find font file `%1'", name); return 0; } text_file t(fp, path); t.skip_comments = 1; t.silent = head_only; char *p; for (;;) { if (!t.next()) { t.error("missing charset command"); return 0; } p = strtok(t.buf, WS); if (strcmp(p, "name") == 0) { } else if (strcmp(p, "spacewidth") == 0) { p = strtok(0, WS); int n; if (p == 0 || sscanf(p, "%d", &n) != 1 || n <= 0) { t.error("bad argument for spacewidth command"); return 0; } space_width = n; } else if (strcmp(p, "slant") == 0) { p = strtok(0, WS); double n; if (p == 0 || sscanf(p, "%lf", &n) != 1 || n >= 90.0 || n <= -90.0) { t.error("bad argument for slant command", p); return 0; } slant = n; } else if (strcmp(p, "ligatures") == 0) { for (;;) { p = strtok(0, WS); if (p == 0 || strcmp(p, "0") == 0) break; if (strcmp(p, "ff") == 0) ligatures |= LIG_ff; else if (strcmp(p, "fi") == 0) ligatures |= LIG_fi; else if (strcmp(p, "fl") == 0) ligatures |= LIG_fl; else if (strcmp(p, "ffi") == 0) ligatures |= LIG_ffi; else if (strcmp(p, "ffl") == 0) ligatures |= LIG_ffl; else { t.error("unrecognised ligature `%1'", p); return 0; } } } else if (strcmp(p, "internalname") == 0) { p = strtok(0, WS); if (!p) { t.error("`internalname command requires argument"); return 0; } internalname = new char[strlen(p) + 1]; strcpy(internalname, p); } else if (strcmp(p, "special") == 0) { special = 1; } else if (strcmp(p, "kernpairs") != 0 && strcmp(p, "charset") != 0) { char *command = p; p = strtok(0, "\n"); handle_unknown_font_command(command, trim_arg(p), t.path, t.lineno); } else break; } if (head_only) return 1; char *command = p; int had_charset = 0; t.skip_comments = 0; while (command) { if (strcmp(command, "kernpairs") == 0) { for (;;) { if (!t.next()) { command = 0; break; } char *c1 = strtok(t.buf, WS); if (c1 == 0) continue; char *c2 = strtok(0, WS); if (c2 == 0) { command = c1; break; } p = strtok(0, WS); if (p == 0) { t.error("missing kern amount"); return 0; } int n; if (sscanf(p, "%d", &n) != 1) { t.error("bad kern amount `%1'", p); return 0; } int i1 = name_to_index(c1); if (i1 < 0) { t.error("invalid character `%1'", c1); return 0; } int i2 = name_to_index(c2); if (i2 < 0) { t.error("invalid character `%1'", c2); return 0; } add_kern(i1, i2, n); } } else if (strcmp(command, "charset") == 0) { had_charset = 1; int last_index = -1; for (;;) { if (!t.next()) { command = 0; break; } char *nm = strtok(t.buf, WS); if (nm == 0) continue; // I dont think this should happen p = strtok(0, WS); if (p == 0) { command = nm; break; } if (p[0] == '"') { if (last_index == -1) { t.error("first charset entry is duplicate"); return 0; } if (strcmp(nm, "---") == 0) { t.error("unnamed character cannot be duplicate"); return 0; } int idx = name_to_index(nm); if (idx < 0) { t.error("invalid character `%1'", nm); return 0; } copy_entry(idx, last_index); } else { font_char_metric metric; metric.height = 0; metric.depth = 0; metric.pre_math_space = 0; metric.italic_correction = 0; metric.subscript_correction = 0; int nparms = sscanf(p, "%d,%d,%d,%d,%d,%d", &metric.width, &metric.height, &metric.depth, &metric.italic_correction, &metric.pre_math_space, &metric.subscript_correction); if (nparms < 1) { t.error("bad width for `%1'", nm); return 0; } p = strtok(0, WS); if (p == 0) { t.error("missing character type for `%1'", nm); return 0; } int type; if (sscanf(p, "%d", &type) != 1) { t.error("bad character type for `%1'", nm); return 0; } if (type < 0 || type > 255) { t.error("character type `%1' out of range", type); return 0; } metric.type = type; p = strtok(0, WS); if (p == 0) { t.error("missing code for `%1'", nm); return 0; } char *ptr; metric.code = (int)strtol(p, &ptr, 0); if (metric.code == 0 && ptr == p) { t.error("bad code `%1' for character `%2'", p, nm); return 0; } p = strtok(0, WS); if ((p == NULL) || (strcmp(p, "--") == 0)) { metric.special_device_coding = NULL; } else { char *nam = new char[strlen(p) + 1]; strcpy(nam, p); metric.special_device_coding = nam; } if (strcmp(nm, "---") == 0) { last_index = number_to_index(metric.code); add_entry(last_index, metric); } else { last_index = name_to_index(nm); if (last_index < 0) { t.error("invalid character `%1'", nm); return 0; } add_entry(last_index, metric); copy_entry(number_to_index(metric.code), last_index); } } } if (last_index == -1) { t.error("I didn't seem to find any characters"); return 0; } } else { t.error("unrecognised command `%1' after `kernpairs' or `charset' command", command); return 0; } } if (!had_charset) { t.error("missing charset command"); return 0; } if (space_width == 0) space_width = scale_round(unitwidth, res, 72*3*sizescale); compact(); return 1; }