#include #include #include void die(char *msg) { fprintf(stderr, "%s\n", msg); exit(1); } #define TEMPLATE_MAXLEN 10100 char template[TEMPLATE_MAXLEN]; void read_template(void) { int stop = 0; size_t pos = 0; while (!stop) { if ( TEMPLATE_MAXLEN - pos < 2 || !fgets(template + pos, TEMPLATE_MAXLEN - pos, stdin) ) die("error reading template"); if ('$' == template[pos]) stop = 1; else pos += strlen(template + pos); } } #define LINE_MAXLEN 4010 char line[LINE_MAXLEN]; int more_mail(void) { if (!fgets(line, LINE_MAXLEN, stdin)) die("error reading record head"); if ('0' == line[0]) return 0; if ('1' == line[0]) return 1; die("error: record head has wrong format"); } void process_mail(void) { size_t pos; size_t len; for (pos = 0; '$' != template[pos]; pos++) { if ('@' == template[pos]) { if ('i' != template[++pos]) die("error: field marker has wrong format"); if (!fgets(line, LINE_MAXLEN, stdin)) die("error reading record body"); len = strlen(line); line[len - 1] = 0; fputs(line, stdout); } else putchar(template[pos]); } } int main(void) { read_template(); while (more_mail()) process_mail(); return 0; }