Tmax FDL Reference Manual Copyright 2000 TmaxSoft Co., Ltd. All Rights Reserved
Copyright Notice Copyright 2000 TmaxSoft Co., Ltd. All Rights Reserved. TmaxSoft Co., Ltd. 대한민국서울시강남구대치동 946-1 글라스타워 18 층우 )135-708 Restricted Rights Legend This software and documents are made available only under the terms of the TmaxSoft License Agreement and may be used or copied only in accordance with the terms of this agreement. No part of this document may be reproduced, transmitted, or translated in any form or by any means, electronic, mechanical, manual, or optical, without the prior written permission of TmaxSoft Co., Ltd. 소프트웨어및문서는오직 TmaxSoft Co., Ltd. 와의사용권계약하에서만이용이가능하며, 사용권계약에따라서사용하거나복사할수있습니다. 또한이매뉴얼에서언급하지않은정보에대해서는보증및책임을지지않습니다. 이매뉴얼에대한권리는저작권에보호되므로발행자의허가없이전체또는일부를어떤형식이나, 사진녹화, 기록, 정보저장및검색시스템과같은그래픽이나전자적, 기계적수단으로복제하거나사용할수없습니다. Trademarks Tmax, WebtoB, WebT, and JEUS are registered trademarks of TmaxSoft Co., Ltd. All other product names may be trademarks of the respective companies with which they are associated. Tmax, WebtoB, WebT, JEUS 는 TmaxSoft Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Document Edition Date Version TMFR-0107-05-400 Jan 7, 2006 Tmax 4.0 Tmax 제품은아래표와같습니다. 본서는 Tmax Standard 와옵션중에굵게기울임꼴로인쇄되어있는내용을포함하고있습니다. Tmax Standard Tmax Options TP Function + 2 Phase Commit Web Admin Console, X.25 Gateway, TCP/IP Gateway, Host- 1
Link, Power Builder Interface Module, SERIAL Gateway, TCP/IP Service Gateway 2
이책에관하여 누구를위한책인가? 본매뉴얼은 Tmax 에서 FDL(Field Definition Language) 버퍼타입을사용하는 3-tier architecture system 을구현하는개발자들을대상으로한다. 본매뉴얼은개발자들이서비스프로그램 ( 서버 ) 및클라이언트프로그램을개발할때 FDL buffer type 과관련된 API 함수를좀더깊이있게이해하고사용할수있도록도움을줄것을목표로하고있다. 본매뉴얼에기술되어있는내용은 SUN 32bit, SUN 64bit, Compaq, HP 32bit, HP64bit, Linux, Windows NT 3.0/4.0 and Windows 2000 에서테스트및검증되었다. 본매뉴얼은 Tmax System 을사용하는환경이 UNIX 라고가정하고있고, 사용자가 UNIX 환경및현재사용되고있는각 UNIX 기종의특성들에기본지식이있다는가정하에작성되었다. 만약사용자가 UNIX 의명령어나유틸리티사용법등에관한기본지식이없다면, 관련서적을참고하거나시스템매뉴얼을참고해야할것이다. 어떻게사용하는가? 본매뉴얼은크게두부분으로구성되어있으며그내용은다음과같다. 제 1장 : FDL 개요및특징제 2장 : FDL 관련 API 에대한기능설명및사용법 제 1 장은개발자들이 FDL 에대한개념을정확하게이해하는데도움을줄것이며, 제 2 장은개발자들이 FDL 을사용하는프로그램 ( 서비스프로그램및클라이언트프로그램 ) 을구현할때사용되는 API 함수의 prototype, 기능, 파라미터, 리턴값, 발생할수있는에러메시지및간단한예제프로그램등을설명하고있다. 관련서 Tmax Programming Guide ( C ) Tmax Administration Guide 3
Tmax Reference Manual 규약 규 약 설 명 { } [ ] ( ) Numeric String Literal 필수항목옵션항목지정된여러개의값중배타적인선택구분자디폴트값숫자 abc 형태의문자열 abc 형태의문자열 4
차례 1 FDL 개요및특징... 8 1.1 FDL 개요... 8 1.1.1 용어정의... 8 1.2 FDL 소개... 9 1.2.1 C 구조체에관하여... 9 1.2.2 필드버퍼에관하여... 10 1.3 FDL 테이블생성... 10 1.3.1 demo.f... 10 1.3.2 사용방법... 12 1.3.3 사용예제... 13 2 FDL Reference... 14 2.1 FDL API... 14 2.1.1 fballoc... 14 2.1.2 fbbufop... 17 2.1.3 fbbufop_proj... 23 2.1.4 fbcalcsize... 26 2.1.5 fbchg_tu... 28 2.1.6 fbchg_tut... 31 2.1.7 fbdelall... 34 2.1.8 fbdelall_tu... 36 2.1.9 fbdelete... 38 2.1.10 fbextread... 41 2.1.11 fbfldcount... 45 2.1.12 fbfprint... 47 2.1.13 fbfree... 49 2.1.14 fbftos... 51 2.1.15 fbget... 56 2.1.16 fbgetalloc_tu... 59 2.1.17 fbgetalloc_tut... 62 2.1.18 fbget_fbsize... 66 2.1.19 fbget_fldkey... 68 5
2.1.20 fbget_fldname... 70 2.1.21 fbget_fldno... 72 2.1.22 fbget_fldtype... 74 2.1.23 fbgetlast_tu... 76 2.1.24 fbget_strfldtype... 79 2.1.25 fbget_tu... 81 2.1.26 fbget_tut... 84 2.1.27 fbget_unused... 87 2.1.28 fbget_used... 89 2.1.29 fbgetf... 91 2.1.30 fbgetlen... 94 2.1.31 fbgetnth... 96 2.1.32 fbgetntht... 98 2.1.33 fbgetval... 101 2.1.34 fbgetvali... 104 2.1.35 fbgetval_last_tu... 107 2.1.36 fbgetvall_tu... 110 2.1.37 fbgetvals... 113 2.1.38 fbgetvals_tu... 116 2.1.39 fbgetvalt... 118 2.1.40 fbinit... 121 2.1.41 fbinsert... 123 2.1.42 fbisfbuf... 126 2.1.43 fbispres... 128 2.1.44 fbkeyoccur... 130 2.1.45 fbmake_fldkey... 132 2.1.46 fbnext_tu... 134 2.1.47 fbprint... 137 2.1.48 fbput... 139 2.1.49 fbputt... 141 2.1.50 fbrealloc... 144 2.1.51 fbread... 146 2.1.52 fbsnull... 148 2.1.53 fbstelinit... 151 2.1.54 fbstinit... 153 2.1.55 fbstof... 155 2.1.56 fbstrerror... 159 2.1.57 fbtypecvt... 161 2.1.58 fbupdate... 164 2.1.59 fbwrite... 167 2.1.60 getfberrno... 169 2.1.61 getfberror... 171 6
7
1 FDL 개요및특징 1.1 FDL 개요 데이터형과그유형에할당되는메모리의양은각각의플랫폼마다다르다. 이러한메모리할당의방법차로인해같은데이터형을사용하더라도통신후의데이터값은예상과다를수있었다. 각각의서로다른플랫폼간에데이터값을동일하게인식하기위해서보통사용하는방법이데이터를문자열로변환하여통신하는것인데, 이러한방식을이용할경우추가적인네트워크의부하가발생할수있다. Tmax 는이러한통신상의문제를해결하기위해 FDL 방식을제공하고있다. FDL(Field Definition Language) 은필드버퍼라고하는저장구조를정의하고조작하는일련의 C 함수의집합이라할수있다. FDL 방식은식별자와식별자에대응하는필드버퍼에서의데이터값이하나의쌍으로존재하여서로다른종류의프로세스간에데이터를상호교환할수있도록구현된방식이다. FDL 함수는필드버퍼를사용하여서로다른프로세스간에데이터를교환하기위해필드를조작 ( 저장, 수정, 삭제 ) 하는데사용하는함수이다. 따라서이러한 FDL 함수들을이용하여효율적인프로그램을구현하기위해 FDL 의장단점을잘파악하고앞으로소개될함수의정의와사용예제프로그램을통하여 FDL 의모든기능들을잘활용할수있도록개발자들에게도움을주는것이본매뉴얼의목적이다. 1.1.1 용어정의 필드식별자 : FDL 레코드나필드버퍼내에서독립적인데이터항목에대한태그로본매뉴얼전반에서필드키 (fieldkey) 로불려질것이다. 필드버퍼 : 데이터와데이터를식별하는필드키를보관하는버퍼이다. 필드형 : 필드의형은표준 C(ANSI C) 에서제공하는 short, integer, long, float, double, char 등어느것이든될수있다. Tmax에서 지원하는또다른형으로는 string과 carray가있다. 8
필드순번 : 필드를조작및처리하는데있어필드키버퍼내에서동일한 필드키가여러번반복해서나타날경우지정하는인덱스이 다. 1.2 FDL 소개 레코드를표현하는방법은매우다양하다. 그중에서 C 언어에서제공되는데이터구조체인 struct 를사용하여레코드를표현하는방법과필드버퍼를사용하여레코드를표현하는방법의차이점에대해서살펴보기로한다. 1.2.1 C 구조체에관하여 예를들어 C 언어로작성된프로그램에서어떤학생의 id, 이름, 주소, 나이및성별등의정보를포함하고자한다면, 다음과같이구조체를사용하여필드를나눌수있을것이다. struct student { long stid; char name[10]; char addr[40]; short age; char sex; } ; 여기에서 stid 는 long 형의변수로선언되어있고, name 과 addr 은문자형배열 [carray], age 는 short 그리고 sex 는 character 형의변수로선언되어있다. 변수 x 를지정하여구조체 student 를가리키게한다면다음과같이표현될수있으며이들을필드의주소로사용할수있게된다. x->stid, x->name, x->addr, x->age, x->sex 구조체를다른프로세스에전달하려면, 해당구조체의필드중사용하지않는필드를포함하여모든필드의데이터를전달하여야한다. 즉고정된길이의레코드로통신하여야한다. 또한구조체필드의이름이바뀌면해당구조체의필드를사용하는모든프로그램을재컴파일해야한다. 9
1.2.2 필드버퍼에관하여 필드버퍼는이와다른방법으로레코드를필드로분할한다. 필드버퍼는레코드들의각필드들간에연관성있는접근을제공하는데이터구조이다. 필드명은필드의데이터유형과함께데이터가저장된필드키값을나타내는것으로 16 자까지사용할수있다. 필드버퍼의주된장점은데이터의독립성이다. 해당필드를사용하는모든프로그램을재컴파일하지않고도필드의데이터유형과길이를변경할수있을뿐만아니라각필드의길이를가변적으로사용할수있다. 그리고위에서설명한구조체에서는사용하지않는필드도함께전체구조체를전송해야만했지만, 필드키방식은실제사용하는필드의값만전송할수있다. 필드버퍼의각필드는데이터유형과유일한식별번호의조합으로구성된다. 이러한정수형의식별번호를필드키라고하며필드버퍼는필드키와데이터의쌍들을저장한다. 다음장에서는필드테이블을생성하는과정을살펴보도록하겠다. 1.3 FDL 테이블생성 필드테이블은 Tmax 에서제공하는 fdlc 유틸리티를이용하여일정한형식에맞춘일반텍스트파일을컴파일하여만든다. 다음은필드유형과유일한번호가정의된사용자정의파일의예이다. 이파일의형식만이 Tmax 에서의사용이가능하다. 1.3.1 demo.f # name number type flags comments *base 100 INPUT 101 string - - OUTPUT 102 string - - 10
SEQNO 201 string - - CORPNO 202 string - - COMPDATE 203 string - - TOTMON 204 long - - GUARAT 205 float - - GUAMON 206 float - T_BITMAP 900 carray - - FILENAME 901 string - - NEWFILE 902 string - - *base 1000 data1 301 long - - data2 302 long - - data3 303 long - - sumdata 304 long - - data4 305 long - - 이필드테이블은 name, number, type 을반드시정의해야사용할수있다. name 은최대 48 자이하로정의된필드이름이며이이름을 fbget_fldkey() 의인자로사용하여필드식별자를얻어오는기능들을한다. 11
number 는 type 와조합되어필드식별자를만드는데사용되는번호이다. 말한바와같이 number 와 type 을조합하여필드식별자를만드는데, type 은유일할수없으므로반드시 number 는모든필드테이블에서유일한번호이어야한다. 위의 demo.f 예제에서 *base 번호 는 base 가쓰인이후의 number 에대한 base 가되는것으로실제로 INPUT 의 number 를 201 이라고쓴것과같은역할을한다. 이 base 는또다른 base 가나오기전까지유효하다. type 은해당필드의타입을설정한다. 사용할수있는필드타입은 char, short, int, long, float, double, string, carray 로총 8 가지이다. 사용자는이파일을 fdlc 유틸리티를이용하여필드테이블을생성할수있다. 1.3.2 사용방법 fdlc [-a -c -u -d] {-i 필드키테이블파일이름 } [-o 결과물이름 ] [-h 헤더파일이름 ] [-f 대상파일이름 ] [-ji -jc] [-p 패키지이름 ] -a : 이미존재하는이진파일 (default 는 tmax.fdl) 에 i 옵션뒤에나오는필드키테이블파일을컴파일하여추가한다. -c : 필드키테이블을컴파일하여이진형태의파일을만든다. 이미이진파일 (default 는 tmax.fdl) 이존재한다면새내용을덮어쓴다. -u : 이미존재하는이진파일 (default 는 tmax.fdl) 에 i 옵션뒤에나오는필드키테이블파일을컴파일하여정정하거나추가하는옵션이다. -d : 이미존재하는이진파일 (default 는 tmax.fdl) 에 i 옵션뒤에나오는필드키테이블파일을컴파일하여삭제한다. -i : 필드키테이블을정의한파일을지정한다. 이옵션은필수옵션이며절대경로를지정할수있다. -o : 결과물 (.fdl) 파일을지정한다. 이옵션을설정하지않은경우 tmax.fdl 이결과물파일이된다. -h : 헤더파일을지정한다. 이옵션을설정하지않은경우 fdl 헤더파일이름은 필드키테이블이름 _fdl.h 이다. 12
-f : -a,-u,-d 옵션사용시에설정하는옵션으로결과물파일을지정하는옵션이다. 이옵션을설정하지않은경우 tmax.fdl 이결과물파일이된다. -ji : webt 를사용하여 Tmax 를사용하는경우에사용하기위한옵션으로서 fdlc 유틸리티를사용하여 java interface 를생성한다. -jc : webt 를사용하여 Tmax 를사용하는경우에사용하기위한옵션으로서 fdlc 유틸리티를사용하여 java class 를생성한다. -p : class 또는 interface 의패키지를설정한다. 1.3.3 사용예제 $fdlc -c -i demo.f 위의 demo.f 를 fdlc 를사용하여컴파일하면 demo_fdl.h 와 tmax.fdl 이라는파일이기본적으로생성된다. 여기에서생성되는파일이름을변경하고싶다면다음과같이 o 옵션을사용하여원하는파일이름으로이진파일을생성할수있다. $fdlc -c -i demo.f -o filename.fdl 이러한과정을통하여생성되는파일은클라이언트와서버가필드버퍼를사용하여통신하는경우참조 ( 프로그램과함께컴파일됨 ) 되어원하는데이터유형의필드를사용할수있도록해준다. 필드버퍼를사용할때는반드시환경변수인 FDLFILE 에 filename.fdl 의위치를다음과같이정의해주어야한다. ( 여기에서 filename.fdl 이란, fdlc 에의해서생성된이진파일을말한다. default 인 tmax.fdl 이나, -o 옵션을주어생성한이진파일을적는다.) FDLFILE=/home/tmax/sample/fdl/filename.fdl 필드테이블을사용할때는반드시필드키는도메인내에서유일해야한다는점을주의해야한다. fdlc 에대한더자세한사항은 Tmax Reference Manual 을참조하기바란다. 13
2 FDL Reference 2.1 FDL API 2.1.1 fballoc 2.1.1.1 이름 fballoc : 필드버퍼의크기계산및메모리할당 2.1.1.2 사용방법 #include <fbuf.h> #include <atmi.h> FBUF *fballoc(int count, FLDLEN datalen) 2.1.1.3 설명 이함수는 fbcalcsize(),tpalloc() 와 tpinit() 을조합한것으로서사용하고자하는필드의개수와데이터의길이를 argument 로전달하면필드버퍼의크기를계산하고계산된크기만큼의필드버퍼를메모리에할당한다. argument 로전달된값으로계산한결과가 1024 byte 보다작은경우에는 default 로 1024 byte 가할당된다. 이함수를사용하면사용하고자하는크기만큼만메모리를할당받으므로메모리의낭비를막을수있다. 또한이함수에의해서할당받은버퍼는사용을마친후에는반드시 fbfree() 함수를사용하여해제해야한다. count 는데이터를저장할필드의개수를의미하고 datalen 은필드버퍼에저장될데이터의전체크기를바이트단위로지정한다.(allocation 되는 memory size 는 count*sizeof(int) + datalen + 필드키헤더사이즈 가된다.) 14
2.1.1.4 반환값 함수수행을성공하면메모리의포인터를리턴하고, 필드버퍼를메모리에할당하는것을실패할경우 NULL 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.1.5 오류 다음과같은상황에서 fballoc() 은실패하고, fberrno 에아래값중하나가설정된다. FBEMALLOC 시스템에러 필드버퍼를메모리에할당하는것을실패하였다. 2.1.1.6 예제 #include <fbuf.h> #include <atmi.h>... FBUF *fbuf; if ((fbuf = fballoc(100, 1000)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... /* result allocated size : 1408 bytes */ 필드버퍼를메모리에할당하는다른방법은 tpalloc() 을이용하는것이다. 아래의예제프로그램에서볼수있는바와같이 tpalloc() 함수의세번째 argument 에 0 을넣으면 default 값인 1024 byte 가할당된다. 물론이 argument 에 1024 byte 보다작은수를넣어도역시 default 값인 1024 byte 가할당된다.... FBUF *fbuf; if ((fbuf = (FBUF *)tpalloc( FIELD, NULL, 0)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... 15
/* result allocated size : 1024 bytes */ 2.1.1.7 참조 fbisfbuf(), fbcalcsize(), tpalloc(), fbinit() 16
2.1.2 fbbufop 2.1.2.1 이름 fbbufop : 필드버퍼내에서필드데이터의이동, 복사, 비교, 결합 2.1.2.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbbufop(fbuf *dest, FBUF *src, int mode) 2.1.2.3 설명 이함수는필드버퍼와관련하여필드데이터의이동, 복사, 비교등을 input argument mode 에명시되어있는처리모드에따라수행하는함수이다. fbbufop() 함수의처음두 argument 인 dest 와 src 필드버퍼는같은버퍼를사용할수없고반드시따로메모리에할당된다른버퍼를사용하여야한다. Process Modes FBMOVE src 필드버퍼의내용을 dest 필드버퍼로복사한다. 이모드에서는 dest argument 에 string 또는 carray 버퍼를사용할수있다. 단 string 또는 carray 버퍼를사용하려면 dest argument 를사용할때필드버퍼 (FBUF *) 로 type casting 을해주어야한다. FBCOPY src 필드버퍼의내용을 dest 필드버퍼로복사한다. 이모드에서는반드시 dest, src argument 모두필드버퍼이어야한다. FBCOMP 17
dest, src 두필드버퍼의내용을비교하여 matching 되면 1또는 0 을리턴하며 matching 되지않으면 1 을 return 한다. 0 을리턴하는경우는 dest, src 두필드버퍼의 value, 구조, 개수, 순서등이완전히일치할경우이며 1 을리턴하는경우는구조, 개수, 순서등이모두일치하지만 value 는일치하지않을경우이다. FBCONCAT src 필드버퍼의내용을 dest 필드버퍼에덧붙인다. 즉 dest 필드버퍼에기존에있던데이터는그대로있고거기에 src 필드버퍼의내용이덧붙여진다. FBJOIN 필드키와필드순번이 matching 되는필드에한해그데이터를 src 필드버퍼에서 dest 필드버퍼에복사한다. 단 dest 필드버퍼에기존에존재하던데이터는모두사라지므로주의해야한다. FBOJOIN FBJOIN 모드와유사하게동작하지만이함수를수행하고난후필드키와필드순번이 matching 되지않는필드의데이터는함수수행이전의상태로보존된다 FBUPDATE FBOJOIN 모드와유사하게동작한다. 즉필드키와필드순번이 matching 되는필드의데이터를 src 필드버퍼에서 dest 필드버퍼에복사하는것은 FBOJOIN 모드와유사하지만 FBUPDATE 모드는필드키와필드순번이 matching 되지않는 src 필드버퍼에있는필드의데이터까지도 dest 필드버퍼에복사된다. dest 와 src 모두 fballoc() 또는 tpalloc() 으로메모리에할당된필드버퍼이어야하고 Mode 는위에서설명된 process mode 중하나이어야한다. 18
2.1.2.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.2.5 오류 다음과같은상황에서 fbbufop() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBENOSPACE 필드버퍼에데이터를저장하거나복사할공간이부족할경우 fberror 는 FBENOSPACE 로 setting 된다. FBEMALLOC 시스템에러. 필드버퍼를메모리에할당하는것을실패할경우 fberror 는 FBEMALLOC 으로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 2.1.2.6 예제 #include "demo_fdl.h" main() { FBUF *destbuf, *srcbuf; destbuf=fballoc(5,5); fbput(destbuf, INPUT, "5555", 0); fbput(destbuf, INPUT, "7777", 0); fbput(destbuf, OUTPUT, "3333", 0); fbput(destbuf, SEQNO, "8888", 0); 19
srcbuf=fballoc(5,5); fbput(srcbuf, INPUT, "1111", 0); fbput(srcbuf, OUTPUT, "2222", 0); fbput(srcbuf, CORPNO, "3333", 0); /* Mode 를 select 할수있게한다. */ printf("input : "); scanf("%d", &a); switch(a) { /*FBMOVE mode */ case 1: iret=fbbufop(destbuf, srcbuf, FBMOVE); fbprint(destbuf); break; /* destbuf : 1111, 2222, 3333 */ /*FBCOMP mode */ case 2: iret=fbbufop(destbuf, srcbuf, FBCOMP); printf("ret = %d\n", iret); if(iret < 0) { printf("do not match!!!\n"); fbfree(destbuf); fbfree(srcbuf); exit(0); } printf("match!!!\n"); break; /* Do not match!!! */ 20
/*FBCOPY mode */ case 3: iret=fbbufop(destbuf, srcbuf, FBCOPY); fbprint(destbuf); break; /* destbuf : 1111, 2222, 3333 */ /*FBCONCAT mode */ case 4: iret=fbbufop(destbuf, srcbuf, FBCONCAT); fbprint(destbuf); break; /* destbuf : 5555, 7777, 3333, 8888, 1111, 2222, 3333 */ /*FBJOIN mode */ case 5: iret=fbbufop(destbuf, srcbuf, FBJOIN); fbprint(destbuf); break; /* destbuf : 1111, 2222 */ /*FBOJOIN mode */ case 6: iret=fbbufop(destbuf, srcbuf, FBOJOIN); fbprint(destbuf); break; /* destbuf : 1111, 7777, 2222, 8888 */ /*FBUPDATE mode */ case 7: iret=fbbufop(destbuf, srcbuf, FBUPDATE); 21
fbprint(destbuf); break; /* destbuf : 1111, 7777, 2222, 8888, 3333 */ } fbfree(destbuf); fbfree(srcbuf); } 2.1.2.7 참조 fbbufop_proj() 22
2.1.3 fbbufop_proj 2.1.3.1 이름 fbbufop_proj : 지정한필드의데이터를 dest 필드버퍼에복사 2.1.3.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbbufop_proj(fbuf *dest, FBUF *src, FLDKEY *fldkey) 2.1.3.3 설명 이함수는 src 필드버퍼의지정한필드의필드데이터를 dest 필드버퍼에복사하는함수이다. 즉세번째 argument 인 fieldkey 포인터를배열로선언한후그배열에복사하고자하는필드를복수개로지정하면 src 필드버퍼에서 dest 필드버퍼로 fieldkey 에지정한필드의데이터만복사된다. fbbufop_proj() 함수의처음두 argument 인 dest 와 src 필드버퍼는같은버퍼를사용할수없고반드시따로메모리에할당된다른버퍼를사용하여야한다. 만약두번째 argument 를 NULL 로 setting 한다면 dest 필드버퍼자체에서지정된필드의데이터가복사된다. dest 와 src 는 fballoc() 또는 tpalloc() 으로메모리에할당된필드버퍼이어야한다. fieldkey 포인터에는복사하고자하는필드를배열형태로지정할수있다. 그리고배열의마지막에는반드시 0 을지정해주어야한다. 2.1.3.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 23
2.1.3.5 오류 다음과같은상황에서 fbbufop_proj() 은실패하고, fberrno 에아래값중하나가설정된다. FBEMALLOC 시스템에러. 필드버퍼를메모리에할당하는것을실패할경우 fberror 는 FBEMALLOC 으로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 2.1.3.6 예제 #include demo_fdl.h... int iret, i; FBUF *destbuf, *srcbuf; FLDKEY fkey[4];... fbput(destbuf, INPUT, "aaa", 0); fbput(destbuf, OUTPUT, "bbb", 0); fbput(destbuf, SEQNO, "ccc", 0);... fbput(srcbuf, TEST1, "AAA", 0); fbput(srcbuf, TEST2, "BBB", 0); fbput(srcbuf, TEST3, "CCC", 0); fkey[0]=fbget_fldkey("input"); fkey[1]=fbget_fldkey("seqno"); fkey[2]=0; /* The last entry in the array must be 0 */ ret=fbbufop_proj(destbuf, NULL, fkey); 24
... /* destbuf : aaa, ccc */... fkey[0]=fbget_fldkey("test3"); fkey[1]=fbget_fldkey("test1"); fkey[2]=fbget_fldkey("test2"); fkey[3]=0; /* The last entry in the array must be 0 */ ret=fbbufop_proj(destbuf, srcbuf, fkey);... /* destbuf : AAA, BBB, CCC */ /* fkey array is sorted if the entries are not in numeric order */... 2.1.3.7 참조 fbbufop() 25
2.1.4 fbcalcsize 2.1.4.1 이름 fbcalcsize : 필드버퍼의크기계산 2.1.4.2 사용방법 #include <fbuf.h> #include <atmi.h> long fbcalcsize(int count, FLDLEN datalen) 2.1.4.3 설명 fballoc() 또는 tpalloc() 함수로필드버퍼를메모리에할당받을때적정한메모리를할당받기위하여필드버퍼의크기를계산하는함수이다. 이함수는사용하고자하는필드의개수와총데이터의길이 (byte 단위 ) 를 argument 로전달하면필드버퍼의크기를계산해준다. count 는데이터를저장할필드의개수를의미하고 datalen 은필드버퍼의전체데이터크기를바이트단위로지정한다. 2.1.4.4 반환값 주어진 input argument(count, datalen) 에근거하여필드버퍼의크기를 byte 단위로리턴한다. 2.1.4.5 예제 #include demo_fdl.h... FBUF *fbuf; long size; size = fbcalcsize(100, 1000); printf( size : [%ld]\n, size); /* output : size : [1408] */ 26
if ((fbuf = (FBUF *)tpalloc( FIELD, NULL, size)) == NULL) { printf( tpalloc failed, errno = %d\n, tperrno);... } /* fbuf is set in 1024 bytes by default if size is less than 1024*/... 2.1.4.6 참조 fballoc(), tpalloc() 27
2.1.5 fbchg_tu 2.1.5.1 이름 fbchg_tu : 필드버퍼에서지정한필드키의필드순번의데이터를변경 2.1.5.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbchg_tu(fbuf *fbuf, FLDKEY fldkey, int nth, char *value, FLDLEN fldlen) 2.1.5.3 설명 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼에서 input argument 에서지정한필드키의필드순번의데이터를변경하는함수이다. Input argument 에서지정한필드순번 (nth) 에기존의데이터가없었을경우에는필드순번 (nth) 에주어진데이터가자동적으로필드로추가된다. 그러므로이함수를이용해서필드데이터를변경할때는관계가없지만, 필드순번을추가할경우에는처리속도가저하된다는사실을주의해야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고 fldkey 는필드버퍼에변경할필드의필드키이다. nth 는 fldkey 에서지정한필드키의데이터중변경하고자하는필드순번을나타낸다. 그리고 value 가 (char *) 형이므로변경하고자하는필드키의 type 이정수형이나실수형인경우에는반드시 (char *) 형으로 type casting 을해주어야한다. 만약 value 에 NULL 이설정된경우해당필드키를지우게된다. fldlen 은일반적으로는필드의길이를지정하지않아도된다. 그러나필드키의 type 이 FB_CARRAY 인경우에는반드시필드데이터의길이를 byte 단위로지정해주어야한다. 28
2.1.5.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.5.5 오류 다음과같은상황에서 fbchg_tu() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBENOSPACE 필드버퍼에데이터를저장하거나복사할공간이부족할경우 fberror 는 FBENOSPACE 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 2.1.5.6 예제 #include demo_fdl.h... long rcvlen, ret; char buffer[100]; FLDLEN fldlen; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, tperrno);... } 29
fbput(fbuf, INPUT, aaaa, 0); /* 영번째순번에는 aaaa 가있음. */ ret = fbchg_tu(fbuf, INPUT, 1, bbbb, 4); /* 첫번째순번에 bbbb 를추가함. */ if (ret < 0) { error processing... } ret = fbget_tu(fbuf, INPUT, 1, buffer, &fldlen); /* 첫번째순번에있는데이터를 buffer 에넣음. */ if (ret < 0) { error processing... } printf( Field Data: [%s]\n, buffer); /* output : Field Data: [bbbb] */ fbprint(fbuf); /* output : aaaa, bbbb */... 2.1.5.7 참조 fbput(), fbchg_tut(), fbget_tu(), fbchg_tu(), fbgetval(), fbgetval_last_tu(),fbgetvals_tu(), fbgetvall_tu() 30
2.1.6 fbchg_tut 2.1.6.1 이름 fbchg_tut : 필드버퍼에서지정한필드키의필드순번의데이터를변경 2.1.6.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbchg_tut(fbuf *fbuf, FLDKEY fldkey, int nth, char *value, FLDLEN fldlen, int type) 2.1.6.3 설명 fballoc() or tpalloc() 함수로메모리에할당된필드버퍼에서 input argument 에서지정한필드키의필드순번의데이터를사용자가지정한타입에서필드키의타입으로변환한후변경하는함수이다. 즉이함수는 fbchg_tu() 함수와유사하지만데이터의타입이변경하고자하는필드키의필드타입과다른경우필드데이터를변경하기전에먼저저장하고자하는데이터의타입을필드키의타입으로변환한후필드데이터를변경하여저장할수있다는점이다르다. Input argument 에서지정한필드순번에기존에데이터가없었을경우에는필드순번이주어진데이터로자동적으로필드가추가된다. 그러므로이함수를이용해서필드데이터를변경할때는관계가없지만, 필드순번을추가할경우에는처리속도가저하된다는사실을주의해야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고 fldkey 는필드버퍼에변경할필드의필드키이다. nth 는 fldkey 에서지정한필드키의데이터중변경하고자하는필드순번을나타낸다. 그리고 value argument 가 char * 형이므로변경하고자하는필드키의타입이정수형이나실수형인경우에는반드시 char * 형으로 type casting 을해주어야한다. fldlen 은일반적으로는필드의길이를지정하지않아도된다. 그러나필드키의타입이 FB_CARRAY 인경우에는반드시필드데이터의길이를 byte 단위로지정해주어야한다. 그리고 type 은사용자가지정한데이터의타입을나타낸다. 31
type 에지정해줄수있는값들은다음과같다. FB_CARRAY, FB_SHORT, FB_DOUBLE, FB_LONG, FB_STRING, FB_CHAR, FB_FLOAT, FB_INT 2.1.6.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.6.5 오류 다음과같은상황에서 fbchg_tut() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBENOSPACE 필드버퍼에데이터를저장하거나복사할공간이부족할경우 fberror 는 FBENOSPACE 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다.(FB_CARRAY 타입인경우데이터길이를지정하지않으면이번호가설정된다.) FBETYPE Tmax 에서지원하지않는 type 이사용되었다. FBEBADFLD 32
잘못된필드를사용하였다. 2.1.6.6 예제 #include demo_fdl.h... long ret, lval=100000; FBUF *fbuf;... fbputt(fbuf, INPUT, "aaaa", 0, FB_STRING); fbchg_tut(fbuf, INPUT, 0, (char *)&lval, 0, FB_LONG); printf("1st occurrence of INPUT field is changed as follows : \n"); fbprint(fbuf);... /* fkey = 469762149, fname = INPUT, type = string, value = 100000 */ 2.1.6.7 참조 fbput(), fbchg_tu(), fbget_tu(), fbgetval(), fbgetval_last_tu(), fbgetvals_tu(), fbgetvall_tu() 33
2.1.7 fbdelall 2.1.7.1 이름 fbdelall : 필드버퍼에서지정한필드키의전체데이터를삭제 2.1.7.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbdelall(fbuf *fbuf, FLDKEY fldkey) 2.1.7.3 설명 이함수는필드버퍼에서두번째 argument 로지정한특정필드키에저장되어있는모든필드데이터를삭제하는함수이다. 여기에서두번째 argument 에서지정할필드키는반드시이함수를호출하기이전에지정한필드버퍼에필드순번의데이터가하나이상저장되어있어야한다. 그렇지않으면이함수는 1 을리턴하며 fberror 는 FBENOENT 로 settinge 된다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fldkey 는필드버퍼에서삭제하고자하는필드키이다. 2.1.7.4 반환값 함수수행중필드버퍼에지정한필드키가존재하지않을경우에러가발생하며, 이경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 함수수행이성공할경우에는 fbdelall() 은삭제한필드의개수를리턴한다. 2.1.7.5 오류 다음과같은상황에서 fbdelall() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 34
지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 2.1.7.6 예제 #include demo_fdl.h... int ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, INPUT, cccc, 0); ret = fbdelall(fbuf, INPUT); printf( Delete Field Number: [%d]\n, ret); /* output: Delete Field Number: [3] */... 2.1.7.7 참조 fbput(), fbget(), fbdelete(), fbdelall_tu() 35
2.1.8 fbdelall_tu 2.1.8.1 이름 fbdelall_tu : 필드키배열에지정된모든필드의전체데이터를삭제 2.1.8.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbdelall_tu(fbuf *fbuf, FLDKEY *fldkey) 2.1.8.3 설명 이함수는필드버퍼에서두번째 argument 인필드키배열에지정된모든필드키에저장되어있는모든필드데이터를삭제하는함수이다. 그러므로여러개의필드키를동시에삭제할경우에는 fbdelall_tu() 함수를한번호출하는것이 fbdelall() 함수를여러번호출하는것보다훨씬효율적이다. 여기에서두번째 argument 에서지정할필드키포인터는배열로선언하여삭제하고자하는필드키를명시해주어야한다. 필드키배열에삭제할필드키를지정한후마지막 index 에는반드시 0 을지정해주어야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 포인터는필드버퍼에서삭제하고자하는필드키를복수개로지정한필드키배열이다. 2.1.8.4 반환값 fbdelall_tu() 은삭제한필드의개수를리턴한다. 2.1.8.5 오류 다음과같은상황에서 fbdelall_tu() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 36
fldkey 배열에서마지막에지정된필드키에해당하는데이터가없는경우 fberror 는 FBENOENT 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 2.1.8.6 예제 #include demo_fdl.h... FLDKEY fkey[3]; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, OUTPUT, cccc, 0); fkey[0] = INPUT; fkey[1] = OUTPUT; fkey[2] = 0; /* The last entry in the array must be 0 */ ret = fbdelall_tu(fbuf, fkey); printf( The Number of deleted fields: [%d]\n, ret); /* output: Number of deleted fields: [3] */... 2.1.8.7 참조 fbput(), fbget(), fbdelete(), fbdelall() 37
2.1.9 fbdelete 2.1.9.1 이름 fbdelete : 지정한필드키의지정한필드순번에해당하는필드데이터삭제 2.1.9.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbdelete(fbuf *fbuf, FLDKEY fldkey, int nth) 2.1.9.3 설명 이함수는 fballoc() 또는 tpalloc() 함수로메모리에할당한필드버퍼에서지정한필드키의지정한필드순번에해당하는특정필드의데이터를삭제하는함수이다. fbchg_tu() 함수는지정한필드순번에해당하는필드가존재하지않을경우자동으로필드를추가해주었지만 fbdelete() 에서는지정한필드순번에해당하는필드가필드버퍼에존재하지않을경우에러를발생시키며 fberror 는 FBENOENT 로 setting 된다. 그러므로이함수에서는반드시함수수행이전에필드버퍼에존재하는필드를 argument 로지정해야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서삭제하고자하는필드키를나타내고, nth 는삭제하고자하는특정필드순번을나타낸다. 2.1.9.4 반환값 argument 로지정한필드키의순번에해당하는필드가필드버퍼에존재하지않을경우 fbdelete() 는 1 을리턴하고 fberror 에에러번호를 setting 한다. 함수수행을성공하였을경우에는 1 을리턴한다. 38
2.1.9.5 오류 다음과같은상황에서 fbdelete() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. 지정한필드순번에해당되는데이터가필드버퍼에존재하지않는경우에도 fberror 이 FBENOENT 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 2.1.9.6 예제 #include demo_fdl.h... char buffer[100]; int ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); /* fbuf 의 0 번째데이터는 aaaa 이다. */ fbput(fbuf, INPUT, bbbb, 0); /* fbuf 의 1 번째데이터는 bbbb 이다. */ fbput(fbuf, INPUT, cccc, 0); /* fbuf 의 2 번째데이터는 cccc 이다. */ 39
fbdelete(fbuf, INPUT, 1); 삭제하게된다. */ /* fbuf 의 1 번째데이터인 bbbb 를 ret=fbdelete(fbuf, INPUT, 3); if(ret<0){ printf("fbdelete error : %s\n", fbstrerror(fberror)); } /* fbuf 의 3 번째순번에는데이터가없기때문에 fbdelete error : FBENOENT (not found) 가출력된다. */ fbget(fbuf, INPUT, buffer, 0); printf( INPUT: [%s]\n, buffer); /* output: INPUT: [aaaa] */ fbget(fbuf, INPUT, buffer, 0); printf( INPUT: [%s]\n, buffer); /* output: INPUT: [cccc] */... 2.1.9.7 참조 fbput(), fbget(), fbdelall(), fbdelall_tu() 40
2.1.10 fbextread 2.1.10.1 이름 fbextread : 파일로부터필드키와그에해당하는값을읽어서필드버퍼에저장 2.1.10.2 사용방법 #include <stdio.h> #include <usrinc/fbuf.h> int fbextread(fbuf *fbuf, FILE *iop) 2.1.10.3 설명 이함수는 iop 에서지정하는특정파일로부터필드키와그에해당하는값을읽어서 fballoc() 또는 tpalloc() 함수로메모리에할당한필드버퍼에저장하는함수이다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이며 iop 는읽어올필드키와그에해당하는값이저장되어있는파일의포인터이다. 필드키와값이저장되어있는파일의형식은아래와같다. flag 가 + 이거나 flag 를사용하지않을경우 [flag] field_name or field_id (tab) field_value flag 가 = 일경우 [flag] field_name1 or field_id1 (tab) field_name2 or field_id2 flag 가 일경우 [flag] field_name or field_id 여기서사용할수있는 flag 에는 4 가지가있는데각각플래그의의미는다음과같다. 41
+ : 필드버퍼에서필드키에해당하는값을 0 번째순번에저장한다. - : 필드버퍼에서해당되는필드키의 0 데이터를삭제한다. 번째순번에해당하는 = : 필드버퍼에서첫번째필드이름 (field_name1) 에해당하는데이터중 0 번째순번의필드값을두번째필드이름 (field_name2) 에해당하는데이터중 0 번째순번의필드값으로교체한다. # : comment ( 주석 ) 으로처리 없음 : 필드버퍼에새로운필드를추가 이함수는내부적으로아무런 flag 가쓰이지않은경우 fbput() 함수를호출하도록되어있으며, flag 가 + 인경우 fbchg_tu() 를, -인경우 fbdelete() 를, = 인경우 fbget_tu() 를호출한후 fbchg_tu() 를호출하도록되어있다. 따라서이들함수에서나타날수있는오류와동일한오류가 fbextread() 에서발생할수있다. 2.1.10.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.10.5 오류 다음과같은상황에서 fbinsert() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 2.1.10.6 예제 #include <stdio.h> #include <usrinc/atmi.h> #include <usrinc/fbuf.h> 42
#include "demo_fdl.h" int main() { long len; int ret; FILE *fp; FBUF *fbuf; FLDLEN fldlen; char buffer[100]; fbuf = (FBUF *)tpalloc("field", NULL, 0); if (fbuf == NULL) { printf("fbuf tpalloc fail[%d]\n", tperrno); } ret = fbput(fbuf, INPUT, "user_input", 10); if (ret < 0) { printf("fbput fail[%d]\n", fberror); return -1; } ret = fbput(fbuf, OUTPUT, "user_output", 10); if (ret < 0) { printf("fbput fail[%d]\n", fberror); return -1; } ret = fbput(fbuf, STATLIN, "user_statlin", 10); if (ret < 0) { printf("fbput fail[%d]\n", fberror); return -1; } fp = fopen("file", "r"); fbprint(fbuf); ret = fbextread(fbuf, fp); if (ret < 0) printf("fextread fail[%s]\n", fberror); 43
printf("\n\n<after Fextread>-----------------\n"); fbprint(fbuf); tpfree((char *)fbuf); } < 파일 1> +STATLIN statlin0_ < 결과 1> user_input, user_output, statlin0_, user_statlin < 파일 2> OUTPUT INPUT INPUT OUTPUT0_ INPUT0_ INPUT1_ < 결과 2> user_input, user_output, user_statlin, OUTPUT0_, INPUT0_, INPUT1_ < 파일 3> =OUTPUT INPUT < 결과 3> user_input, user_input, user_statlin < 파일 4> INPUT < 결과 4> user_output, user_statlin 2.1.10.7 참조 fbput(), fbchg_tu(), fbdelete(), fbget_tu() 44
2.1.11 fbfldcount 2.1.11.1 이름 fbfldcount : 필드버퍼내에있는모든필드의수를반환 2.1.11.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbfldcount(fbuf *fbuf) 2.1.11.3 설명 이함수는 fballoc() 또는 tpalloc() 함수로메모리에할당한필드버퍼에현재저장되어있는모든필드의수를리턴하는함수이다. 이미구현되어있는여러 API 함수들을이용하여필드버퍼에몇개의필드들이실질적으로저장되어있는지도확인해볼수있다. 하나의필드키에순번을달리하여여러데이터들이저장되어있다하더라도이러한경우 fbfldcount() 함수는별개의필드로인식한다. 즉, 이함수는필드버퍼내에필드데이터가몇개저장되어있는지계산해주는함수라고할수있다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이다. 2.1.11.4 반환값 필드버퍼에현재저장되어있는필드의수를리턴하고, 필드버퍼에저장되어있는필드가없는경우에는 0 을리턴한다. 2.1.11.5 오류 다음과같은상황에서 fbinsert() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBEINVAL 45
input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 2.1.11.6 예제 #include demo_fdl.h... int cnt; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbp ut(fbuf, INPUT, bbbb, 0); fbput(fbuf, OUTPUT, cccc, 0); cnt = fbfldcount(fbuf); printf( Field Count: [%d]\n, cnt); /* output: Field Count: [3] */... } 2.1.11.7 참조 fbgetnth(), fbkeyoccur() 46
2.1.12 fbfprint 2.1.12.1 이름 fbfprint : 필드버퍼에저장되어있는필드데이터를지정한파일스트림에출력 2.1.12.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbfprint(fbuf *fbuf, FILE *iop) 2.1.12.3 설명 이함수는필드버퍼에저장되어있는필드데이터를지정한파일 스트림에출력하는함수이다. 이 때 지정한파일은텍스트파일이고, 출력형식은 fbprint() 함수의출력 형식과같다. fbuf 는 fballoc() 또는 tpalloc() 저장할 함수로메모리에할당된필드버퍼이고, iop 는출력데이터를파일스트림을나타낸다. 2.1.12.4 반환값 함수수행이성공할경우 1 을, 에러가발생할경우 1 을리턴하고 fberror 에에러번호를 setting 한다. 2.1.12.5 오류 다음과같은상황에서 fbfprint() 은실패하고, fberrno 에아래값중하나가설정된다. FBEBADFB 47
필드버퍼가유효하지않다. 그러므로현재의필드버퍼이외의다른정상적으로메모리에할당된버퍼를사용해야한다. FBEINVAL 2.1.12.6 예제 input argument 로지정된값들중 유효하지않은 argument 가 있다. #include demo_fdl. h... FILE *iop; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } iop = fopen( sample.text, w ); fbput(fbuf, INPUT, 5555, 0); fbput(fbuf, INPUT, 7777, 0); fbfprint(fbuf, iop); fclose(iop); 2.1.12.7 참조 fbprint() 48
2.1.13 fbfree 2.1.13.1 이 름 fbfree : 필드버퍼의메모리를해제 2.1.13.2 사용방 법 #include <fbuf.h> #include <atmi.h> int fbfree(fbuf *fbuf) 2.1.13.3 설 명 이함수는 fballoc() 또는 tpalloc() 함수에의해서할당된필드버퍼의메모리를해제하는함수이다. 이함수는이전에할당받았던버퍼를메모리로부터해제하는함수이므로이함수를수행한후에는다시그버퍼를사용할수없다. 그러므로버퍼의사용이완전히끝난이후에이함수를호출해주어야한다. fbuf 는 fballoc() 또는 tpalloc() 함수에의해할당된필드버퍼이다. 2.1.13.4 반환값 필드버퍼의메모리를해제하지못하면 1 을리턴하고, 버퍼를정상적으로해제하면 1을리턴한다. 2.1.13.5 오류 다음과같은상황에서 fbinsert() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 49
2.1.13.6 예제 #include demo_fdl.h... int ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); ret = fbfree(fbuf); printf( fbfree, ret = %d\n, ret); /* output : fbfree, ret = 1 */ fbp ut(fbuf, INPUT, bbbb, 0); fbprint(fbuf); /* an error occurs since memory was not allocated. */ 2.1.13.7 참조 fbcalcsize(), tpalloc(), fballoc(), fbinit() 50
2.1.14 fbftos 2.1.14.1 이 름 fbftos : 필드전송 버퍼에저장되어있는데이터를 matching 되는 struct 버퍼로 2.1.14.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbftos(fbuf *fbuf, char *cstruct, char *stname) 2.1.14.3 설명 이함수는 fballoc() 또는 tpalloc() 함수를통하여메모리에할당된필드버퍼에저장되어있는필드데이터들을 matching 되는 C Structure 버퍼 (stname) 로전송하는함수이다. 여기에는일반구조체파일인 ***.s 와는약간다른구조체파일이미리정의되어있어야한다. 구조체파일내의필드키는정의되는구조체의멤버변수와 1 : 1 mapping 이되어있어야한다. 아래에필드버퍼와 C struct 를 mapping 시키는구조체파일의예가설명되어있다. VIEW demo #type cname Fldkey count flag size null string demodata INPUT 5-20 carray carraydata CARRAYDATA 1-20 star char chardata CHARDATA 1 - - c int inum INTDATA 5 - - 0 short snum SHORTDATA 1 - - 0 long lnum LONGDATA 1 - - 1 float fnum FLOATDATA 1 - - 1.0 double dnum DOUBLEDATA 1 - - 1.0 END 51
여기에서 type 은구조체안의멤버변수의데이터형을나타내고 cname 은멤버변수의이름을나타낸다. fldkey 는지정한멤버변수와 mapping 되는필드키를나타내고 ( 이필드키는 ***.f 에정의되어있어야한다.) count 는구조체에서저장할수있는최대의필드순번을나타낸다. size 는 string type 인경우배열의크기를나타내고 null 은초기화될때의값을나타내는것으로필드버퍼에아무런값이저장되어있지않은상태에서필드데이터들을 C Structure 버퍼로전송하고자하는경우기본적으로 C Structure 에복사되는값이다. 만약에 null 항목에아무런값도주지않은상태에서필드버퍼에아무런값이저장되어있지않은경우각자료형에맞는디폴트값이 C Structure 에저장된다. string, carray, char 의디폴트값은 NULL 이며 int, short, long 의디폴트값은 0, float, double 의디폴트값은 0.0 이다. 위와같이 demo.s 또는 demo.v 에 VIEW 를정의해놓은후클라이언트에서는 sdlc utility(structure file compiling utility) 를이용하여 VIEW file 을다음과같이컴파일해야한다. $TMAXDIR$/sample/sdl> sdlc c v demo.s o tmax.sdl $TMAXDIR$/sample/sdl> sdlc c v demo.v o tmax.sdl 환경파일 (korn shell 을사용하는경우.profile) 에 SDLFILE 로지정된이름으로 o 옵션으로.sdl 파일을생성한다. 이렇게함으로써필드키와구조체간의변환정보를 SDLFILE 에서가지고있게된다. 이떄주의할점은위의 VIEW 파일에정의되어있는필드키는반드시 ***.f 에정의되어있어야한다는점이다. 위와같이 VIEW 파일을컴파일하면 demo_sdl.h 와 tmax.sdl 파일이생성된다. 클라이언트프로그램에서는 demo_sdl.h 파일을 include 해서사용하면된다. 서버에서는 sdlc utility(structure file compiling utility) 를이용하여 VIEW file 을다음과같이컴파일해야한다. $TMAXDIR$/sample/s dl> sdlc v demo.s 위와같이구조체파일을컴파일하면 demo_sdl. c 와 demo_sdl.h 파일이생성된다. 필드키와구조체간의변환정보가 demo_sdl.c 파일에들어있으므로이정보를사용해야하는서버프로그램을컴파일할때 demo_sdl.c 파일과함께컴파일이되어야한다. 즉서버프로그램내에서는필요한정보를컴파일시에모두가지게되므로 tmax.sdl 파일이필요하지않게된다. 52
필드버퍼에서구조체로데이터를전송할때필드키와구조체의멤버변수의데이터와 mapping 되지않을경우에는필드키가무시된다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, cstruct 는사용할구조체타입의변수를 (char *) 으로 type casting 하여사용하면된다. stname 은 VIEW 에서정의한구조체의이름을문자열로지정하면된다. 2.1.14.4 반환값 필드버퍼에저장되어있는데이터들을성공적으로 cstruct 에전송하였을경우에는 1 을리턴하고, 실패하였을경우에는 -1 을리턴고 fberror 에에러번호를 setting 한다. 2.1.14.5 오류 다음과같은상황에서 fbftos() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBENOSPACE 필드버퍼에데이터를저장하거나복사할공간이부족할경우 fberror 는 FBENOSPACE 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. FBEBADFLD 유효하지않은필드키가사용되었다. 일반적으로필드키가 fdlc utility 를사용하여컴파일되지않은필드키가사용되었을경우 fberror 는 FBEBADFLD 로 setting 된다. 53
FBEBADSTRUCT 2.1.14.6 예제 유효하지않은구조체가사용되었다. 일반적으로 Tmax system 에서알아보지못하는형태의구조체가사용되었거나구조체정의파일이잘못컴파일되었을경우에발생하는에러이다. #include demo_fdl.h #include demo_sdl.h... int ret, fdllen, val = 1000; struct demo temp; FBUF *fbuf; Char *cstruct; if(tpstart((tpstart_t *)NULL) == -1) { printf( tpstart failed\n );... } if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } cstruct = (char *)&temp; if(fbstinit((char *)&temp, demo ) < 1) { printf( fbstinit failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INTDATA, (char *)&val, 0); if(fbftos( fbuf, cstr uct, demo ) < 0) {... 54
}... 2.1.14.7 참 조 fbstof(), fbstinit(), fbstelinit() 55
2.1.15 fbget 2.1.15.1 이름 fbget : 필드버퍼에서필드키에해당하는필드데이터를얻어옴 2.1.15.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbget(fbuf *fbuf, FLDKEY fldkey, char *loc, FLDLEN *fldlen) 2.1.15.3 설명 이함수는필드버퍼에서두번째 argument 에서지정한필드키에해당하는필드의데이터를읽어오는함수이다. 데이터를필드버퍼에서읽어내는함수로서동일한필드키로저장된데이터는순차적으로읽어서세번째 argument 인 loc 에저장한다. 즉수동적으로순번을증가시키지않고단지저장되어있는필드순번만큼이함수를호출하면함수내에서자동적으로필드순번을증가시켜서다음데이터를읽을준비가되어있으므로그필드키내에저장되어있는모든필드데이터를읽어올수있는것이다. 그러므로이함수를사용할경우에는한번읽어온데이터는다시읽을수없으므로주의해야한다. 그리고저장되어있는필드순번보다더많이이함수를호출하면마지막필드순번의필드데이터가계속리턴된다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, loc 은순차적으로읽어온필드데이터를가리키는포인터이다. 만약필드키의타입이정수또는실수인경우에는반드시각타입에맞는변수를사용하되위의함수프로토타입에맞게 type casting 을해주어야한다. fldlen 은읽어온데이터의길이를나타낸다. 56
2.1.15.4 반환값 지정한필드키를필드버퍼에서찾지못하면 1 을리턴하고 fberror 에에러번호를 setting 한다. 지정한필드키의필드데이터를정상적으로읽어왔다면 1을리턴한다. 2.1.15.5 오류 다음과같은상황에서 fbget() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBEINVAL 2.1.15.6 예제 input argument 로지정된값들중유효하지않은 argument 가있다. (CARRAY 타입인경우 fldlen 을지정하지않은경우도해당된다.) FBETYPE Tmax 에서지원하지않는 type 이사용되었다. #include demo_fdl.h... long rcvlen, ret; FLDLEN fldlen; char buffer[100]; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... 57
} fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, INPUT, cccc, 0); fbget(fbuf, INPUT, buffer, &fldlen); printf( Field Data: [%s]\n, buffer); /* output: Field Data: [aaaa] */... 2.1.15.7 참 조 fbput(), fbchg_tu(), fbget_tu(), fbchg_tu(), fbgetval(), fbgetval_last_tu(), fbgetvals_tu(), fbgetvall_tu() 58
2.1.16 fbgetalloc_tu 2.1.16.1 이름 fbgetalloc_tu : 필드버퍼에서지정한필드키의필드순번에해당하는필드데이터를지정한길이만큼버퍼를새로할당받아저장하여리턴 2.1.16.2 사용방법 #in clude <fbuf.h> #include <atmi.h> char *fbgetalloc_tu(fbuf *fbuf, FLDKEY fldkey, int nth, int *extralen) 2.1.16.3 설명 이함수는두번째및세번째 argument 로지정한필드키의필드순번에해당하는필드데이터를읽어오는데이때네번째 argument 로지정한길이만큼의새로운버퍼를할당하여그버퍼에데이터를저장하고그버퍼의포인터를리턴하는함수이다. 이때 extralen 을 0 으로지정하면함수수행후새로할당해야하는버퍼의크기가필드데이터의길이로 setting 된다. 그리고 extralen 은할당한버퍼의크기가설정된다. 여기에서새로할당받은버퍼는사용한후반드시사용자가메모리해제를해주어야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, nth 는데이터를읽어오고자하는필드키의필드순번을나타낸다. 그리고 extralen 은새로할당받아야하는버퍼의크기를나타낸다. 2.1.16.4 반환값 필드버퍼에서지정한필드키를찾지못하거나함수수행중다른에러가발생하였을경우에는이함수는 NULL 을리턴하고 fberror 에에러번호를 setting 한다. 성공했을경우에는필드데이터를저장한새로할당받은버퍼의포인터를리턴한다. 59
2.1.16.5 오류다음과같은상황에서 fbgetalloc_tu() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBEMALLOC 시스템에러, 필드버퍼를메모리에할당하는것을실패할경우 fberror 는 FBEMALLOC 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. FBETYPE Tmax 에서지원하지않는 type 이사용되었다. 2.1.16.6 예 제 #include demo_fdl.h... long ret; int extralen; char *buffer; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } 60
fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, INPUT, cccc, 0); extralen = 4; buffer = fbgetalloc_tu(fbuf, INPUT, 0, &extralen); printf( Field Data: [%s]\n, buffer); /* output: Field Data: [aaaa], returned after adding 4 bytes to the length of the field value. */ fbfree(fbuf);. 2.1.16.7 참 조 fbgetalloc_tut(), fbput(), fbchg_tu(), fbget_tu(), fbchg_tu(), fbgetval(), fbgetval_last_tu(), fbgetvals_tu(), fbgetvall_tu() 61
2.1.17 fbgetalloc_tut 2.1.17.1 이름 fbgetalloc_tut : 필드버퍼에서지정한필드키의필드순번에해당하는 필드데이터를지정한타입으로필요한길이만큼 버퍼를 새로할당받아 저장하여리턴. 2.1.17.2 사용방법 #include <fbuf.h> #include <atmi.h> char *fbgetalloc_tut(fbuf *fbuf, FLDKEY fldkey, int nth, int type, int *extralen) 2.1.17.3 설명 이함수는두번째및세번째 argument 로지정한필드키의필드순번에해당하는필드데이터를읽어오는데이때필드데이터의타입과상관없이지정한타입으로변환하여다섯번째 argument 로지정한길이만큼의새로운버퍼를할당하여그버퍼에데이터를저장하고그버퍼의포인터를리턴하는함수이다. fbgetalloc_tut() 함수는 fbgetalloc_tu() 함수와매우유사하지만가져오는필드데이터의타입을변환할수있다는점이다르다. 단 char * 형으로표현할수없는타입 int, long, double, long, float 의경우에는상황에맞게 type casting 을해주어야한다. 이때 extralen 을 0 으로지정하면함수수행후새로할당해야하는버퍼의크기가필드데이터의길이으로 setting 된다. 그리고 extralen 은할당한버퍼의크기가설정된다. 여기에서새로할당받은버퍼는사용한후반드시사용자가메모리해제를해주어야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, nth 는데이터를읽어오고자하는필드키의필드순번을나타낸다. 그리고 type 은필드데이터를변환하고자하는데이터타입을지정해주면되고, extralen 은새로할당받아야하는버퍼의크기를 byte 단위로나타낸다. 62
type 에지정해줄수있는값들은다음과같다. : FB_CARRAY, FB_SHORT, FB_DOUBLE, FB_LONG, FB_STRING, FB_CHAR, FB_FLOAT, FB_INT 2.1.17.4 반환값 필드버퍼에서지정한필드키를찾지못하거나함수수행중다른에러가발생하였을경우에는이함수는 NULL 을리턴하고 fberror 에에러번호가 setting 된다. 성공했을경우에는필드데이터를저장한새로할당받은버퍼의포인터를리턴한다. 2.1.17.5 오류 다음과같은상황에서 fbgetalloc_tut() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBEMALLOC 시스템에러. 필드버퍼를메모리에할당하는것을실패할경우 fberror 는 FBEMALLOC 로 setting 된다. FBENOSPACE 필드버퍼에데이터를저장하거나복사할공간이부족할경우 fberror 는 FBENOSPACE 로 setting 된다. FBEBADFLD 유효하지않은필드키가사용되었다. 일반적으로필드키가 fdlc utility 를사용하여컴파일되지않은필드키가사용되었을경우 fberror 는 FBEBADFLD 로 setting 된다. 63
FBETYPE Tmax 에서 지원하지않는 type 이사용되었다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 2.1.17.6 예 제 #include demo_fdl.h... long ret; int extralen; char *buffer; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, INPUT, cccc, 0); extralen = 4; buffer = fbgetalloc_tut(fbuf, INPUT, 0, FB_STRING, &extralen); printf( Field Data: [%s]\n, buffer); /* output: Field Data: [aaaa], returned after adding 4 bytes to the length of the field value. */ fbfree(fbuf);... 2.1.17.7 참 fbgetalloc_tu 조 (), fbput(), fbget_tu(), fbchg_tu(), fbgetval(), fbgetval_last_tu(), fbgetvals_tu(), 64
fbgetvall_tu() 65
2.1.18 fbget_fbsize 2.1.18.1 이름 fbget_fbsize : 필드버퍼의크기를리턴 2.1.18.2 사용방법 #include <fbuf.h> #include <atmi.h> long fbget_fbsize(fbuf *fbuf) 2.1.18.3 설명 이함수는 fballoc() 또는 tpalloc() 함수에의해서할당된필드버퍼의크기를리턴하는함수이다. fballoc() 또는 tpalloc() 함수를통하여메모리에필드버퍼를 1024 byte 보다작은버퍼를할당하려고할때기본적으로메모리는 1024 byte 로할당하므로이러한경우 fbget_fbsize() 함수는 1024 byte 를리턴한다. 그이외의경우에는 fbget_fbsize() 함수의리턴값은 fbcalcsize() 함수로계산한결과와같다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이다. 2.1.18.4 반환값 메모리에할당된필드버퍼의크기를리턴한다. 2.1.18.5 오류 다음과같은상황에서 fbget_fbsize() 은실패하고, fberrno 에아래값중하나가설정된다 FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 66
2.1.18.6 예제 #include demo_fdl.h... long ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, 1111, 0); ret = fbget_fbsize(fbuf ) ; printf( Field Buffer Size: [%ld]\n, ret); /* output: Field Buffer Size: [1024] */... 2.1.18.7 참조 fbcalcsize(), tpalloc(), fballoc(), fbfree(), fbinit() 67
2.1.19 fbget_fldkey 2.1.19.1 이름 fbget_fldkey : 지정한필드명과 matching 되는필드키를리턴 2.1.19.2 사용방법 #include <fbuf.h> #include <atmi.h> FLDKEY fbget_fldkey(char *name) 2.1.19.3 설명 이함수는 fdlc utility 를통하여컴파일되어생성된필드테이블 (FDLFILE 에설정된 fdl 파일 ) 을참조하여지정한필드명과 matching 되는식별자 (identifier) 를리턴하는함수이다. 여기에서는이식별자를필드키라고부른다. name 은필드테이블을생성하는데사용되는필드이름이다. 필드버퍼에데이터를저장하기위해서는지정한필드이름에해당하는필드키를알아야한다. 왜냐하면필드버퍼에저장되는데이터의형식은필드키와필드데이터의조합이기때문이다. 2.1.19.4 반환값 지정한필드이름이필드테이블에존재하지않는경우 fbget_fldkey() 는 0 을리턴하고그렇지않은경우에는필드이름과 matching 되는필드키를리턴한다. 2.1.19.5 예제 #include demo_fdl.h... FLDKEY fkey; 68
FBUF *sndbuf; fkey = fbget_fldkey( INPUT ); pri ntf( Field Key : [%d]\n, fkey); /* output : Field Key : [469762149] */... fbput(sndbuf, fkey, 1111", 0);... 2.1.19.6 참조 fbget_fldname(), fbget_fldno(), fbget_fldtype(), fbget_strfldtype(), fbtypecvt() 69
2.1.20 fbget_fldname 2.1.20.1 이름 fbget_fldname : 지정한필드키와 matching 되는필드이름을리턴 2.1.20.2 사용방법 #include <fbuf.h> #include <atmi.h> char *fbget_fldname(fldkey fldkey) 2.1.20.3 설명 fbget_fldkey() 함수와는반대로, fbget_fldname() 함수는 fdlc utility 를통하여 컴파일되어생성된필드테이블 (FDLFILE 에설정된 fdl 파일 ) 을참조하여 지정한필드키와 matching 되는필드이름을리턴하는함수이다. fldkey 는 필드 테이블을 생성하기 위하여 필요한 데이터를 정의해 놓은 파일 (***.f) 을 fdlc utility 를 통하여 컴파일하여 생성된 헤더 파일 (***_fdl.h) 을 참조하거나 또는 fbget_fldkey() 를 이용해서 얻은 필드키이다. 2.1.20.4 반환값지정한필드키에대한필드이름이필드테이블에존재하지않을경우함수는 NULL 을리턴하고그렇지않은경우에는지정한필드키와 matching 되는필드이름을리턴한다. 2.1.20.5 예제 #include demo_fdl.h... FLDKEY fkey; char *name; 70
fkey = fbget_fldkey( INPUT ); printf( Field Key : [%d]\n, fkey); /* output : Field Key : [469762149] */ name = fbget_fldname(fkey); printf( Field Name : [%s]\n, name); /* output : Field Name : [INPUT] */... 2.1.20.6 참조 fbget_fldkey(), fbget_fldno(), fbget_fldtype(), fbget_strfldtype(), fbtypecvt() 71
2.1.21 fbget_fldno 2.1.21.1 이름 fbget_fldno : 지정한필드키와 matching 되는필드번호를리턴 2.1.21.2 사용방법 #in clude <fbuf.h> #include <atmi.h> int fbget_fldno(fldkey fldkey) 2.1.21.3 설명 필드테이블을생성하기위해서는필드의타입, 필드이름, 필드번호등이필요하며이들의조합으로 unique 한필드키를만들수있다. 이러한필드키들을모아서관리하는것이필드테이블이다. fbget_fldno() 함수는필드테이블을생성하기위하여필요한데이터중지정한필드키와 matching 되는필드번호를리턴하는함수이다. fldkey 은필드테이블을생성하기위하여필요한데이터를정의해놓은파일 (***.f) 을 fdlc utility 를통하여컴파일하여생성된헤더파일 (***_fdl.h) 을참조하거나또는 fbget_fldkey() 를이용해서얻은필드키이다. 2.1.21.4 반환값 함수수행이성공했을경우에는지정한필드키와 matching 번호를정수로리턴한다. 되는필드 2.1.21.5 예제 #include demo_fdl.h"... FLDKEY fkey; int no; 72
fkey = fbget_fldkey( INPUT ); printf( Field Key : [%d]\n, fkey); /* output : Field Key : [469762149] */ no = fbget_fldno(fkey); printf( Field No. : [%d]\n, no); /* output : Field No. : [101] */... 2.1.21.6 참조 fbget_fldname(), fbget_fldkey(), fbget_fldtype(), fbget_strfldtype(), fbtypecvt() 73
2.1.22 fbget_fldtype 2.1.22.1 이름 fbget_fldtype : 지정한필드키의필드 타입을정수로반환 2.1.22.2 사용방법 #in clude <fbuf.h> #include <atmi.h> int fbget_fldtype(fldkey fldkey) 2.1.22.3 설명 이함수는지정한필드키에저장될필드데이터의타입을미리지정된정수로리턴하는함수이다. 이함수에서반환되는필드타입과그에 matching 되는리턴값은다음과같다. RETURN VALUE (real type number) (real type number) Field type 1 character 2 short integer 3 integer 4 long integer 5 float 6 double 74
7 string 8 character array(carray) fldkey 은필드테이블을생성하기위하여필요한데이터를정의해놓은 파일 (***.f) 을 fdlc utility 를 통하여 컴파일하여 생성된 헤더 파일 (***_fdl.h) 을 참조하거나 또는 fbget_fldkey() 를 이용해서 얻은 필드키이다. 2.1.22.4 반 환 값 반환값은위와같이 1~8 까지의 int 값이다. 2.1.22.5 예 제 #include demo_fdl.h... FLDKEY fkey; int type; fkey = fbget_fldkey( INPUT ); printf( Field Key : [%d]\n, fkey);/* output: Field Key : [469762149] */ type = fbget_fldtype(fkey); printf( Field Type : [%d]\n, type);/* output : Field Type : [7] */... 2.1.22.6 참조 fbget_fldname(), fbget_fldno(), fbget_fldkey(), fbget_strfldtype(), fbtypecvt() 75
2.1.23 fbgetlast_tu 2.1.23.1 이 름 fbgetlast_tu : 필드버퍼에서지정한필드키에저장되어있는필드데이터중마지막순번의데이터를리턴 2.1.23.2 사용방법 #include <fbuf.h> #include <atmi.h> in t fbgetlast_tu(fbuf *fbuf, FLDKEY fldkey, int *nth, char *loc, int *len) 2.1.23.3 설명이함수는필드버퍼에서지정한필드키에저장되어있는필드데이터중마지막순번의데이터를리턴하는함수이다. 함수가리턴할때리턴되는데이터가필드데이터중몇번째순번인지와필드데이터의길이를데이터와함께리턴한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, nth 는지정한필드키에저장되어있는필드데이터중마지막순번이저장되는포인터이다. 그러니까 nth 는데이터를읽어오고자하는필드키의필드순번을저장하는포인터이다. loc 는가져온필드데이터를저장하는포인터이고, len 은가져온필드데이터의길이를저장하는포인터이다. 2.1.23.4 반환값 필드버퍼에서지정한필드키를찾지못하거나함수수행중다른에러가발생하였을경우에는이함수는 -1 을리턴하고 fberror 에에러번호를 setting 한다. 성공했을경우에는 1 을리턴한다. 76
2.1.23.5 오류다음과같은상황에서 fbgetlast_tu() 은실패하고, fberrno 에아래값중하나가설정된다. FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. FBETYPE Tmax 에서 지원하지않는 type 이사용되었다. FBEBADFL D 잘못된필드를사용하였다. 2.1.23.6 예 제 #include demo_fdl.h... long ret; FLDKEY len; int nth; cha r buffer[100] ; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } 77
fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, INPUT, cccc, 0); fbgetlast_tu(fbuf, INPUT, &nth, buffer, &len); printf( Field Data: [%s], occurrence = %d, len = %d\n, buffer, nth, len ); /* output: Field Data: [cccc], occurrence = 2, len = 4 */... 2.1.23.7 참조 fbput(), fbchg_tu(), fbgetalloc_tu() fbget_tu(), fbgetval(), fbgetval_last_tu(), fbgetvals_tu(), fbgetvall_tu(), 78
2.1.24 fbget_strfldtype 2.1.24.1 이름 fbget_strfldtype : 지정한필드키의필드타입을문자열로반환 2.1.24.2 사용방법 #include <fbuf.h> #in clude <atmi.h> char *fbget_strfldtype(fldkey fldkey) 2.1.24.3 설명 이함수는지정한필드키에저장될필드데이터의타입을문자열로 리턴하는함수이다. fbget_fldtype() 은지정한필드키의필드타입을미리 지정한정수로리턴하지만이함수는필드타입을문자열그대로 리턴한다. fldkey 은필드테이블을생성하기위하여필요한데이터를 정의해놓은파일 (***.f) 을 fdlc utility 를통하여컴파일하여생성된헤더 파일 (***_fdl.h) 을 참조하거나 또는 fbget_fldkey() 를 이용해서 얻은 필드키이다. 2.1.24.4 반환값 Argument 로지정한필드키에해당하는필드타입이없거나필드키가잘못지정된경우에는빈문자열을리턴하고존재할경우에는지정한필드키에대한필드타입을문자열로리턴한다. 2.1.24.5 예제 #include demo_fdl.h... FLDKEY fkey; char *stype; 79
.. fkey = fbget_fldkey( INPUT ); printf( Field Key : [%d]\n, fkey); /* output : Field Key : [469762149] */ stype = fbget_strfldtype(fkey); printf( Field Type : [%s]\n, stype); /* output : Field type : [string] */ 2.1.24.6 참조 fbget_fldname(), fbget_fldno(), fbget_fldtype(), fbtypecvt() 80
2.1.25 fbget_tu 2.1.25.1 이름 fbget_tu : 지정한필드키의필드순번에해당하는필드데이터를리턴 2.1.25.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbget_tu(fbuf *fbuf, FLDKEY fldkey, int nth, char *value, FLDLEN *len) 2.1.25.3 설명 이함수는필드버퍼에서두번째 argument 에서지정한필드키의세번째 argument 에서지정한필드순번에해당하는필드의데이터를읽어오는함수이다. fbget() 함수와거의같은역할을하지만 fbget() 함수는읽어오고자하는필드키만지정해주면그필드키에저장되어있는필드데이터를처음부터차례로순번을증가시켜가면서읽어오지만 fbget_tu() 함수는지정한필드키에저장되어있는데이터중필드순번까지도지정할수있다는점이다르다. 그리고 fbget() 함수는한번읽어온데이터는더이상 access 할수없지만 fbget_tu() 함수는필드순번까지지정해줄수있으므로하나의필드데이터에대하여여러번읽어올수있다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, nth 는읽어오고자하는필드순번을나타낸다. value 는읽어온필드데이터를가리키는포인터이다. 만약필드키의타입이정수또는실수인경우에는반드시각타입에맞는변수를사용하되위의함수프로토타입에맞게 type casting 을해주어야한다. fldlen 은읽어온데이터의길이를나타낸다. 81
2.1.25.4 반환값이함수에서는두가지를가져오는데하나는읽어온필드데이터를 value 에저장하고읽어온필드데이터의길이를 len 에저장하여그것들을포인터로리턴한다. 만약지정한필드키가필드버퍼에존재하지않는경우에는 1 을리턴하고 fberror 에에러번호를 setting 한다. 그렇지않은경우에는 1 을리턴한다. 2.1.25.5 오류 다음과같은상황에서 fbget_tu() 은실패하고, fberrno 하나가설정된다. 에아래값중 FBENOENT 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에 정의되어있지않으므로필드버퍼에서 사용할수 없는경우 fberror 는 FBENOENT 로 setting 된다. FBEINVAL input argument 있다. 로지정된값들중유효하지않은 argument 가 FBETYPE Tmax 에서지원하지않는 type 이사용되었다. FBEBADFLD 잘못된필드를사용하였다. 2.1.25.6 예제 #include demo_fdl.h... char buffer[100]; 82
long rcvlen; FLDLEN fldlen; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, aaaa, 0); fbput(fbuf, INPUT, bbbb, 0); fbput(fbuf, OUTPUT, cccc, 0); fbget_tu(fbuf, INPUT, 1, buffer, &fldlen); printf( Data: [%s]\n, buffer) /* output: Data: [bbbb] */... 2.1.25.7 참 조 fbput(), fbget(), fbget_tut(), fbgetval(), fbgetval_tu(), fbgetvals_tu(), fbgetvall_tu(), fbgetval_last_ tu() 83
2.1.26 fbget_tut 2.1.26.1 이름 fbget_tut : 지정한필드키의필드순번에해당하는필드타입으로변환하여리턴 데이터를지정한 2.1.26.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbget_tut(fbuf *fbuf, FLDKEY fldkey, int nth, char *value, FLDLEN *len, int type) 2.1.26.3 설명 이함수는필드버퍼에서두번째 argument 에서지정한필드키의세번째 argument 에서지정한필드순번에해당하는필드의데이터를읽어오는함수이다. fbget_tu() 함수와거의같은역할을하지만 fbget_tu() 함수는지정한필드키의필드순번에해당하는필드데이터를그대로읽어오지만 fbget_tut() 함수는필드데이터를지정한타입으로변환하여읽어올수있다는점이다르다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fieldkey 는필드버퍼에서읽어오고자하는필드키를나타내고, nth 는읽어오고자하는필드순번을나타낸다. value 는읽어온필드데이터를가리키는포인터이다. 만약필드키의타입이정수또는실수인경우에는반드시각타입에맞는변수를사용하되위의함수의 prototype 에맞게 type casting 을해주어야한다. fldlen 은읽어온데이터의길이를나타내고, type 은읽어온데이터를변환하고자하는데이터의타입을지정해주면된다. type 에지정해줄수있는값들은다음과같다. : FB_CARRAY, FB_SHORT, FB_DOUBLE, FB_LONG, 84
FB_STRING, FB_CHAR, FB_FLOAT, FB_INT 2.1.26.4 반환값이함수에서는두가지를가져오는데하나는읽어온필드데이터를 value 에저장하고읽어온필드데이터의길이를 len 에저장하여그것들을포인터로리턴한다. 만약지정한필드키가필드버퍼에존재하지않는경우에는 1 을리턴하고 fberror 에에러번호를 setting 한다. 그렇지않은경우에는 1 을리턴한다. 2.1.26.5 오류 다음과같은상황에서 fbget_tut() 은실패하고, fberrno 하나가설정된다. FBENOENT 에아래값 중 지정한필드키가 FDLFILE( 환경변수 : default 값은 tmax.fdl) 에정의되어있지않으므로필드버퍼에서사용할수없는경우 fberror 는 FBENOENT 로 setting 된다. FBETYPE Tmax 에서지원하지않는 type 이사용되었다. FBEBADFLD 잘못된필드를사용하였다. FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 예를들면 fbuf 가 NULL 일경우이에러가발생한다. 2.1.26.6 예 제 #include demo_fdl.h 85
... FBUF *fbuf; int ret, val=65; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbputt(fbuf, INPUT, (char *)&val, 0, FB_INT); fbputt(fbuf, INTDATA, "1111", 0, FB_ STRING); fbprint(fbuf); fbget_tut(fbuf, INTDATA, 0, (char *)&ret, &fldlen, FB_INT); printf("field Data: [%d]\n", ret); /* output: Field Data: [1111] */... 2.1.26.7 참 조 fbput(), fbget(), fbget_tu(), fbgetval(), fbgetval_tu(), fbgetvals_tu(), fbgetvall_tu(), fbgetval_last_tu() 86
2.1.27 fbget_unused 2.1.27.1 이름 fbget_unused : 메모리에할당된필드버퍼중아직버퍼의크기계산 사용되지않은필드 2.1.27.2 사용방법 #include <fbuf.h> #include <atmi.h> long fbget_unused(fbuf *fbuf) 2.1.27.3 설명 이함수는 fballoc() 또는 tpalloc() 함수에의해서메모리에할당된필드버퍼중아직사용되지않은필드버퍼의크기를계산하여 byte 단위로리턴하는함수이다. fbuf 는 fballoc() 또는 tpalloc() 함수에의해서메모리에할당된필드버퍼이다. 2.1.27.4 반환값 메모리에할당된필드버퍼중아직사용되지않은메모리의크기를 byte 단위로리턴한다. 2.1.27.5 오류 다음과같은상황에서 fbget_used() 은실패하고, fberrno 에아래값중하나가설정된다 FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 87
2.1.27.6 예제 #include demo_fdl.h... long ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, 1111, 0); ret = fbget_unused (fbuf); printf( Unused Buffer Size: [%d]\n, ret); /* output: Unused Buffer Size: [1000] */... 2.1.27.7 참조 fbcalcsize(), fbget_fbsize(), fbget_used() 88
2.1.28 fbget_used 2.1.28.1 이름 fbget_used : 메모리에크기계산 할당된필드버퍼중현재사용중인필드버퍼의 2.1.28.2 사용방법 #include <fbuf.h> #include <atmi.h> long fbget_used(fbuf *fbuf) 2.1.28.3 설명 이함수는 fballoc() 또는 tpalloc() 함수에의해서메모리에할당된필드버퍼중현재사용중인필드버퍼의크기를계산하여 byte 단위로리턴하는함수이다. fbuf 는 fballoc() 또는 tpalloc() 함수에의해서메모리에할당된필드버퍼이다. 2.1.28.4 반환값 메모리에할당된필드버퍼중현재사용중인메모리의크기를 byte 단위로리턴한다. 2.1.28.5 오류 다음과같은상황에서 fbget_used() 은실패하고, fberrno 에아래값중하나가설정된다 FBEINVAL input argument 로지정된값들중유효하지않은 argument 가있다. 89
2.1.28.6 예제 #include demo_fdl.h... long ret; FBUF *fbuf; if ((fbuf = fballoc(10, 100)) == NULL) { printf( fballoc failed, errno = %d\n, fberror);... } fbput(fbuf, INPUT, 1111, 0); ret = fbget_used(fbuf); printf( Used Buffer Size: [%d]\n, ret); /* output: Used Buffer Size: [24] */... 2.1.28.7 참조 fbcalcsize(), fbget_fbs ize(), fbget_unused() 90
2.1.29 fbgetf 2.1.29.1 이름 fbgetf : 필드버퍼에 저장되어있는필드데이터를순차적으로리턴 2.1.29.2 사용방법 #include <fbuf.h> #include <atmi.h> int fbgetf(fbuf *fbuf, FLDKEY fldkey, char *loc, int *fldlen, int *pos) 2.1.29.3 설명 이함수는 fballoc() 또는 tpalloc() 함수를통하여메모리에할당된필드버퍼에저장되어있는필드데이터들을순차적으로읽어오는함수이다. fbgetf() 함수는 fbget() 함수와똑같은기능을하는함수이지만내부적으로다음필드의위치를저장하고있으므로 fbget() 함수보다수행속도가월등하게빠르다. (e.g. 실제테스트해본결과 Visual Basic 에서 20,000 개의필드데이터를받는경우, fbget() 을이용하면 400 초가걸리는반면, fbgetf() 를이용하면단 2.5 초만걸린다.) pos 는 fbgetf() 함수를사용할필드키마다따로두어야하고, fbgetf() 함수를호출하기전에반드시 0으로초기화해주어야한다. fbuf 는 fballoc() 또는 tpalloc() 함수로메모리에할당된필드버퍼이고, fldkey 는데이터를가져오고자하는필드키를나타내고, 읽어온데이터는 loc 에리턴되고, 읽어온데이터의길이는 fldlen 에리턴된다. pos 는읽어올다음데이터의위치를리턴하는포인터이다. 2.1.29.4 반환값 지정한필드키를필드버퍼에서찾지못하면 1 을리턴하고 fberror 에에러번호를 setting 한다. 지정한필드키의필드데이터를정상적으로읽어왔다면 1 을리턴한다. 91