annotate src/misc.c @ 1591:cf7f2d3312fb

trim some spaces
author corvid <corvid@lavabit.com>
date Sat, 27 Feb 2010 05:19:43 +0000
parents 328111d18d57
children f4a6b351012d
rev   line source
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
1 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
2 * File: misc.c
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
3 *
35
d9e7b35430de Updated copyright lines
jcid
parents: 0
diff changeset
4 * Copyright (C) 2000 Jörgen Viksell <vsksga@hotmail.com>
d9e7b35430de Updated copyright lines
jcid
parents: 0
diff changeset
5 * Copyright (C) 2000-2007 Jorge Arellano Cid <jcid@dillo.org>,
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
6 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
9 * the Free Software Foundation; either version 3 of the License, or
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
10 * (at your option) any later version.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
11 */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
12
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
13 #include <stdio.h>
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
14 #include <stdlib.h>
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
15 #include <string.h>
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
16 #include <ctype.h>
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
17 #include <assert.h>
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
18
1128
fbe2ce98a4b8 make tab expansion for plain text utf8 aware
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 930
diff changeset
19 #include "utf8.hh"
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
20 #include "msg.h"
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
21 #include "misc.h"
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
22
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
23 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
24 * Escape characters as %XX sequences.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
25 * Return value: New string.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
26 */
306
7a76f872ce73 - Eliminated gcc 4.2.3 warnings on 64bit OS.
jcid
parents: 274
diff changeset
27 char *a_Misc_escape_chars(const char *str, const char *esc_set)
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
28 {
1141
corvid <corvid@lavabit.com>
parents: 1128
diff changeset
29 static const char *const hex = "0123456789ABCDEF";
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
30 char *p = NULL;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
31 Dstr *dstr;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
32 int i;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
33
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
34 dstr = dStr_sized_new(64);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
35 for (i = 0; str[i]; ++i) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
36 if (str[i] <= 0x1F || str[i] == 0x7F || strchr(esc_set, str[i])) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
37 dStr_append_c(dstr, '%');
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
38 dStr_append_c(dstr, hex[(str[i] >> 4) & 15]);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
39 dStr_append_c(dstr, hex[str[i] & 15]);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
40 } else {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
41 dStr_append_c(dstr, str[i]);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
42 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
43 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
44 p = dstr->str;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
45 dStr_free(dstr, FALSE);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
46
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
47 return p;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
48 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
49
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
50 #define TAB_SIZE 8
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
51 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
52 * Takes a string and converts any tabs to spaces.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
53 */
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
54 int
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
55 a_Misc_expand_tabs(char **start, char *end, char *buf, int buflen)
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
56 {
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
57 int j, pos = 0, written = 0, old_pos, char_len;
1128
fbe2ce98a4b8 make tab expansion for plain text utf8 aware
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 930
diff changeset
58 uint_t code;
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
59 static const int combining_char_space = 32;
1128
fbe2ce98a4b8 make tab expansion for plain text utf8 aware
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 930
diff changeset
60
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
61 while (*start < end && written < buflen - TAB_SIZE - combining_char_space) {
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
62 code = a_Utf8_decode(*start, end, &char_len);
1160
ea163ab97e87 faster expand tabs
corvid <corvid@lavabit.com>
parents: 1145
diff changeset
63
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
64 if (code == '\t') {
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
65 /* Fill with whitespaces until the next tab. */
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
66 old_pos = pos;
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
67 pos += TAB_SIZE - (pos % TAB_SIZE);
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
68 for (j = old_pos; j < pos; j++)
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
69 buf[written++] = ' ';
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
70 } else {
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
71 assert(char_len <= 4);
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
72 for (j = 0; j < char_len; j++)
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
73 buf[written++] = (*start)[j];
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
74 pos++;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
75 }
1128
fbe2ce98a4b8 make tab expansion for plain text utf8 aware
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 930
diff changeset
76
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
77 *start += char_len;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
78 }
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
79
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
80 /* If following chars are combining chars (e.g. accents) add them to the
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
81 * buffer. We have reserved combining_char_space bytes for this.
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
82 * If there should be more combining chars, we split nevertheless.
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
83 */
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
84 while (*start < end && written < buflen - 4) {
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
85 code = a_Utf8_decode(*start, end, &char_len);
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
86
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
87 if (! a_Utf8_combining_char(code))
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
88 break;
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
89
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
90 assert(char_len <= 4);
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
91 for (j = 0; j < char_len; j++)
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
92 buf[written++] = (*start)[j];
1591
cf7f2d3312fb trim some spaces
corvid <corvid@lavabit.com>
parents: 1453
diff changeset
93
1453
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
94 *start += char_len;
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
95 }
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
96
328111d18d57 respect UTF-8 when splitting long lines in plain.cc (noticed by corvid)
Johannes Hofmann <Johannes.Hofmann@gmx.de>
parents: 1317
diff changeset
97 return written;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
98 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
99
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
100 /* TODO: could use dStr ADT! */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
101 typedef struct ContentType_ {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
102 const char *str;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
103 int len;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
104 } ContentType_t;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
105
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
106 static const ContentType_t MimeTypes[] = {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
107 { "application/octet-stream", 24 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
108 { "text/html", 9 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
109 { "text/plain", 10 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
110 { "image/gif", 9 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
111 { "image/png", 9 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
112 { "image/jpeg", 10 },
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
113 { NULL, 0 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
114 };
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
115
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
116 typedef enum {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
117 DT_OCTET_STREAM = 0,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
118 DT_TEXT_HTML,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
119 DT_TEXT_PLAIN,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
120 DT_IMAGE_GIF,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
121 DT_IMAGE_PNG,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
122 DT_IMAGE_JPG,
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
123 } DetectedContentType;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
124
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
125 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
126 * Detects 'Content-Type' from a data stream sample.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
127 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
128 * It uses the magic(5) logic from file(1). Currently, it
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
129 * only checks the few mime types that Dillo supports.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
130 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
131 * 'Data' is a pointer to the first bytes of the raw data.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
132 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
133 * Return value: (0 on success, 1 on doubt, 2 on lack of data).
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
134 */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
135 int a_Misc_get_content_type_from_data(void *Data, size_t Size, const char **PT)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
136 {
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
137 size_t i, non_ascci, non_ascci_text, bin_chars;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
138 char *p = Data;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
139 int st = 1; /* default to "doubt' */
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
140 DetectedContentType Type = DT_OCTET_STREAM; /* default to binary */
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
141
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
142 /* HTML try */
1221
f34b803b8639 Handle signed chars. Aadded dIsspace() and dIsalnum() to dlib
Jorge Arellano Cid <jcid@dillo.org>
parents: 1186
diff changeset
143 for (i = 0; i < Size && dIsspace(p[i]); ++i);
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
144 if ((Size - i >= 5 && !dStrncasecmp(p+i, "<html", 5)) ||
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
145 (Size - i >= 5 && !dStrncasecmp(p+i, "<head", 5)) ||
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
146 (Size - i >= 6 && !dStrncasecmp(p+i, "<title", 6)) ||
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
147 (Size - i >= 14 && !dStrncasecmp(p+i, "<!doctype html", 14)) ||
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
148 /* this line is workaround for FTP through the Squid proxy */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
149 (Size - i >= 17 && !dStrncasecmp(p+i, "<!-- HTML listing", 17))) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
150
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
151 Type = DT_TEXT_HTML;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
152 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
153 /* Images */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
154 } else if (Size >= 4 && !dStrncasecmp(p, "GIF8", 4)) {
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
155 Type = DT_IMAGE_GIF;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
156 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
157 } else if (Size >= 4 && !dStrncasecmp(p, "\x89PNG", 4)) {
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
158 Type = DT_IMAGE_PNG;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
159 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
160 } else if (Size >= 2 && !dStrncasecmp(p, "\xff\xd8", 2)) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
161 /* JPEG has the first 2 bytes set to 0xffd8 in BigEndian - looking
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
162 * at the character representation should be machine independent. */
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
163 Type = DT_IMAGE_JPG;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
164 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
165
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
166 /* Text */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
167 } else {
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
168 /* Heuristic for "text/plain"
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
169 * {ASCII, LATIN1, UTF8, KOI8-R, CP-1251}
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
170 * All in the above set regard [00-31] as control characters.
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
171 * LATIN1: [7F-9F] unused
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
172 * CP-1251 {7F,98} unused (two characters).
930
b277eed3119c whitespace cleanup: 's/ +$//g'
Jorge Arellano Cid <jcid@dillo.org>
parents: 368
diff changeset
173 *
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
174 * We'll use [0-31] as indicators of non-text content.
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
175 * Better heuristics are welcomed! :-) */
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
176
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
177 non_ascci = non_ascci_text = bin_chars = 0;
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
178 Size = MIN (Size, 256);
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
179 for (i = 0; i < Size; i++) {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
180 int ch = (uchar_t) p[i];
1221
f34b803b8639 Handle signed chars. Aadded dIsspace() and dIsalnum() to dlib
Jorge Arellano Cid <jcid@dillo.org>
parents: 1186
diff changeset
181 if (ch < 32 && !dIsspace(ch))
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
182 ++bin_chars;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
183 if (ch > 126)
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
184 ++non_ascci;
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
185 if (ch > 190)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
186 ++non_ascci_text;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
187 }
1145
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
188 if (bin_chars == 0 && (non_ascci - non_ascci_text) <= Size/10) {
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
189 /* Let's say text: if "rare" chars are <= 10% */
1145
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
190 Type = DT_TEXT_PLAIN;
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
191 } else if (Size > 0) {
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
192 /* a special check for UTF-8 */
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
193 Size = a_Utf8_end_of_char(p, Size - 1) + 1;
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
194 if (a_Utf8_test(p, Size) > 0)
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
195 Type = DT_TEXT_PLAIN;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
196 }
1145
9b57a492918b Improved recognition heuristics for plain text in utf8
corvid <corvid@lavabit.com>
parents: 1141
diff changeset
197 if (Size >= 256)
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
198 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
199 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
200
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
201 *PT = MimeTypes[Type].str;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
202 return st;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
203 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
204
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
205 /*
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
206 * Parse Content-Type string, e.g., "text/html; charset=utf-8".
1272
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
207 * Content-Type is defined in RFC 2045 section 5.1.
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
208 */
1317
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
209 void a_Misc_parse_content_type(const char *type, char **major, char **minor,
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
210 char **charset)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
211 {
1272
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
212 static const char tspecials_space[] = "()<>@,;:\\\"/[]?= ";
1317
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
213 const char *str, *s;
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
214
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
215 if (major)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
216 *major = NULL;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
217 if (minor)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
218 *minor = NULL;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
219 if (charset)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
220 *charset = NULL;
1317
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
221 if (!(str = type))
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
222 return;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
223
1272
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
224 for (s = str; *s && !iscntrl((uchar_t)*s) && !strchr(tspecials_space, *s);
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
225 s++) ;
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
226 if (major)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
227 *major = dStrndup(str, s - str);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
228
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
229 if (*s == '/') {
1272
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
230 for (str = ++s;
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
231 *s && !iscntrl((uchar_t)*s) && !strchr(tspecials_space, *s); s++) ;
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
232 if (minor)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
233 *minor = dStrndup(str, s - str);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
234 }
1317
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
235 if (charset && *s &&
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
236 (dStrncasecmp(type, "text/", 5) == 0 ||
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
237 dStrncasecmp(type, "application/xhtml+xml", 21) == 0)) {
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
238 /* "charset" parameter defined for text media type in RFC 2046,
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
239 * application/xhtml+xml in RFC 3236.
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
240 *
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
241 * Note that RFC 3023 lists some main xml media types and provides
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
242 * the convention of using the "+xml" minor type suffix for other
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
243 * xml types, so it would be reasonable to check for that suffix if
a251eba3613b look for charset parameter with application/xhtml+xml media type
corvid <corvid@lavabit.com>
parents: 1272
diff changeset
244 * we have need to care about various xml types someday.
1272
83a462cf5d02 follow RFC a bit more closely for Content-Type parsing
corvid <corvid@lavabit.com>
parents: 1221
diff changeset
245 */
250
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
246 const char terminators[] = " ;\t";
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
247 const char key[] = "charset";
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
248
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
249 if ((s = dStristr(str, key)) &&
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
250 (s == str || strchr(terminators, s[-1]))) {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
251 s += sizeof(key) - 1;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
252 for ( ; *s == ' ' || *s == '\t'; ++s);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
253 if (*s == '=') {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
254 size_t len;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
255 for (++s; *s == ' ' || *s == '\t'; ++s);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
256 if ((len = strcspn(s, terminators))) {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
257 if (*s == '"' && s[len-1] == '"' && len > 1) {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
258 /* quoted string */
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
259 s++;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
260 len -= 2;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
261 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
262 *charset = dStrndup(s, len);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
263 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
264 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
265 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
266 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
267 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
268
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
269 /*
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
270 * Compare two Content-Type strings.
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
271 * Return 0 if they are equivalent, and 1 otherwise.
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
272 */
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
273 int a_Misc_content_type_cmp(const char *ct1, const char *ct2)
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
274 {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
275 char *major1, *major2, *minor1, *minor2, *charset1, *charset2;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
276 int ret;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
277
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
278 if ((!ct1 || !*ct1) && (!ct2 || !*ct2))
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
279 return 0;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
280 if ((!ct1 || !*ct1) || (!ct2 || !*ct2))
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
281 return 1;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
282
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
283 a_Misc_parse_content_type(ct1, &major1, &minor1, &charset1);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
284 a_Misc_parse_content_type(ct2, &major2, &minor2, &charset2);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
285
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
286 if (major1 && major2 && !dStrcasecmp(major1, major2) &&
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
287 minor1 && minor2 && !dStrcasecmp(minor1, minor2) &&
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
288 ((!charset1 && !charset2) ||
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
289 (charset1 && charset2 && !dStrcasecmp(charset1, charset2)) ||
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
290 (!charset1 && charset2 && !dStrcasecmp(charset2, "UTF-8")) ||
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
291 (charset1 && !charset2 && !dStrcasecmp(charset1, "UTF-8")))) {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
292 ret = 0;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
293 } else {
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
294 ret = 1;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
295 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
296 dFree(major1); dFree(major2);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
297 dFree(minor1); dFree(minor2);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
298 dFree(charset1); dFree(charset2);
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
299
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
300 return ret;
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
301 }
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
302
fce9380ee68a - Switched from charset to content-type for handling data.
jcid
parents: 180
diff changeset
303 /*
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
304 * Check the server-supplied 'Content-Type' against our detected type.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
305 * (some servers seem to default to "text/plain").
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
306 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
307 * Return value:
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
308 * 0, if they match
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
309 * -1, if a mismatch is detected
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
310 *
155
fb8da086d7da + s/there're/there are/g
jcid
parents: 35
diff changeset
311 * There are many MIME types Dillo doesn't know, they're handled
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
312 * as "application/octet-stream" (as the SPEC says).
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
313 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
314 * A mismatch happens when receiving a binary stream as
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
315 * "text/plain" or "text/html", or an image that's not an image of its kind.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
316 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
317 * Note: this is a basic security procedure.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
318 *
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
319 */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
320 int a_Misc_content_type_check(const char *EntryType, const char *DetectedType)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
321 {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
322 int i;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
323 int st = -1;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
324
274
1deca4cad4c4 - Implemented OBJECT as link (similar to FRAME).
jcid
parents: 250
diff changeset
325 _MSG("Type check: [Srv: %s Det: %s]\n", EntryType, DetectedType);
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
326
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
327 if (!EntryType)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
328 return 0; /* there's no mismatch without server type */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
329
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
330 for (i = 1; MimeTypes[i].str; ++i)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
331 if (dStrncasecmp(EntryType, MimeTypes[i].str, MimeTypes[i].len) == 0)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
332 break;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
333
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
334 if (!MimeTypes[i].str) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
335 /* type not found, no mismatch */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
336 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
337 } else if (dStrncasecmp(EntryType, "image/", 6) == 0 &&
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
338 !dStrncasecmp(DetectedType,MimeTypes[i].str,MimeTypes[i].len)){
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
339 /* An image, and there's an exact match */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
340 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
341 } else if (dStrncasecmp(EntryType, "text/", 5) ||
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
342 dStrncasecmp(DetectedType, "application/", 12)) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
343 /* Not an application sent as text */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
344 st = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
345 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
346
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
347 return st;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
348 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
349
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
350 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
351 * Parse a geometry string.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
352 */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
353 int a_Misc_parse_geometry(char *str, int *x, int *y, int *w, int *h)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
354 {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
355 char *p, *t1, *t2;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
356 int n1, n2;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
357 int ret = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
358
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
359 if ((p = strchr(str, 'x')) || (p = strchr(str, 'X'))) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
360 n1 = strtol(str, &t1, 10);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
361 n2 = strtol(++p, &t2, 10);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
362 if (t1 != str && t2 != p) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
363 *w = n1;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
364 *h = n2;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
365 ret = 1;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
366 /* parse x,y now */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
367 p = t2;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
368 n1 = strtol(p, &t1, 10);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
369 n2 = strtol(t1, &t2, 10);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
370 if (t1 != p && t2 != t1) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
371 *x = n1;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
372 *y = n2;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
373 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
374 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
375 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
376 _MSG("geom: w,h,x,y = (%d,%d,%d,%d)\n", *w, *h, *x, *y);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
377 return ret;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
378 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
379
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
380 /*
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
381 * Encodes string using base64 encoding.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
382 * Return value: new string or NULL if input string is empty.
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
383 */
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
384 char *a_Misc_encode_base64(const char *in)
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
385 {
1141
corvid <corvid@lavabit.com>
parents: 1128
diff changeset
386 static const char *const base64_hex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
corvid <corvid@lavabit.com>
parents: 1128
diff changeset
387 "abcdefghijklmnopqrstuvwxyz"
corvid <corvid@lavabit.com>
parents: 1128
diff changeset
388 "0123456789+/";
0
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
389 char *out = NULL;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
390 int len, i = 0;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
391
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
392 if (in == NULL) return NULL;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
393 len = strlen(in);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
394
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
395 out = (char *)dMalloc((len + 2) / 3 * 4 + 1);
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
396
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
397 for (; len >= 3; len -= 3) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
398 out[i++] = base64_hex[in[0] >> 2];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
399 out[i++] = base64_hex[((in[0]<<4) & 0x30) | (in[1]>>4)];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
400 out[i++] = base64_hex[((in[1]<<2) & 0x3c) | (in[2]>>6)];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
401 out[i++] = base64_hex[in[2] & 0x3f];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
402 in += 3;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
403 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
404
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
405 if (len > 0) {
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
406 unsigned char fragment;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
407 out[i++] = base64_hex[in[0] >> 2];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
408 fragment = (in[0] << 4) & 0x30;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
409 if (len > 1) fragment |= in[1] >> 4;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
410 out[i++] = base64_hex[fragment];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
411 out[i++] = (len < 2) ? '=' : base64_hex[(in[1] << 2) & 0x3c];
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
412 out[i++] = '=';
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
413 }
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
414 out[i] = '\0';
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
415 return out;
6ee11bf9e3ea Initial revision
jcid
parents:
diff changeset
416 }
180
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
417
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
418 /*
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
419 * Load a local file into a dStr.
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
420 * Return value: dStr on success, NULL on error.
368
2242da885677 - s/todo:/TODO:/g
jcid
parents: 340
diff changeset
421 * TODO: a filesize threshold may be implemented.
180
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
422 */
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
423 Dstr *a_Misc_file2dstr(const char *filename)
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
424 {
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
425 FILE *F_in;
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
426 int n;
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
427 char buf[4096];
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
428 Dstr *dstr = NULL;
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
429
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
430 if ((F_in = fopen(filename, "r"))) {
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
431 dstr = dStr_sized_new(4096);
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
432 while ((n = fread (buf, 1, 4096, F_in)) > 0) {
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
433 dStr_append_l(dstr, buf, n);
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
434 }
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
435 fclose(F_in);
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
436 }
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
437 return dstr;
0038a2943cc2 - Made file inputs free the loaded file after the page is left.
jcid
parents: 155
diff changeset
438 }