8 #define MAXFLEN (1 << 20)
16 int uc_dec(uc_t
*dst
, char *src
)
24 while (l
< 6 && *s
& (0x40 >> l
))
26 *dst
= (0x3f >> l
) & *s
++;
28 *dst
= (*dst
<< 6) | (*s
++ & 0x3f);
32 int uc_enc(char *d
, uc_t c
)
36 *d
++ = 0xf0 | (c
>> 18);
38 } else if (c
> 0x7ff) {
39 *d
++ = 0xe0 | (c
>> 12);
41 } else if (c
> 0x7f) {
42 *d
++ = 0xc0 | (c
>> 6);
50 *d
++ = 0x80 | (c
>> (l
* 6)) & 0x3f;
54 struct ustr
*ustr_fill(int fd
)
56 struct ustr
*us
= malloc(sizeof(*us
));
59 while ((cr
= read(fd
, us
->buf
+ nr
, MAXFLEN
- nr
)) > 0)
66 void ustr_free(struct ustr
*us
)
71 int ustr_int(struct ustr
*us
, int *i
)
76 char *s
, *e
= us
->buf
+ us
->len
;
79 s
= us
->buf
+ us
->cur
;
82 if (*s
== '-' || *s
== '+')
86 if (tolower(s
[1]) == 'x')
88 s
+= base
== 8 ? 1 : 2;
91 if (*s
>= '0' && *s
<= '9')
92 n
= n
* base
+ *s
- '0';
93 else if (base
== 16 && tolower(*s
) >= 'a' && tolower(*s
) <= 'f')
94 n
= n
* base
+ 10 + tolower(*s
) - 'a';
100 len
= s
- (us
->buf
+ us
->cur
);
102 return us
->cur
< us
->len
? len
: -1;
105 int ustr_str(struct ustr
*us
, char *s
, int len
)
109 while (i
< len
&& us
->cur
< us
->len
&& !isspace(us
->buf
[us
->cur
]))
110 s
[i
++] = us
->buf
[us
->cur
++];
112 return us
->cur
< us
->len
? i
: -1;
115 int ustr_uc_nospace(struct ustr
*us
, uc_t
*t
)
119 if (us
->cur
>= us
->len
)
121 len
= uc_dec(t
, us
->buf
+ us
->cur
);
126 int ustr_uc(struct ustr
*us
, uc_t
*t
)
129 if (us
->cur
>= us
->len
)
131 len
= uc_dec(t
, us
->buf
+ us
->cur
);
136 int ustr_skipws(struct ustr
*us
)
139 while (us
->cur
< us
->len
&& isspace(us
->buf
[us
->cur
]))
144 int ustr_eol(struct ustr
*us
)
147 while (us
->cur
< us
->len
&& us
->buf
[us
->cur
] != '\n')
149 if (us
->cur
< us
->len
)
154 int ustr_line(struct ustr
*us
, char *s
, int len
)
157 while (i
< len
&& us
->cur
< us
->len
&& us
->buf
[us
->cur
] != '\n')
158 s
[i
++] = us
->buf
[us
->cur
++];
159 if (us
->cur
< us
->len
)
160 s
[i
++] = us
->buf
[us
->cur
++];
165 void ustr_seek(struct ustr
*us
, int pos
)
170 int ustr_pos(struct ustr
*us
)
175 void ustr_back(struct ustr
*us
)