]> diplodocus.org Git - nmh/blob - sbr/fmt_new.c
3ad71b81cbf7883531157bdbf487cd95d4cca112
[nmh] / sbr / fmt_new.c
1 /*
2 * fmt_new.c -- read format file/string and normalize
3 *
4 * This code is Copyright (c) 2002, by the authors of nmh. See the
5 * COPYRIGHT file in the root directory of the nmh distribution for
6 * complete copyright information.
7 */
8
9 #include <h/mh.h>
10 #include <h/utils.h>
11
12 #define QUOTE '\\'
13
14 static char *formats = 0;
15
16 /*
17 * static prototypes
18 */
19 static void normalize (char *);
20
21
22 /*
23 * Get new format string
24 */
25
26 char *
27 new_fs (char *form, char *format, char *default_fs)
28 {
29 struct stat st;
30 FILE *fp;
31
32 mh_xfree(formats);
33
34 if (form) {
35 if ((fp = fopen (etcpath (form), "r")) == NULL)
36 adios (form, "unable to open format file");
37
38 if (fstat (fileno (fp), &st) == -1)
39 adios (form, "unable to stat format file");
40
41 formats = mh_xmalloc ((size_t) st.st_size + 1);
42
43 if (read (fileno(fp), formats, (int) st.st_size) != st.st_size)
44 adios (form, "error reading format file");
45
46 formats[st.st_size] = '\0';
47
48 fclose (fp);
49 } else {
50 formats = getcpy (format ? format : default_fs);
51 }
52
53 normalize (formats); /* expand escapes */
54
55 return formats;
56 }
57
58
59 void
60 free_fs (){
61 free (formats);
62 formats = 0;
63 }
64
65
66 /*
67 * Expand escapes in format strings
68 */
69
70 static void
71 normalize (char *cp)
72 {
73 char *dp;
74
75 for (dp = cp; *cp; cp++) {
76 if (*cp != QUOTE) {
77 *dp++ = *cp;
78 } else {
79 switch (*++cp) {
80 case 'b':
81 *dp++ = '\b';
82 break;
83
84 case 'f':
85 *dp++ = '\f';
86 break;
87
88 case 'n':
89 *dp++ = '\n';
90 break;
91
92 case 'r':
93 *dp++ = '\r';
94 break;
95
96 case 't':
97 *dp++ = '\t';
98 break;
99
100 case '\n':
101 break;
102
103 case 0:
104 cp--;
105 /* FALLTHRU */
106 default:
107 *dp++ = *cp;
108 break;
109 }
110 }
111 }
112 *dp = '\0';
113 }