CSV_H5 /if defined(CSV_H5_DEFINED) /eof /endif /define CSV_H5_DEFINED D CSV_getfldX PR 1N extproc(*CL:'CSV_GETFLDX') D peData 65502A varying D peFldData 65502A varying options(*varsize) D peVarSize 10I 0 value CSVDEMO5 H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('CSV5') /copy CSV_H5 D acct s 4s 0 D temp s 4a varying D name s 30a varying D addr s 30a varying D city s 15a varying D state s 2a varying D peFldData s 65502A varying D fc s 10i 0 D fld s 132a varying /free peFldData = '1,"Art T","123 main","jackson","NJ"'; CSV_getfldX(peFldData: temp: %size(temp)); CSV_getfldX(peFldData: name: %size(name)); CSV_getfldX(peFldData: addr: %size(addr)); CSV_getfldX(peFldData: city: %size(city)); CSV_getfldX(peFldData: state: %size(state)); acct = %dec( temp: 4: 0); *inlr = *on; /end-free CSVR5 H NOMAIN OPTION(*SRCSTMT: *NOSHOWCPY) BNDDIR('QC2LE') /copy bufio_h /copy csv_h5 D VARPREF C 2 D LINEFEED C X'25' D CARRTN C X'0D' D fp s * inz(*NULL) D buf s 65502A varying inz('') D bufpos s 10I 0 inz(0) D flddel s 1A inz(',') D strdel1 s 1A inz('"') D strdel2 s 1A inz('''') D ReportError PR D peMsg 256a varying const D options(*varsize:*nopass:*omit) P CSV_getfldX B export D CSV_getfldX PI 1N D buf 65502A varying D peFldData 65502A varying options(*varsize) D peVarSize 10I 0 value D UNQUOTED C 0 D QUOTED C 1 D ENDQUOTE C 2 D state s 10i 0 inz(UNQUOTED) D max s 10I 0 D len s 10I 0 D start s 10I 0 D pos s 10I 0 D char s 1A based(p_char) D qchar s 1A /free max = peVarSize - VARPREF; len = %len(buf) -1 ; start = bufpos; %len(peFldData) = 0; if (start > len); return *OFF; endif; for pos = start to len; p_char = %addr(buf) + VARPREF + pos; select; when state = UNQUOTED; select; when char = flddel; leave; when char = strdel1 or char = strDel2; state = QUOTED; qchar = char; when %len(peFldData) < max; peFldData += char; endsl; when state = QUOTED; select; when char = qchar; state = ENDQUOTE; when %len(peFldData) < max; peFldData += char; endsl; when state = ENDQUOTE; select; when char = qchar; state = QUOTED; if (%len(peFldData) < max); peFldData += char; endif; when char = flddel; leave; when char = strdel1 or char = strDel2; state = QUOTED; qchar = char; when %len(peFldData) < max; state = UNQUOTED; peFldData += char; endsl; endsl; endfor; bufpos = pos + 1; return *ON; /end-free P E P ReportError B D ReportError PI D peMsg 256a varying const D options(*varsize:*nopass:*omit) D my_errno_func PR * ExtProc('__errno') D my_errno s 10I 0 based(p_my_errno) D QMHSNDPM PR ExtPgm('QMHSNDPM') D MessageID 7A Const D QualMsgF 20A Const D MsgData 32767A Const options(*varsize) D MsgDtaLen 10I 0 Const D MsgType 10A Const D CallStkEnt 10A Const D CallStkCnt 10I 0 Const D MessageKey 4A D ErrorCode 32767A options(*varsize) D ErrorCode DS qualified D BytesProv 10I 0 inz(0) D BytesAvail 10I 0 inz(0) D MsgKey S 4A D MsgID s 7A D MsgDta s 256a varying /free if %parms>=1 and %addr(peMsg)<>*null; MsgId = 'CPF9897'; MsgDta = peMsg; else; p_my_errno = my_errno_func(); MsgID = 'CPE' + %editc( %dec(my_errno:4:0) : 'X' ); %len(MsgDta) = 0; endif; QMHSNDPM( MsgID : 'QCPFMSG *LIBL' : MsgDta : %len(MsgDta) : '*ESCAPE' : '*PGMBDY' : 1 : MsgKey : ErrorCode ); /end-free P E