Browse Source

Add getline() for challenged systems (OSX, Android).

This fixes compilation under OS X.
Georgi Chorbadzhiyski 11 years ago
parent
commit
76b533ae10
1 changed files with 58 additions and 0 deletions
  1. 58
    0
      util.c

+ 58
- 0
util.c View File

@@ -182,6 +182,64 @@ int64_t get_time(void) {
182 182
 	return ts.tv_sec * 1000000ll + ts.tv_nsec / 1000;
183 183
 }
184 184
 
185
+#if defined(__APPLE__) || defined(__ANDROID__)
186
+ssize_t getdelim(char **linep, size_t *np, int delim, FILE *stream)
187
+{
188
+	int ch;
189
+	size_t new_len;
190
+	ssize_t i = 0;
191
+	char *line, *new_line;
192
+
193
+	// Invalid input
194
+	if (!linep || !np) {
195
+		errno = EINVAL;
196
+		return -1;
197
+	}
198
+
199
+	if (*linep == NULL || *np == 0) {
200
+		*np = 1024;
201
+		*linep = calloc(1, *np);
202
+		if (*linep == NULL)
203
+			return -1;
204
+	}
205
+	line = *linep;
206
+
207
+	while ((ch = getc(stream)) != EOF) {
208
+		if ((size_t)i > *np) {
209
+			// Need more space
210
+			new_len  = *np + 1024;
211
+			new_line = realloc(*linep, new_len);
212
+			if (!new_line)
213
+				return -1;
214
+			*np    = new_len;
215
+			*linep = new_line;
216
+		}
217
+
218
+		line[i] = ch;
219
+		if (ch == delim)
220
+			break;
221
+		i += 1;
222
+	}
223
+
224
+	if ((size_t)i > *np) {
225
+		// Need more space
226
+		new_len  = i + 2;
227
+		new_line = realloc(*linep, new_len);
228
+		if (!new_line)
229
+			return -1;
230
+		*np    = new_len;
231
+		*linep = new_line;
232
+	}
233
+	line[i + 1] = '\0';
234
+
235
+	return i > 0 ? i : -1;
236
+}
237
+
238
+ssize_t getline(char **linep, size_t *np, FILE *stream) {
239
+	return getdelim(linep, np, '\n', stream);
240
+}
241
+#endif
242
+
185 243
 unsigned int file_hex2buf(char *filename, uint8_t *buffer, unsigned int buf_size) {
186 244
 	FILE *f = fopen(filename, "r");
187 245
 	if (!f) {

Loading…
Cancel
Save