사용자 도구

사이트 도구


kb:luaauxapistringbuffer

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:luaauxapistringbuffer [2014/11/07 09:59] (현재)
줄 1: 줄 1:
 +====== LuaAuxApi/​StringBuffer ======
 +루아에서 문자열은 값을 바꿀 수 없는 오브젝트이다. 때문에 조그만 문자열을 합쳐서 긴 문자열을 만드는 작업은 상당히 비효율적이다. 문자열 합치기 연산 .. 을 수행할 때마다, 새로운 문자열 오브젝트가 생성되고,​ 이전의 오브젝트는 버려지니까. 이 작업을 위해서 만들어진 특별한 API들이 auxlib에 존재한다.
 +
 +8-) 주어진 문자열을 모두 대문자로 바꾸는 샘플
 +<code cpp>
 +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;
 +}
 +</​code>​
 +
 +===== luaL_buffinit =====
 +<code cpp>
 +void luaL_buffinit (lua_State *L, luaL_Buffer *B);
 +</​code>​
 +버퍼를 초기화한다. B 버퍼 객체는 보통 함수 안의 지역 변수다.
 +
 +
 +===== luaL_prepbuffer =====
 +<code cpp>
 +char *luaL_prepbuffer (luaL_Buffer *B);
 +</​code>​
 +B 버퍼 안에 들어있는 문자열을 스택 위에다 푸쉬하고,​ 버퍼 자체는 재사용을 위해 초기화한다.
 +
 +
 +===== luaL_putchar =====
 +<code cpp>
 +#define luaL_putchar(B,​c) \
 +  ((void)((B)->​p < ((B)->​buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)),​ \
 +  (*(B)->​p++ = (char)(c)))
 +</​code>​
 +버퍼에다 문자열 하나를 붙인다.
 +
 +
 +===== luaL_addsize =====
 +<code cpp>
 +#define luaL_addsize(B,​n) ​ ((B)->p += (n))
 +</​code>​
 +버퍼의 크기를 n 만큼 늘린다.
 +
 +
 +===== luaL_addlstring =====
 +<code cpp>
 +void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
 +</​code>​
 +버퍼에다 문자열을 붙인다. l은 붙일 문자열의 길이다.
 +
 +
 +===== luaL_addstring =====
 +<code cpp>
 +void luaL_addstring (luaL_Buffer *B, const char *s);
 +</​code>​
 +버퍼에다 0으로 끝나는 문자열을 붙인다.
 +
 +
 +===== luaL_addvalue =====
 +<code cpp>
 +void luaL_addvalue (luaL_Buffer *B);
 +</​code>​
 +스택의 맨 위에 있는 값을 팝해서 문자열로 변환해, 버퍼에다 붙인다.
 +
 +
 +===== luaL_pushresult =====
 +<code cpp>
 +void luaL_pushresult (luaL_Buffer *B);
 +</​code>​
 +버퍼 안에 들어있는 문자열을 스택에다 푸시한다.
 +
 +----
 +  * see also [[LuaAuxApi]]
  
kb/luaauxapistringbuffer.txt · 마지막으로 수정됨: 2014/11/07 09:59 (바깥 편집)