4 * Copyright (C) 2012-2014 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 number_set_free(cur
);
199 *number_set
= error_code
;
203 /* success; now reverse list to have elements in ascending order */
204 number_range
* list
= NULL
;
224 number_set_free(number_range
* number_set
)
226 number_range
* nr
= number_set
;
242 number_set_show(number_range
* number_set
,
251 number_range
* nr
= number_set
;
270 /* we return an empty string for an empty number set */
271 /* (this is, number_set == NULL or unsuitable `min' and `max' values) */
272 s
= (char*)malloc(1);
286 comma
= (s_len
== 1) ? "" : ", ";
290 tmp_len
= sprintf(tmp
, "-");
291 else if (nr
->start
<= min
)
292 tmp_len
= sprintf(tmp
, "-%i",
294 else if (nr
->end
>= max
)
295 tmp_len
= sprintf(tmp
, "%s%i-",
299 if (nr
->start
== nr
->end
)
300 tmp_len
= sprintf(tmp
, "%s%i",
303 tmp_len
= sprintf(tmp
, "%s%i-%i",
304 comma
, nr
->start
, nr
->end
);
307 s_len_new
= s_len
+ tmp_len
;
308 s_new
= (char*)realloc(s
, s_len_new
);
314 strcpy(s_new
+ s_len
- 1, tmp
);
327 number_set_is_element(number_range
* number_set
,
330 number_range
* nr
= number_set
;
335 if (number
< nr
->start
)
337 if (nr
->start
<= number
338 && number
<= nr
->end
)
348 number_set_get_first(number_set_iter
* iter_p
)
350 if (!iter_p
|| !iter_p
->range
)
353 iter_p
->val
= iter_p
->range
->start
;
360 number_set_get_next(number_set_iter
* iter_p
)
362 if (!iter_p
|| !iter_p
->range
)
367 if (iter_p
->val
> iter_p
->range
->end
)
369 iter_p
->range
= iter_p
->range
->next
;
372 iter_p
->val
= iter_p
->range
->start
;
378 /* end of numberset.c */