4 * Copyright (C) 2012-2013 by Werner Lemberg.
6 * This file is part of the ttfautohint library, and may only be used,
7 * modified, and distributed under the terms given in `COPYING'. By
8 * continuing to use, modify, or distribute this file you indicate that you
9 * have read `COPYING' and understand and accept it fully.
11 * The file `COPYING' mentioned in the previous paragraph is distributed
12 * with the ttfautohint library.
22 #include <numberset.h>
26 number_set_parse(const char* s
,
27 number_range
** number_set
,
31 number_range
* cur
= NULL
;
32 number_range
* new_range
;
35 const char* last_pos
= s
;
39 number_range
* error_code
= NULL
;
84 || (n
== INT_MAX
/ 10 && digit
> 5))
86 error_code
= NUMBERSET_OVERFLOW
;
92 } while (isdigit(*s
));
101 break; /* end of data */
104 error_code
= NUMBERSET_INVALID_CHARACTER
;
122 || (m
== INT_MAX
/ 10 && digit
> 5))
124 error_code
= NUMBERSET_OVERFLOW
;
130 } while (isdigit(*s
));
149 if (n
< min
|| m
> max
)
151 error_code
= NUMBERSET_INVALID_RANGE
;
158 error_code
= NUMBERSET_NOT_ASCENDING
;
160 error_code
= NUMBERSET_OVERLAPPING_RANGES
;
165 && last_end
+ 1 == n
)
167 /* merge adjacent ranges */
174 new_range
= (number_range
*)malloc(sizeof (number_range
));
177 error_code
= NUMBERSET_ALLOCATION_ERROR
;
181 /* prepend new range to list */
182 new_range
->start
= n
;
184 new_range
->next
= cur
;
195 /* deallocate data */
205 *number_set
= error_code
;
209 /* success; now reverse list to have elements in ascending order */
210 number_range
* list
= NULL
;
230 number_set_free(number_range
* number_set
)
232 number_range
* nr
= number_set
;
246 number_set_show(number_range
* number_set
,
255 number_range
* nr
= number_set
;
274 /* we return an empty string for an empty number set */
275 /* (this is, number_set == NULL or unsuitable `min' and `max' values) */
276 s
= (char*)malloc(1);
290 comma
= (s_len
== 1) ? "" : ", ";
294 tmp_len
= sprintf(tmp
, "-");
295 else if (nr
->start
<= min
)
296 tmp_len
= sprintf(tmp
, "-%i",
298 else if (nr
->end
>= max
)
299 tmp_len
= sprintf(tmp
, "%s%i-",
303 if (nr
->start
== nr
->end
)
304 tmp_len
= sprintf(tmp
, "%s%i",
307 tmp_len
= sprintf(tmp
, "%s%i-%i",
308 comma
, nr
->start
, nr
->end
);
311 s_len_new
= s_len
+ tmp_len
;
312 s_new
= (char*)realloc(s
, s_len_new
);
318 strcpy(s_new
+ s_len
- 1, tmp
);
331 number_set_is_element(number_range
* number_set
,
334 number_range
* nr
= number_set
;
339 if (number
< nr
->start
)
341 if (nr
->start
<= number
342 && number
<= nr
->end
)
350 /* end of numberset.c */