사용자 도구

사이트 도구


kb:luaauxapistringbuffer

LuaAuxApi/StringBuffer

루아에서 문자열은 값을 바꿀 수 없는 오브젝트이다. 때문에 조그만 문자열을 합쳐서 긴 문자열을 만드는 작업은 상당히 비효율적이다. 문자열 합치기 연산 .. 을 수행할 때마다, 새로운 문자열 오브젝트가 생성되고, 이전의 오브젝트는 버려지니까. 이 작업을 위해서 만들어진 특별한 API들이 auxlib에 존재한다.

8-) 주어진 문자열을 모두 대문자로 바꾸는 샘플

static int str_upper(lua_State* L)
{
    size_t l = 0, i = 0;
    luaL_Buffer b;
    const char *s = luaL_checklstr(L, 1, &l);
    luaL_bufferinit(L, &b);
    for (i=0; i<l; i++)
        luaL_putchar(&b, toupper((unsigned char)(s[i])));
    luaL_pushresult(&b);
    return 1;
}

luaL_buffinit

void luaL_buffinit (lua_State *L, luaL_Buffer *B);

버퍼를 초기화한다. B 버퍼 객체는 보통 함수 안의 지역 변수다.

luaL_prepbuffer

char *luaL_prepbuffer (luaL_Buffer *B);

B 버퍼 안에 들어있는 문자열을 스택 위에다 푸쉬하고, 버퍼 자체는 재사용을 위해 초기화한다.

luaL_putchar

#define luaL_putchar(B,c) \
  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \
  (*(B)->p++ = (char)(c)))

버퍼에다 문자열 하나를 붙인다.

luaL_addsize

#define luaL_addsize(B,n)  ((B)->p += (n))

버퍼의 크기를 n 만큼 늘린다.

luaL_addlstring

void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);

버퍼에다 문자열을 붙인다. l은 붙일 문자열의 길이다.

luaL_addstring

void luaL_addstring (luaL_Buffer *B, const char *s);

버퍼에다 0으로 끝나는 문자열을 붙인다.

luaL_addvalue

void luaL_addvalue (luaL_Buffer *B);

스택의 맨 위에 있는 값을 팝해서 문자열로 변환해, 버퍼에다 붙인다.

luaL_pushresult

void luaL_pushresult (luaL_Buffer *B);

버퍼 안에 들어있는 문자열을 스택에다 푸시한다.


kb/luaauxapistringbuffer.txt · 마지막으로 수정됨: 2014/11/07 09:59 (바깥 편집)