Syntax: | int qDecoder(void); |
Function: | COOKIE, GET, POST(multipart/form-data 인코딩 포함) 방식으로 저달된 쿼리를 해석하여 linked-list에 저장 |
Return: | 성공시 전달받은 인자의 갯수, 에러시 -1. |
Note: | 쿼리가 해석되는 순서는 (1)COOKIE (2)GET (3)POST 이다. 따라서 같은 이름을 갖는 COOKIE와 GET 변수 그리고 POST 변수가 해석되었을때, qValue("변수명")은 COOKIE의 값을 복귀한다. 이것은 보안적으로 의미가 있는데, 보통 어플리케이션은 검증된 상태정보를 COOKIE에 저장해 놓고 별도의 처리없이 사용을 하기 때문에 GET/POST 방식으로 전달된 동일한 변수명이 qValue()에서 COOKIE보다 먼저 읽혀지는 것을 방지할 필요가 있다. qDecoder()는 qValue()와 같은 관련 함수가 호출되면 내부적으로 자동 호출되므로 명시적으로 호출을 할 필요는 없다. multipart/form-data 인코딩을 통해 업로딩된 파일이 있을경우에는, "변수명.length", "변수명.contenttype", "변수명.name"의 변수가 자동으로 삽입된다. "변수명.length"엔 자료의 바이트수가 저장되며, "변수명.contenttype"엔 "image/jpeg"와 같은 컨텐트 타입이 저장되고, "변수명.name"은 사용자가 전송한 파일명이 저장된다. 이때 파일명은 경로를 제외한 순수 파일명만 저장된다. (/"C:Data/a.gif"일경우 "/a.gif"만이 저장) 또한, 자동으로 생성된 인자(변수명.name, 변수명.length)는 복귀값(인자 갯수)에 반영되지 않는다. |
Example: |
Syntax: | char *qValue(char *format, …); |
Function: | Linked-list에서 변수명에대한 값(COOKIE, GET, POST)을 찾아 포인터를 넘겨줌 |
Return: | 변수명이 존재하면 변수값의 포인터, 변수명이 없으면 NULL. |
Note: | 변수명이 존재하면 변수값의 포인터, 변수명이 없으면 NULL Note: qValue()는 qDecoder()에 의해 생성된 쿼리 인덱스의 포인터만을 복귀한다. 따라서 qValue로 전달받은 포인터를 free() 하여서는 안된다. 할당 메모리 해제는 qFree() 함수를 통해(일반적으로 프로그램 종료전) 수행하여야 한다. qDecoder() 함수가 호출되지 않았다면, 자동으로 qDecoder()를 내부 호출한다. |
Example: |
Syntax: | int qiValue(char *format, …); |
Function: | qValue()와 같으나, 값(숫자 문자열)을 정수로 변환하여 복귀함. |
Return: | 성공시 변수값(숫자 문자열)에 대한 정수값. 변수명이 존재하지 않거나 변환 불가능시 0 . |
Example: |
Syntax: | char *qValueDefault(char *defstr, char *format, …); |
Function: | 쿼리가 없을때 기본 인자를 설정하기 위해 사용하는 qValue()의 간략 함수이다. |
Return: | qValue()와 같으나 변수가 존재하지 않을시 defstr의 포인터를 복귀. |
Example: |
Syntax: | char *qValueNotEmpty(char *errmsg, char *format, …); |
Function: | 쿼리가 없거나 공백 문자열("")이 복귀될 시 qError()함수를 사용해 지정된 에러메세지를 출력한다. |
Return: | NULL에 대한 오류처리가 내장된 것을 제외하곤 qValue()와 같다. |
Example: |
Syntax: | char *qValueReplace(char *mode, char *name, char *tokstr, char *word); |
Function: | Linked-list 문자열에 대한 문자열 및 토큰 치환을 한다. |
Return: | 치환된 문자열 포인터. |
Note: | qValueReplace()는 기본적으로 qStrReplace()의 Wrapping 함수이다. 차이점은 소스 문자열을 쿼리 값(name에 대한 linked-list의 value)으로 한다는 점이며, 그 변환이 linked-list 자체에 직접적으로 가해질 수도 있음에 있다. 따라서 qValueReplace()의 인자 사용법은 qStrReplace()와 기본적으로 동일하다. ‘name’ 인자는 소스 문자열로 사용할 linked-list의 쿼리명이며 해당 value을 치환시 사용할 소스 문자열로 한다. ‘mode’ 인자는 "sr"와 같이 두개의 분리된 문자로 구성된 문자열이다. 첫번째 문자는 치환방법을 정의하며 ‘t’나 ‘s’가 위치할 수 있다. ‘t’는 [t]oken을 의미하며 tokstr 문자열의 각 문자를 토큰으로 소스 문자열 (주어진 name에 대한 linked-list의 value 문자열)을 비교하여, 매칭이 되는 문자를 word 문자열로 치환한다. ‘s’는 [s]tring을 의미하여 tokstr 스트링 자체를 하나의 토큰으로 하여 소스 스트링내에 나타나는 tokstr 매칭 문자열을 word 문자열로 치환한다. 두번째 문자는 치환된 문자열에 대한 기록 형태를 나타내며 ‘n’과 ‘r’이 사용될 수 있다. ‘n’은 [n]ew를 나타내며 치환된 결과 문자열을 새로운 메모리 공간에 저장하여 해당 포인터를 리턴하게 한다. 따라서 소스 스트링 linked-list 자체는 원상태가 유지되고 해당 메모리는 사용자 측면에서 free() 되어야 한다. ‘r’은 [r]eplace를 의미하며 치환 결과를 linked-list 자체에 덮어 씀을 의미한다. 이것은 내부적으로 메모리 재할당을 통해 이루어 진다. 결과적으로 ‘mode’ 인자는 다음과 같이 4개의 조합 가능한 경우를 갖는다. Mode "tn" : [t]oken 치환 & 새로운 공간에 결과를 담아 복귀 Mode "tr" : [t]oken 치환 & linked-list 자체를 수정 Mode "sn" : [s]tring 치환 & 새로운 공간에 결과를 담아 복귀 Mode "sr" : [s]tring 치환 & linked-list 자체를 수정 |
Example: |
Syntax: | Q_Entry *qGetFirstEntry(void); |
Function: | Linked-list의 첫번째 Q_Entry 포인터를 복귀한다. |
Return: | Linked-list에 데이터가 있을때엔 Q_Entry 포인터를 복귀. 없을경우엔 NULL |
Note: | qDecoder()에 의해 사용되는 linked-list를 직접 조작하고자 할때 루트 포인터를 얻기위해 사용한다. |
Example: |
Syntax: | char *qValueFirst(char *format, …); |
Function: | 동일한 변수명을 갖는 인자들을 순차적으로 패치할 때 사용. |
Return: | 성공시 동일한 변수명을 갖는 인자들에 대한 첫번째 변수값 포인터를 복귀, 변수명이 없을시 NULL. |
Example: | n”, list); } |
Syntax: | char *qValueNext(void); |
Function: | qValueFirst()로 찾는 것을 계속한다. |
Return: | 성공시 변수값의 포인터, 더이상의 동일 변수명이 없을때 NULL. |
Example: | n”, list); } |
Syntax: | char *qValueAdd(char *name, char *format, …); |
Function: | 변수를 linked-list에 강제 추가함. |
Return: | Linked-list에서의 추가된 name에 대한 문자열 포인터 |
Note: | 같은 변수명이 존재할 경우엔 값이 교체된다. |
Example: |
Syntax: | void qValueRemove(char *format, …); |
Function: | Linked-list에서 해당 엔트리를 삭제한다. |
Example: |
Syntax: | char qValueType(char *format, …); |
Function: | 쿼리값의 전달 형태(Cookie, GET, POST)를 복귀한다. |
Return: | 쿠키 `C`, GET 메소드 `G`, POST 메소드 `P`, 새로운 데이터(qValueAdd) `N`, 변수 없음 `-`. |
Example: |
Syntax: | void qCookieSet(char *name, char *value, int exp_days, char *path, char *domain, char *secure); |
Function: | name=value 에 해당하는 쿠키를 설정함. |
Note: | qCookieSet()을 통해 쿠키를 설정했을 경우 특성상 qValue()를 통해 값이 넘겨지는 시점은 다음번 프로그램 호출시가 된다. 그러나 몇몇 구현에 있어서는 로직의 간결함을 위해 쿠키를 설정하면서 동시에 이를 다름 루틴에 적용 할 필요가 있다. 이때에는 qValueAdd()를 사용하여 링크드 리스트에 값을 강제 추가함으로써 로직을 간결화시킬 수 있다. 단 qCookieSet()은 모든 경우에 쿠키 설정이 성공하는 것이 아니므로, qValueAdd()의 사용은 조심스러워야 한다. 반드시 qContentType()이 호출되기 전에 사용하여야 한다. |
Example: |
Syntax: | void qCookieRemove(char *name, char *path, char *domain, char *secure); |
Function: | 클라이언트(브라우저)의 쿠키를 삭제한다. |
Note: | 인자 path, domain, seure는 qCookieSet()을 통해 쿠키를 설정할 당시의 인자와 같아야 한다. qCookieRemove()을 통해 쿠키를 삭제했을 경우 링크드 리스트에서 값이 제거되는 시점은 다음번 프로그램 호출시가 된다. 그러나 몇몇 구현에 있어서는 로직의 간결함을 위해 쿠키를 삭제하면서 동시에 이를 다름 루틴에 적용 할 필요가 있다. 이때에는 qValueRemove()를 사용하여 링크드 리스트에 값을 강제 삭제함으로써 로직을 간결화시킬 수 있다. 단 qCookieRemove()는 모든 경우에 쿠키 삭제가 성공하는 것이 아니므로, qValueRemove()의 사용은 조심스러워야 한다. |
Example: |
Syntax: | char *qCookieValue(char *format, …); |
Function: | 쿠키값을 복귀한다. |
Return: | 쿠키가 존재하면 쿠키값의 포인터, 쿠키가 없으면 NULL |
Example: |
Syntax: | int qPrint(void); |
Function: | 프로그램의 디버깅용으로 전달된 인자를 모두 출력한다. |
Return: | 인자의 갯수. |
Example: |
Syntax: | void qValueAdd(char *name, char *value); |
Function: | qDecoder()에 의해 할당된 Memory를 해제한다. |
Note: | qFreeAll() 참조. |
Example: |
Syntax: | int qSession(char *repository); |
Function: | 세션을 시작한다. |
Return: | 새로운 세션일 경우 1, 기존에 생성된 세션일 경우 0. |
Note: | 세션을 사용하기 위해서는 프로그램의 초기에 qSession()을 호출하여야 한다. qSession()은 클라이언트에 32바이트 세션ID만을 쿠키로 저장을 한후, 해당 세션 ID에 대해 설정된 자료는 서버측에 저장을 한다. 기본적으로 세션은 마지막 호출후 1800초후에 파기되며, 이는 qSessionSetTimeout()을 통해 조정할 수 있다. 쿠키가 지원되지 않는 클라이언트는 세션ID가 설정되지 않아서, 해당 클라이언트가 다음번 접속될 때 기존 세션 데이터를 읽어오지 못한다. 이렇게 쿠키가 지원되지 않는 클라이어트(예: WAP Phone)에 세션을 적용할 경우엔 URL에 세션ID를 다음과 같이 세션ID를 명시함으로써 세션을 유지할 수 있다. http://domain/application?QSESSIONID=ab77bbb49dd61cd510db121a948ab4d9&other;=arguments qSession()은 기본적으로 다음의 세션 변수를 제공한다. _Q_SESSIONID : 세션 ID (ex: ab77bbb49dd61cd510db121a948ab4d9) _Q_CREATED-GMT : 세션 생성 GMT 시간 (ex: Thu, 19-Jul-2001 21:50:19 GMT) _Q_CREATED : 세션 생성 시간 (ex: 995579419) _Q_CONNECTIONS : 접속 횟수 카운터 (ex: 15) _Q_INTERVAL : 세션 만료 주기/초 (ex: 1800) 세션 데이터는 파일시스템을 통해 기록되는데 유닉스 시스템의 경우 기본적으로 /tmp, 윈도우의 경우 "C:WindowsTemp"이며, qSession() 호출시 repository 변수에 경로를 지정함으로써 세션 스토리지 위치를 변경할 수 있다. 세션 스토리지에는 "qsession-"으로 시작하는 파일이 생성되며, 자동으로 관리된다. (WIN32 환경에서는 자동 관리되지 않으므로, 정기적으로 repository의 qsession-* 파일을 삭제하여야 한다) 세션 자료는 qSessionFree()나 qSessionSave(), qFreeAll()중 하나가 수행될 때 저장된다. |
Example: |
Syntax: | char *qSessionAdd(char *name, char *format, …); |
Function: | 세션 변수를 설정한다. |
Return: | 설정된 세션값. |
Example: |
Syntax: | int qSessionAddInteger(char *name, int valueint); |
Function: | 정수형 세션 변수를 설정한다. |
Return: | 설정된 세션값. |
Example: |
Syntax: | int qSessionUpdateInteger(char *name, int plusint); |
Function: | 정수형 세션 변수를 갱신한다. |
Return: | 갱신된 정수값 |
Syntax: | char *qSessionValue(char *format, …); |
Function: | 변수명에대한 세션값을 복귀한다. |
Return: | 성공시 세션값에 대한 문자열 포인터, 해당 변수가 없을시엔 NULL. |
Example: |
Syntax: | int qSessionValueInteger(char *format, …); |
Function: | 정수형 세션변수의 값을 복귀한다. |
Return: | 성공시 정수형 세션값, 실패시 0. |
Example: |
Syntax: | void qSessionRemove(char *format, …); |
Function: | 세션 변수를 삭제한다. |
Example: |
Syntax: | char *qSessionGetID(void); |
Function: | 세션 ID를 복귀한다. |
Return: | 32바이트 세션 ID의 문자열 포인터. |
Example: |
Syntax: | time_t qSessionGetCreated(void); |
Function: | 세션이 생성된 시각을 복귀한다. |
Return: | 1970년 1월 1일 0시 0분 0초이후부터 경과한 세션 생성시각에 대한 초. |
Example: |
Syntax: | void qSessionSetTimeout(time_t seconds); |
Function: | 세션의 만료기간을 설정한다. |
Return: | 설정된 세션 만료기간. |
Note: | 세션의 기본 만료기간은 1800초이다.. |
Example: |
Syntax: | int qSessionPrint(void); |
Function: | 프로그램의 디버깅용으로 세션 변수를 모두 출력한다. |
Return: | 세션 변수의 갯수. |
Example: |
Syntax: | void qSessionSave(void); |
Function: | 세션 정보를 즉시 저장한다. |
Note: | qSessionSave()는 qSessionFree()시 자동으로 수행된다. 프로그램의 흐름상 qSessionFree()를 만나기 전에 프로그램이 종료될 가능성이 있을 경우에, 변경된 세션 정보를 확실히 저장하기 위해 명시적으로 사용될 수 있다. |
Example: |
Syntax: | void qSessionFree(void); |
Function: | 세션을 저장하고 할당된 메모리를 해제한다. |
Example: |
Syntax: | void qSessionDestroy(void); |
Function: | 세션을 파기한다. |
Example: |
Syntax: | Q_Entry *qfDecoder(char *filename); |
Function: | 파일을 읽어 linked-list에 저장한다. (파일의 행길이 제약없음) |
Return: | Linked-list의 첫번째 레코드 포인터, 에러시 NULL. |
Note: | 다음과 같은 형식의 파일을 읽어 linked-list에 저장한다. —- test.conf —- # this is comment. name = Kim phone = 123-4567 addr = 한국 ——————- 샵(#)으로 시작되는 행은 주석으로 처리해 해석하지 않는다. |
Example: |
Syntax: | char *qfValue(Q_Entry *first, char *format, …); |
Function: | 변수명의 변수값을 얻는다. |
Return: | 성공시 변수값의 포인터, 실패시 NULL. |
Example: |
Syntax: | int qfiValue(Q_Entry *first, char *format, …); |
Function: | 변수값을 정수로 변환후 넘겨준다. |
Return: | 설공시 변수값(숫자 문자열)에 대한 정수값. 변수명이 존재하지 않거나, 해당 값이 정수로 변환 불가능 하면 0 . |
Example: |
Syntax: | char *qfValueFirst(Q_Entry *first, char *format, …); |
Function: | 동일한 변수명을 갖는 인자들을 순차적으로 패치할 때 사용. |
Return: | 성공시 동일한 변수명을 갖는 인자들에 대한 첫번째 변수값 포인터를 복귀, 변수명이 없을시 NULL. |
Example: | n”, list); } |
Syntax: | char *qfValueNext(void); |
Function: | qfValueFirst()로 찾는 것을 계속한다. |
Return: | 성공시 변수값의 포인터, 더이상의 동일 변수명이 없을때 NULL. |
Example: | n”, list); } |
Syntax: | int qfPrint(Q_Entry *first); |
Function: | 프로그램의 디버깅용으로 해석한 인자를 모두 출력한다. |
Return: | 인자의 갯수. |
Example: |
Syntax: | void qfFree(Q_Entry *first); |
Function: | 할당된 Memory를 반환한다. |
Example: |
Syntax: | Q_Entry *qsDecoder(char *str); |
Function: | 문자열을 읽어 linked-list에 저장한다. (파일의 행길이 제약없음) |
Return: | Linked-list의 첫번째 레코드 포인터, 에러시 NULL. |
Note: | 다음과 같은 형식의 문자열을 읽어 linked-list에 저장한다. —- test.conf —- # this is comment. name = Kim phone = 123-4567 addr = 한국 ——————- 샵(#)으로 시작되는 행은 주석으로 처리해 해석하지 않는다. |
Example: |
Syntax: | char *qsValue(Q_Entry *first, char *format, …); |
Function: | 변수명의 변수값을 얻는다. |
Return: | 성공시 변수값의 포인터, 실패시 NULL. |
Example: |
Syntax: | int qsiValue(Q_Entry *first, char *format, …); |
Function: | 변수값을 정수로 변환후 넘겨준다. |
Return: | 설공시 변수값(숫자 문자열)에 대한 정수값. 변수명이 존재하지 않거나, 해당 값이 정수로 변환 불가능 하면 0 . |
Example: |
Syntax: | char *qsValueFirst(Q_Entry *first, char *format, …); |
Function: | 동일한 변수명을 갖는 인자들을 순차적으로 패치할 때 사용. |
Return: | 성공시 동일한 변수명을 갖는 인자들에 대한 첫번째 변수값 포인터를 복귀, 변수명이 없을시 NULL. |
Example: | n”, list); } |
Syntax: | char *qsValueNext(void); |
Function: | qsValueFirst()로 찾는 것을 계속한다. |
Return: | 성공시 변수값의 포인터, 더이상의 동일 변수명이 없을때 NULL. |
Example: | n”, list); } |
Syntax: | int qsPrint(Q_Entry *first); |
Function: | 프로그램의 디버깅용으로 해석한 인자를 모두 출력한다. |
Return: | 인자의 갯수. |
Example: |
Syntax: | void qsFree(Q_Entry *first); |
Function: | 할당된 Memory를 반환한다. |
Example: |
Syntax: | Q_Entry *qSedArgAdd(Q_Entry *first, char *name, char *format, …); |
Function: | qSedFile()과 qSedStr()에서 사용할 name, value 쌍 인자를 인자 목록에 추가한다. |
Return: | 인자 목록의 첫번째 포인터. |
Example: |
Syntax: | Q_Entry *qSedArgAddDirect(Q_Entry *first, char *name, char *value); |
Function: | qSedFile()과 qSedStr()에서 사용할 name, value 쌍 인자를 인자 목록에 추가한다. |
Return: | 인자 목록의 첫번째 포인터. |
Note: | 기존의 qSedArgAdd() 함수는 value 값으로 format에 의한 가변인자를 사용하기 때문에 크기가 1024-1 바이트로 제한된다. 따라서 본 함수는 qSedArgAdd()의 확장 함수로써, 보다 큰 크기의 value 값을 삽입하기 위해 사용한다. |
Example: |
Syntax: | int qSedArgPrint(Q_Entry *first); |
Function: | 프로그램의 디버깅용으로 변수를 모두 출력한다. |
Return: | 인자의 갯수. |
Example: |
Syntax: | void qSedArgFree(Q_Entry *first); |
Function: | qSedArgAdd()에 의해 할당된 Memory를 해제한다. |
Example: |
Syntax: | int qSedFile(Q_Entry *first, char *filename, FILE *fpout); |
Function: | 파일에서 지정된 기호를 정의된 문자열로 교체하여 출력하며, 일부 SSI 문법을 지원한다. |
Return: | 성공시 1, 파일을 열 수 없을경우 0. |
Note: | UNIX 시스템의 SED 명령과 흡사한 기능을 한다. —- ex) streamedit.html.in —- <!–#include file="streamedit-header.html.in"–> <p>Hi <b>${NAME}</b>. <p>You got a really cool hobby. <br>I’m sure that your hobby, <b>${HOBBY}</b>, can make your life more compatible. <p>Bye 🙂 <!–#include file="streamedit-tailer.html.in"–> ——————— qSedFile를 활용하면, 프로그램내에 HTML 코드를 전혀 포함하지 않고도 CGI 프로그래밍을 할 수 있다. UI와 관련된 디버깅 시간을 대폭 줄일 수 있고, 디자인과 개발의 분리작업이 가능하며, 패키지 제품의 경우 사용자 측면에서 손쉽게 커스터 마이징이 가능할 수 있는등의 효용성을 동반할 수 있다. filename은 입력(대상)파일이고, fpout은 출력 스트림을 의미한다. 결과를 파일로 출력을 하고 자 할경우엔 파일을 "w"로 열어, 해당 파일 포인터를 건네어 주면 되고, 화면 출력하고자 한다면, 그냥 stdout 을 지정하면 된다. 또한, SSI 문법을 해석한다. (현재는 <!–#include file="FILEPATH"–> 만이 지원됨) 문서내 다음과 같은 라인이 있을 경우, 해당 문서를 포함하여 출력되며, 포함되는 문서에 대해서도 교체및 SSI 기능은 그대로 유효하다. (Cascading) <!–#include file="streamedit-header.html.in"–> 주의) include 되는 파일은 CGI가 실행되는 위치를 기준으로 상대경로 표기 하거나, 시스템 절대경로 표기한다. 문자열 교체를 하지않고, SSI 기능만을 사용코자 할 경우엔 다음과 같이 arg 인자로 NULL 값을 전달한다. ex) qSedFile(NULL, "streamedit.html.in", stdout); |
Example: |
Syntax: | int qSedStr(Q_Entry *first, char *srcstr, FILE *fpout); |
Function: | qSedFile()과 동일한 기능을 하나, 입력을 문자열로 받는다. |
Return: | qSedFile()과 동일. |
Example: |
Syntax: | int qAwkOpen(char *filename, char separator); |
Function: | 파일을 열고, 구분자를 설정한다. |
Return: | 성공시 1, 파일을 열 수 없을경우 0. |
Note: | UNIX 시스템의 AWK 명령과 흡사한 기능을 한다. —- ex) /etc/passwd —- shpark:x:1008:1000:Sang-hyun Park:/home/shpark:/bin/csh teamwork:x:1011:1000:Seung-young Kim:/home/teamwork:/bin/csh kikuchi:x:1015:2000:KIKUCHI:/home/kikuchi:/bin/csh ————————- |
Example: |
Syntax: | int qAwkNext(char array[][1024]); |
Function: | 한행을 읽어 들여, 인자로 주어진 배열에 저장한다. |
Return: | 성공시 필드 수, 파일의 끝 -1. |
Note: | 한 라인의 총길이는 제한이 없으나, 구분자로 구분되는 각 필드는 1024-1 바이트를 넘어선 안된다. |
Example: |
Syntax: | Q_BOOL qAwkClose(FILE *fp); |
Function: | 오픈된 파일을 닫는다. |
Return: | 성공시 Q_TRUE, 오류시 Q_FALSE |
Example: |
Syntax: | int qAwkStr(char array[][1024], char *str, char delim); |
Function: | 문자열을 구분자로 나눠 인자로 주어진 배열에 저장한다. |
Return: | 분리자로 분리된 필드의 갯수. |
Note: | 문자열의 길이는 제한이 없으나, 구분자로 구분되는 각 필드는 1024-1 바이트를 넘지 않아야 한다. |
Example: |
Syntax: | int qArgMake(char *str, char **qlist); |
Function: | 쿼리를 토큰으로 분리한다. 구분자는 기본적으로 스페이스 문자 이며 쿼리의 앞뒤 공백과 토큰 사이의 중복된 스페이스는 무시된다. |
Return: | 구분된 토큰 수. |
Note: | 검색어 관련 함수군은 질의 문자열을 스페이스와 큰따옴표(") 기준으로 나누어 리스트에 담아주며, 대상 문자열과의 매칭 테스트와 출력에 관련된 함수군을 제공한다. —- Example —- Query Input: I am a "pretty girl" —————– | | V V —- qArgMake() —- qlist[0] = I qlist[1] = am qlist[2] = a qlist[3] = pretty girl qlist[4] = NULL Return: 4 (4 Tokens) ——————– | | V V —- qArgPrint() —- ‘I’ (1 bytes) ‘am’ (2 bytes) ‘a’ (1 bytes) ‘pretty girl’ (11 bytes) ——————— | | V V —- qArgMatch() —- Target String: Hi, I’m a pretty boy. Are you pretty girl? = = = = =========== 0 0 2 2 3 Return: 3 (3 matches: qlist[0], qlist[2], qlist[3]) ——————— | | V V —- qArgEmprint() —- Target String..: Hi, I’m a pretty boy. Are you pretty girl? Result………: Hi, I’m a pretty boy. Are you pretty girl? = = = = =========== 1 2 3 4 5 Return: 5 (5 matches) ———————– |
Example: |
Syntax: | int qArgMatch(char *str, char **qlist); |
Function: | 대소문자를 구분하지 않고 토큰 매칭 테스트를 한다. |
Return: | 특정 문자열에서 발견되는 토큰의 개수를 복귀. |
Note: | 같은 토큰에 대해서는 중복되어 매칭되어도 1회로 계산한다. 중복 매칭을 포함하여 문자열내 총 매칭 카운트를 위해서는 qArgEmprint()의 복귀값을 참고하라. 이 값들은 qArgMake()에서 얻은 토큰의 총 개수로 백분율하여 검색 정확도를 계산하는데 쓰일 수 있다. |
Example: |
Syntax: | int qArgEmprint(int mode, char *str, char **qlist); |
Function: | 문자열에서 토큰과 매칭되는 부분을 볼드(bold)처리하여 출력한다. 대소문자를 구분하지 않는다. |
Return: | 문자열에서 발견된 토큰의 개수를 복귀하며, qArgMatch()와는 다르게 중복 매칭을 포함하여 총 매칭 카운트를 복귀한다. |
Note: | mode값은 qPrintf()와 동일하며, 일반적인 목적엔 1이 주로 사용될 수 있겠다. |
Example: |
Syntax: | int qArgPrint(char **qlist); |
Function: | 프로그램의 디버깅용으로 해석된 토큰을 모두 출력한다. |
Example: |
Syntax: | void qArgFree(char **qlist); |
Function: | 메모리 할당된 qlist를 해제한다. |
Example: |
Syntax: | void qContentType(char *mimetype); |
Function: | MimeType을 출력한다. |
Note: | 여러번 호출되어도 단 한번만 수행된다. |
Example: |
Syntax: | int qGetContentFlag(void); |
Function: | qContextType()이 호출되었는지를 체크한다. |
Return: | qContentType()이 이미 호출되었으면 1, 호출되지 않았으면 0. |
Example: |
Syntax: | void qResetContentFlag(void); |
Function: | qContentType()의 내부 플래그를 초기 상태로 셋팅한다. |
Note: | qContentType()은 여러번 호출되어도 한번만 수행이 되는데, 이를 강제적으로 다시 출력하고자 할 경우에 qResetContentFlag()를 수행한 후 qContentType()을 호출하면 중복 출력이 가능하다. |
Example: |
Syntax: | void qRedirect(char *url); |
Function: | HTTP의 Location: 헤더를 사용해 특정 페이지로 점프한다. |
Note: | qRedirect는 HTTP 헤더를 사용하므로 해당 프로세스에서 스트림 아웃하는 유일한 출력이어야 한다. |
Example: |
Syntax: | void qJavaScript(char *format, …); |
Function: | 자바스크립트 코드를 출력한다. |
Note: | 이 함수는 다음의 내용을 stdout 으로 출력한다. <script language="JavaScript"> YOUR CODES HERE </script> |
Example: |
Syntax: | char *qURLencode(char *str); |
Function: | 문자열을 URL Encoding 한다. |
Return: | URL Encoding된 문자열이 메모리 할당되어 복귀된다. 해제(free)는 사용자가 하여야 한다. |
Note: | ‘@’, ‘.’, ‘/’, ”, ‘-‘, ‘_’, ‘:’ 문자는 인코딩 하지 않는다. |
Example: |
Syntax: | char *qURLdecode(char *str); |
Function: | %xx로 URL Encoding된 문자열을 해독한다. |
Return: | 해독된 문자열 포인터 |
Note: | 인자(str)를 직접 수정한다. |
Example: |
Syntax: | char *qMD5Str(char *string); |
Function: | 문자열에 대한 MD5 핑거프린트(체크섬)을 계산한다. |
Return: | 32 바이트 핑거프린트 문자열 포인터. |
Note: | 복귀 스트링 포인터는 사용자가 매번 free()하는 번거로움을 없애기 위해 메모리를 할당하여 반환치 않고 함수 내부에 static 선언되어 있다. 따라서 함수가 수행될 때 마다 이전 값이 지워짐에 유의하여야 한다. 또한 반환되는 문자열 포인터를 사용하여 직접적으로 수정하거나 free()하여서는 안된다. |
Example: |
Syntax: | char *qMD5File(char *string); |
Function: | 파일에 대한 MD5 핑거프린트(체크섬)을 계산한다. |
Return: | 32 바이트 핑거프린트 문자열 포인터. |
Note: | 복귀 스트링 포인터는 사용자가 매번 free()하는 번거로움을 없애기 위해 메모리를 할당하여 반환치 않고 함수 내부에 static 선언되어 있다. 따라서 함수가 수행될 때 마다 이전 값이 지워짐에 유의하여야 한다. 또한 반환되는 문자열 포인터를 사용하여 직접적으로 수정하거나 free()하여서는 안된다. |
Example: |
Syntax: | unsigned int qFnv32Hash(char *str, unsigned int max); |
Function: | This function will be released at 8.1R |
Syntax: | void qPuts(int mode, char *buf); |
Function: | 포맷에 의한 인자 전달이 안된다는 점을 제외하면 qPrintf()와 동일하다. |
Note: | 주어진 인자 buf 자체를 수정하기 때문에, 상수 문자열(ex: str = "문자열")이나 다시 사용되어야 하는 변수를 qPuts()로 출력하진 말아햐 한다. qPuts()가 존재하는 이유는 qPrintf()에서와 같은 인자 스트링의 길이 제한이 없으며 strdup() 함수가 사용되지 않기에 조금 더 빠르기 때문이다. 인자로 전해준 문자열이 변형된다. 따라서 qPuts(mode, "문자열"); 이런식의 상수 문자열 사용은 오류를 잃으킨다. 이때에는 예제에서와 같이 인자를 복사한후 사용한다. |
Example: |
Syntax: | char *qRemoveSpace(char *str); |
Function: | 문자열의 앞뒤 공백과 CR, LF를 제거한다. |
Return: | 성공시 문자열의 포인터, 실패시 NULL. |
Note: | qRemoveSpace("문자열"); 이런식의 사용은 오류를 잃으킬수 있다. 이때에는 예제에서와 같이 인자를 복사한후 사용한다. |
Example: |
Syntax: | char *qRemoveTailSpace(char *str); |
Function: | This function will be released at 8.1R |
Syntax: | char *qStrReplace(char *mode, char *srcstr, char *tokstr, char *word); |
Function: | 문자열에 대한 문자열 및 토큰 치환을 한다. |
Return: | 치환된 스트링 포인터. |
Note: | ‘mode’ 인자는 "sr"와 같이 두개의 분리된 문자로 구성된 문자열이다. 첫번째 문자는 치환방법을 정의하며 ‘t’나 ‘s’가 위치할 수 있다. ‘t’는 [t]oken을 의미하며 tokstr 문자열의 각 문자를 토큰으로 소스 문자열 srcstr을 비교하여, 매칭이 되는 문자를 word 문자열로 치환한다. ‘s’는 [s]tring을 의미하여 tokstr 스트링 자체를 하나의 토큰으로 하여 소스 스트링내에 나타나는 tokstr 매칭 문자열을 word 문자열로 치환한다. 두번째 문자는 치환된 문자열에 대한 기록 형태를 나타내며 ‘n’과 ‘r’이 사용될 수 있다. ‘n’은 [n]ew를 나타내며 치환된 결과 문자열을 새로운 메모리 공간에 저장하여 해당 포인터를 리턴하게 한다. 따라서 소스 스트링 자체는 원상태가 유지되고 해당 메모리는 사용자 측면에서 free() 되어야 한다. ‘r’은 [r]eplace를 의미하며 치환 결과를 srcstr에 덮어 씀을 의미한다. 이때 srcstr이 충분히 여유있다고 가정하므로(편리성의 이유로 메모리 재할당을 하지 않음) [r]eplace 모드를 사용하고자 할 때에는 이 점에 유의하여야 한다. 결과적으로 ‘mode’ 인자는 다음과 같이 4개의 조합 가능한 경우를 갖는다. Mode "tn" : [t]oken 치환 & 새로운 공간에 결과를 담아 복귀 Mode "tr" : [t]oken 치환 & 인자 자체를 수정 Mode "sn" : [s]tring 치환 & 새로운 공간에 결과를 담아 복귀 Mode "sr" : [s]tring 치환 & 인자 자체를 수정 |
Example: |
Syntax: | int qStr09AZaz(char *str); |
Function: | 문자열이 0-9, A-Z, a-z로 이루어졌는지 판별한다. |
Return: | 조건에 부합하면 1, 오류시 0. |
Example: |
Syntax: | char *qStrupr(char *str); |
Function: | 인자로 주어진 문자열을 모두 대문자로 변환한다. |
Return: | 해당 문자열의 포인터. |
Example: |
Syntax: | char *qStrlwr(char *str); |
Function: | 인자로 주어진 소자열을 모두 대문자로 변환한다. |
Return: | 해당 문자열의 포인터. |
Example: |
Syntax: | char *qStristr(char *big, char *small); |
Function: | strstr() 함수와 같으나, 대소문자를 구분하지 않고 비교한다. |
Return: | strstr()과 같음. |
Example: |
Syntax: | int qStricmp(char *s1, char *s2); |
Function: | strcmp() 함수와 같으나, 대소문자를 구분하지 않는다. |
Return: | strcmp()와 같음. |
Example: |
Syntax: | int qStrincmp(char *s1, char *s2, size_t len); |
Function: | strncmp() 함수와 같으나, 대소문자를 구분하지 않는다. |
Return: | strncmp()와 같음. |
Example: |
Syntax: | char *qitocomma(int value); |
Function: | 숫자를 콤마 문자열로 변환한다. |
Return: | 문자로 변환된 스트링 포인터. |
Note: | 복귀 스트링 포인터는 사용자가 매번 free()하는 번거로움을 없애기 위해 메모리를 할당하여 반환치 않고 함수 내부에 static 선언되어 있다. 따라서 qitocomma()는 매번 동일한 스트링 포인터를 반환하게 되며 함수가 수행될 때 마다 이전 값이 지워짐에 유의하여야 한다. |
Example: |
Syntax: | char *qStrcat(char str, char *format, …); |
Function: | This function will be released at 8.1R |
Syntax: | char *qStrdupBetween(char *str, char *start, char *end); |
Function: | This function will be released at 8.1R |
Syntax: | FILE *qfopen(char *path, char *mode); |
Function: | 락(lock)에 의한 파일 오픈 함수 |
Return: | fopen()과 동일 |
Note: | 반드시 qfclose() 함수로 파일을 닫아야 한다. |
Example: |
Syntax: | int qfclose(FILE *stream); |
Function: | qfopen()의 의해 열린 파일 스트림을 닫는다. |
Return: | fclose()과 동일 |
Syntax: | int qCheckFile(char *format, …); |
Function: | 파일의 존재여부를 파악한다. |
Return: | 파일이 존재 하면 1, 파일이 없으면 0. |
Note: | Permission에 의해 접근 불가능한 파일도 파일이 없다고 판단한다. |
Example: |
Syntax: | int qCatFile(char *format, …); |
Function: | 파일의 내용을 출력한다. |
Return: | 정상시 출력된 문자수, 에러시 -1. |
Example: |
Syntax: | char *qReadFile(char *filename, int *size); |
Function: | 파일을 읽어 메모리에 저장후 포인터를 반환한다. |
Return: | 정상시 스트링 포인터, 오류시 NULL. |
Note: | qReadFile은 실제 파일의 크기보다 1바이트 크게 메모리 할당 하여 스트링 종료문자 ‘ |