저번편에서 c 로 포팅하다보니 ucs2 를 utf-8 로 변환하는 함수도 필요하고,

@seq << @c

큐(queue)의 필요성을 느꼈음. 위 루비 코드의 의미는, @seq 라는 queue 에 @c 를 넣으라는 거임.

표준 c 에 큐가 있긴 있음. insque(), remque() 라고 있는데, api 가 그지같아 써먹기가 그지같음

그래서 c 로 큐를 만들었음.

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> typedef struct _TianNode TianNode; struct _TianNode { TianNode *next; void *data; }; typedef struct _TianQueue TianQueue; struct _TianQueue { TianNode *head; TianNode *tail; unsigned int count; void (* free_func) (void *); }; TianQueue *tian_queue_new (void (* free_func) (void *)) { TianQueue *q; q = calloc (1, sizeof (TianQueue)); q->free_func = free_func; return q; } void tian_queue_free (TianQueue *q) { TianNode *p = q->head; while (p) { if (q->free_func && p->data) q->free_func (p->data); TianNode *next = p->next; free (p); p = next; } free (q); } void tian_queue_add (TianQueue *q, void *data) { TianNode *node = malloc (sizeof (TianNode)); node->next = NULL; node->data = data; if (!q->count) q->head = node; else q->tail->next = node; q->tail = node; q->count++; } bool tian_queue_remove (TianQueue *q) { if (!q->count) return false; TianNode *node; node = q->head; q->head = q->head->next; q->count--; if (q->free_func) q->free_func (node->data); free (node); return true; } void *tian_queue_peek (TianQueue *q, unsigned int i) { if (!q->count) return NULL; TianNode *p; for (p = q->head; i > 0 && p; i--) p = q->head->next; return p->data; } int main (int argc, char **argv) { TianQueue *queue; char *str; queue = tian_queue_new (free); tian_queue_add (queue, strdup ("Hello0")); tian_queue_add (queue, strdup ("Hello1")); tian_queue_add (queue, strdup ("Hello2")); str = tian_queue_peek (queue, 0); puts (str); tian_queue_remove (queue); str = tian_queue_peek (queue, 0); puts (str); tian_queue_free (queue); return 0; }

디씨 특성상 아마 꺽쇠 괄호가 다 짤렸을거 같은데, 나름 실용적으로 만들어봤음.

그런데, 다 만들고나서 보니까.. seq[5] 이걸 활용해서 queue 로 쓰는것보다 오버헤드가 클 거 같음.

다음 편에서는 유니코드 ucs2, ucs4 를 utf-8 로 변환하는 함수를 만들 거임.

그리고 seq[5] 이런 배열을 queue 로 사용하는 방법도 모색해보고.

이쩌 좀... 배보다 배꼽이 더 커지는 느낌일세~~~