/* returns number of bytes read */ static Buff *read_text_file(Buff *text_buffer, const char *filename) { FILE *file; Buff *line = NULL; buff_free(text_buffer); file = fopen(filename, "r"); if (file != NULL) { while (!feof(file)) { line = get_line(line, file); if(line == NULL){ text_buffer = buff_add(text_buffer, "\r\n"); continue; } /* translate for posting */ if (line->data[0] == '.') text_buffer = buff_add(text_buffer, "."); text_buffer = buff_add(text_buffer, "%s", line->data); if(text_buffer->data[(text_buffer->length - 1)] == '\r') text_buffer = buff_add(text_buffer, "\n"); else text_buffer = buff_add(text_buffer, "\r\n"); } fclose(file); } return text_buffer; }
static Buff *make_subject(Buff *subject, newspost_data *data, int filenumber, int number_of_files, const char *filename, int partnumber, int number_of_parts, const char *filestring) { char numbuf[32]; int numsize; if (data->subject != NULL) subject = buff_create(subject, "%s - ", data->subject->data); else subject = buff_create(subject, ""); if (data->filenumber == TRUE){ sprintf(numbuf, "%i", number_of_files); numsize = strlen(numbuf); subject = buff_add(subject, "%s %0*i of %i: ", filestring, numsize, filenumber, number_of_files); } sprintf(numbuf, "%i", number_of_parts); numsize = strlen(numbuf); subject = buff_add(subject, (data->yenc == TRUE) ? "\"%s\" yEnc (%0*i/%i)" : "%s (%0*i/%i)", n_basename(filename), numsize, partnumber, number_of_parts); return subject; }
/* Note: the given strings are modified in place */ static char *parse_epsf_special(EpsfBox *box, char **ret, char *prefix, char *arg) { static struct { char *name; int has_arg; char *value; } keys[] = { {"llx", 1, "0"}, {"lly", 1, "0"}, {"urx", 1, "0"}, {"ury", 1, "0"}, {"rwi", 1, "0"}, {"rhi", 1, "0"}, {"hoffset", 1, "0"}, {"voffset", 1, "0"}, {"hsize", 1, "612"}, {"vsize", 1, "792"}, {"hscale", 1, "100"}, {"vscale", 1, "100"}, {"angle", 1, "0"}, {"clip", 0, "0"} }; #define NKEYS (sizeof(keys) / sizeof(keys[0])) char *ptr; char *filename; double value[NKEYS]; Uchar present[NKEYS]; Buffer buffer; char *name; int i; double originx; double originy; double hsize; double vsize; double hscale; double vscale; /* this special has the form * ["]file.ps["] [key=valye]* */ /* scan the filename */ while(*arg == ' ' || *arg == '\t') arg++; /* make a copy of the string */ ptr = arg; if(*ptr == '"') for(name = ++ptr; *ptr && *ptr != '"'; ptr++); else for(name = ptr; *ptr && *ptr != ' ' && *ptr != '\t'; ptr++); if(ptr == name) return NULL; *ptr++ = 0; filename = name; /* reset values to defaults */ for(i = 0; i < NKEYS; i++) { value[i] = atof(keys[i].value); present[i] = 0; } buff_init(&buffer); buff_add(&buffer, "@beginspecial ", 0); while(*ptr) { const char *keyname; char *val; char *p; while(*ptr == ' ' || *ptr == '\t') ptr++; keyname = ptr; /* get the whole key=value pair */ for(; *ptr && *ptr != ' ' && *ptr != '\t'; ptr++); if(*ptr) *ptr++ = 0; /* now we shouldn't touch `ptr' anymore */ /* now work on this pair */ p = strchr(keyname, '='); if(p == NULL) val = NULL; else { *p++ = 0; if(*p == '"') { val = ++p; /* skip until closing quote */ while(*p && *p != '"') p++; if(*p != '"') mdvi_warning( _("%s: malformed value for key `%s'\n"), filename, keyname); } else val = p; } /* lookup the key */ for(i = 0; i < NKEYS; i++) if(STRCEQ(keys[i].name, keyname)) break; if(i == NKEYS) { mdvi_warning(_("%s: unknown key `%s' ignored\n"), filename, keyname); continue; } if(keys[i].has_arg && val == NULL) { mdvi_warning(_("%s: no argument for key `%s', using defaults\n"), filename, keyname); val = keys[i].value; } else if(!keys[i].has_arg && val) { mdvi_warning(_("%s: argument `%s' ignored for key `%s'\n"), filename, val, keyname); val = NULL; } if(val) value[i] = atof(val); /* put the argument */ buff_add(&buffer, val, 0); buff_add(&buffer, " @", 2); buff_add(&buffer, keyname, 0); buff_add(&buffer, " ", 1); /* remember that this option was given */ present[i] = 0xff; } buff_add(&buffer, " @setspecial", 0); /* now compute the bounding box (code comes from dvips) */ originx = 0; originy = 0; hscale = 1; vscale = 1; hsize = 0; vsize = 0; if(present[HSIZE]) hsize = value[HSIZE]; if(present[VSIZE]) vsize = value[VSIZE]; if(present[HOFF]) originx = value[HOFF]; if(present[VOFF]) originy = value[VOFF]; if(present[HSCALE]) hscale = value[HSCALE] / 100.0; if(present[VSCALE]) vscale = value[VSCALE] / 100.0; if(present[URX] && present[LLX]) hsize = value[URX] - value[LLX]; if(present[URY] && present[LLY]) vsize = value[URY] - value[LLY]; if(present[RWI] || present[RHI]) { if(present[RWI] && !present[RHI]) hscale = vscale = value[RWI] / (10.0 * hsize); else if(present[RHI] && !present[RWI]) hscale = vscale = value[RHI] / (10.0 * vsize); else { hscale = value[RWI] / (10.0 * hsize); vscale = value[RHI] / (10.0 * vsize); } } box->ox = originx; box->oy = originy; box->bw = hsize * hscale; box->bh = vsize * vscale; box->angle = value[ANGLE]; *ret = buffer.data; return filename; }