4 * Copyright (C) 2012 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
;
38 number_range
* error_code
= NULL
;
80 || (n
== INT_MAX
/ 10 && digit
> 5))
82 error_code
= NUMBERSET_OVERFLOW
;
88 } while (isdigit(*s
));
94 break; /* end of data */
97 error_code
= NUMBERSET_INVALID_CHARACTER
;
115 || (m
== INT_MAX
/ 10 && digit
> 5))
117 error_code
= NUMBERSET_OVERFLOW
;
123 } while (isdigit(*s
));
139 if (n
< min
|| m
> max
)
141 error_code
= NUMBERSET_INVALID_RANGE
;
147 error_code
= NUMBERSET_OVERLAPPING_RANGES
;
152 && last_end
+ 1 == n
)
154 /* merge adjacent ranges */
161 new_range
= (number_range
*)malloc(sizeof (number_range
));
164 error_code
= NUMBERSET_ALLOCATION_ERROR
;
168 /* prepend new range to list */
169 new_range
->start
= n
;
171 new_range
->next
= cur
;
181 /* deallocate data */
191 *number_set
= error_code
;
195 /* success; now reverse list to have elements in ascending order */
196 number_range
* list
= NULL
;
216 number_set_free(number_range
* number_set
)
218 number_range
* nr
= number_set
;
232 number_set_show(number_range
* number_set
,
241 number_range
* nr
= number_set
;
260 /* we return an empty string for an empty number set */
261 /* (this is, number_set == NULL or unsuitable `min' and `max' values) */
262 s
= (char*)malloc(1);
276 comma
= (s_len
== 1) ? "" : ", ";
280 tmp_len
= sprintf(tmp
, "-");
281 else if (nr
->start
<= min
)
282 tmp_len
= sprintf(tmp
, "-%i",
284 else if (nr
->end
>= max
)
285 tmp_len
= sprintf(tmp
, "%s%i-",
289 if (nr
->start
== nr
->end
)
290 tmp_len
= sprintf(tmp
, "%s%i",
293 tmp_len
= sprintf(tmp
, "%s%i-%i",
294 comma
, nr
->start
, nr
->end
);
297 s_len_new
= s_len
+ tmp_len
;
298 s_new
= (char*)realloc(s
, s_len_new
);
304 strcpy(s_new
+ s_len
- 1, tmp
);
317 number_set_is_element(number_range
* number_set
,
320 number_range
* nr
= number_set
;
325 if (number
< nr
->start
)
327 if (nr
->start
<= number
328 && number
<= nr
->end
)
336 /* end of numberset.c */