7905463836
* mfmt.c (main): When there are an even number of empty lines between messages, all goes well, but when the number of empty lines between messages is odd, the program fails. Sun Oct 11 20:11:16 1998 Norbert Warmuth <nwarmuth@privat.circular.de> * setup.c: Option ftpfs_use_unix_list_options was saved from and restored to the wrong variable (ftpfs_use_passive_connections).
156 строки
2.3 KiB
C
156 строки
2.3 KiB
C
/* mfmt: sets bold and underline for mail files */
|
|
/* (c) 1995 miguel de icaza */
|
|
|
|
#include <stdio.h>
|
|
|
|
enum states {
|
|
header,
|
|
definition,
|
|
plain,
|
|
newline,
|
|
seen_f,
|
|
seen_r,
|
|
seen_o,
|
|
header_new,
|
|
seen_m
|
|
};
|
|
|
|
void
|
|
omain (void)
|
|
{
|
|
enum states state = header;
|
|
int prev = 0;
|
|
int c;
|
|
|
|
while ((c = getchar ()) != EOF){
|
|
if (c != '\n'){
|
|
switch (state){
|
|
case header:
|
|
putchar ('_');
|
|
putchar ('\b');
|
|
break;
|
|
|
|
case definition:
|
|
putchar (c);
|
|
putchar ('\b');
|
|
break;
|
|
default:
|
|
break; /* inhibit compiler warnings */
|
|
}
|
|
}
|
|
putchar (c);
|
|
if ((state != plain) && c == ':')
|
|
state = definition;
|
|
|
|
if (c == '\n' && prev == '\n')
|
|
state = plain;
|
|
|
|
if (state == definition && c == '\n')
|
|
state = header;
|
|
|
|
prev = c;
|
|
}
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
int state = newline;
|
|
int space_seen;
|
|
int c;
|
|
|
|
while ((c = getchar ()) != EOF){
|
|
switch (state){
|
|
case plain:
|
|
if (c == '\n')
|
|
state = newline;
|
|
putchar (c);
|
|
break;
|
|
|
|
case newline:
|
|
if (c == 'F')
|
|
state = seen_f;
|
|
else if (c == '\n')
|
|
putchar ('\n');
|
|
else {
|
|
state = plain;
|
|
putchar (c);
|
|
}
|
|
break;
|
|
|
|
case seen_f:
|
|
if (c == 'r')
|
|
state = seen_r;
|
|
else {
|
|
printf ("F%c", c);
|
|
state = plain;
|
|
}
|
|
break;
|
|
|
|
case seen_r:
|
|
if (c == 'o')
|
|
state = seen_o;
|
|
else {
|
|
state = plain;
|
|
printf ("Fr%c", c);
|
|
}
|
|
break;
|
|
|
|
case seen_o:
|
|
if (c == 'm'){
|
|
state = seen_m;
|
|
} else {
|
|
state = plain;
|
|
printf ("Fro%c", c);
|
|
}
|
|
break;
|
|
|
|
case seen_m:
|
|
if (c == ' '){
|
|
state = definition;
|
|
printf ("_\bF_\br_\bo_\bm ");
|
|
} else {
|
|
state = plain;
|
|
printf ("From%c", c);
|
|
}
|
|
break;
|
|
|
|
case header_new:
|
|
space_seen = 0;
|
|
if (c == ' ' || c == '\t') {
|
|
state = definition;
|
|
putchar (c);
|
|
break;
|
|
}
|
|
if (c == '\n'){
|
|
state = plain;
|
|
putchar (c);
|
|
break;
|
|
}
|
|
|
|
case header:
|
|
if (c == '\n'){
|
|
putchar (c);
|
|
state = header_new;
|
|
break;
|
|
}
|
|
printf ("_\b%c", c);
|
|
if (c == ' ')
|
|
space_seen = 1;
|
|
if (c == ':' && !space_seen)
|
|
state = definition;
|
|
break;
|
|
|
|
case definition:
|
|
if (c == '\n'){
|
|
putchar (c);
|
|
state = header_new;
|
|
break;
|
|
}
|
|
printf ("%c\b%c", c, c);
|
|
break;
|
|
}
|
|
}
|
|
return (0);
|
|
}
|