1// Aseprite
2// Copyright (C) 2001-2015 David Capello
3//
4// This program is distributed under the terms of
5// the End-User License Agreement for Aseprite.
6
7#ifdef HAVE_CONFIG_H
8#include "config.h"
9#endif
10
11#include <cstring>
12#include <cstdio>
13
14static int line_num;
15
16static char* tok_fgets(char* buf, int size, FILE* file);
17
18void tok_reset_line_num()
19{
20 line_num = 0;
21}
22
23int tok_line_num()
24{
25 return line_num;
26}
27
28char* tok_read(FILE* f, char* buf, char* leavings, int sizeof_leavings)
29{
30 int ch, len = 0;
31 char* s;
32
33 *buf = 0;
34
35 if (feof(f))
36 return NULL;
37
38 while (!*buf) {
39 if (!*leavings) {
40 line_num++;
41 if (!tok_fgets(leavings, sizeof_leavings, f))
42 return NULL;
43 }
44
45 s = leavings;
46
47 for (ch=*s; ch; ch=*s) {
48 if (ch == ' ') {
49 s++;
50 }
51 else if (ch == '#') {
52 s += strlen(s);
53 break;
54 }
55 else if (ch == '\"') {
56 s++;
57
58 for (ch=*s; ; ch=*s) {
59 if (!ch) {
60 line_num++;
61 if (!tok_fgets(leavings, sizeof_leavings, f))
62 break;
63 else {
64 s = leavings;
65 continue;
66 }
67 }
68 else if (ch == '\\') {
69 s++;
70 switch (*s) {
71 case 'n': ch = '\n'; break;
72 default: ch = *s; break;
73 }
74 }
75 else if (ch == '\"') {
76 s++;
77 break;
78 }
79 buf[len++] = ch;
80 s++;
81 }
82 break;
83 }
84 else {
85 for (ch=*s; (ch) && (ch != ' '); ch=*s) {
86 buf[len++] = ch;
87 s++;
88 }
89 break;
90 }
91 }
92
93 memmove(leavings, s, strlen(s)+1);
94 }
95
96 buf[len] = 0;
97 return buf;
98}
99
100/* returns the readed line or NULL if EOF (the line will not have the
101 "\n" character) */
102static char* tok_fgets(char* buf, int size, FILE* file)
103{
104 char* ret = fgets(buf, size, file);
105
106 if (ret && *ret) {
107 // Remove trailing \r\n
108 char* s = ret + strlen(ret);
109 do {
110 *(s--) = 0;
111 } while (s >= ret && *s && (*s == '\n' || *s == '\r'));
112 }
113
114 return ret;
115}
116