+typedef struct {
+ unsigned char *ary;
+ int max_length;
+ int count;
+} nkf_ary;
+
+static nkf_ary *
+nkf_ary_new(int length)
+{
+ nkf_ary *ary = nkf_malloc(sizeof(nkf_ary));
+ ary->ary = nkf_malloc(length);
+ ary->max_length = length;
+ ary->count = 0;
+ return ary;
+}
+
+static void
+nkf_ary_dispose(nkf_ary *ary)
+{
+ nkf_free(ary->ary);
+ nkf_free(ary);
+}
+
+#define nkf_ary_length(ary) ((ary)->count)
+#define nkf_ary_empty_p(ary) ((ary)->count == 0)
+
+static unsigned char
+nkf_ary_at(nkf_ary *ary, int index)
+{
+ assert(index <= ary->count);
+ return ary->ary[index];
+}
+
+static void
+nkf_ary_clear(nkf_ary *ary)
+{
+ ary->count = 0;
+}
+
+static unsigned char
+nkf_ary_push(nkf_ary *ary, nkf_char c)
+{
+ assert(ary->max_length > ary->count);
+ ary->ary[ary->count++] = c;
+ return ary->count;
+}
+
+static unsigned char
+nkf_ary_pop(nkf_ary *ary)
+{
+ assert(0 < ary->count);
+ return ary->ary[--ary->count];
+}
+