Encode text as quoted printable.
151{
152 int c;
153 int linelen = 0;
154 char line[77] = { 0 };
155
157 {
158
159 if ((linelen == 76) && ((istext && (c != '\n')) || !istext))
160 {
161
162
163
164 if (line[linelen - 3] == '=')
165 {
166 line[linelen - 3] = 0;
167 fputs(line, fp_out);
168 fputs("=\n", fp_out);
169 line[linelen] = 0;
170 line[0] = '=';
171 line[1] = line[linelen - 2];
172 line[2] = line[linelen - 1];
173 linelen = 3;
174 }
175 else
176 {
177 char savechar = line[linelen - 1];
178 line[linelen - 1] = '=';
179 line[linelen] = 0;
180 fputs(line, fp_out);
181 fputc('\n', fp_out);
182 line[0] = savechar;
183 linelen = 1;
184 }
185 }
186
187
189 {
191 linelen = 6;
192 }
194 {
196 linelen = 6;
197 }
198 else if ((linelen == 1) && (line[0] == '.'))
199 {
201 linelen = 3;
202 }
203
204 if ((c == '\n') && istext)
205 {
206
207 if ((linelen > 0) && ((line[linelen - 1] == ' ') || (line[linelen - 1] == '\t')))
208 {
209 if (linelen < 74)
210 {
211 snprintf(line + linelen - 1, sizeof(line) - (linelen - 1), "=%2.2X",
212 (unsigned char) line[linelen - 1]);
213 fputs(line, fp_out);
214 }
215 else
216 {
217 int savechar2 = line[linelen - 1];
218
219 line[linelen - 1] = '=';
220 line[linelen] = 0;
221 fputs(line, fp_out);
222 fprintf(fp_out, "\n=%2.2X", (unsigned char) savechar2);
223 }
224 }
225 else
226 {
227 line[linelen] = 0;
228 fputs(line, fp_out);
229 }
230 fputc('\n', fp_out);
231 linelen = 0;
232 }
233 else if ((c != 9) && ((c < 32) || (c > 126) || (c == '=')))
234 {
235
236
237 if (linelen > 73)
238 {
239 line[linelen++] = '=';
240 line[linelen] = 0;
241 fputs(line, fp_out);
242 fputc('\n', fp_out);
243 linelen = 0;
244 }
245 snprintf(line + linelen, sizeof(line) - linelen, "=%2.2X", (unsigned char) c);
246 linelen += 3;
247 }
248 else
249 {
250
251
252 line[linelen++] = c;
253 }
254 }
255
256
257 if (linelen > 0)
258 {
259 if ((line[linelen - 1] == ' ') || (line[linelen - 1] == '\t'))
260 {
261
262 if (linelen < 74)
263 {
264 snprintf(line + linelen - 1, sizeof(line) - (linelen - 1), "=%2.2X",
265 (unsigned char) line[linelen - 1]);
266 }
267 else
268 {
269 char savechar = line[linelen - 1];
270 line[linelen - 1] = '=';
271 line[linelen] = 0;
272 fputs(line, fp_out);
273 fputc('\n', fp_out);
274 snprintf(line, sizeof(line), "=%2.2X", (unsigned char) savechar);
275 }
276 }
277 else
278 {
279 line[linelen] = 0;
280 }
281 fputs(line, fp_out);
282 }
283}
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)