ctl-opt option(*srcstmt);
ctl-opt ccsid(*ucs2 : *utf16); // Code this for every generator
ctl-opt nomain;
/copy QOAR/QRPGLESRC,QRNDTAGEN // Copy file for all generators
/copy AF4TEST/MANIP740,GEN01_H // voir la capture d'écran ci-dessus
dcl-proc genPropsFileOpts export;
dcl-pi *n extproc(*dclcase);
parm likeds(QrnDgParm_t);
end-pi;
dcl-ds userParm likeds(propGenOpts_t) based(pUserparm);
dcl-ds state qualified based(pState);
separator like(userParm.separator);
equalStartQuote like(userParm.quote : +1);
endQuote like(userParm.quote);
end-ds;
pQrnDgEnv = parm.env; // fonctions callback
if parm.event = QrnDgEvent_01_StartMultiple // valeurs possibles
or parm.event = QrnDgEvent_03_Start;
// première fois ?
if parm.generatorState = *null; // mémoire non allouée, première fois
// création de notre data structure "state" par allocation mémoire
// afin de mémoriser les valeurs, soit recues, soit fixées par défaut
pState = %alloc(%size(state));
clear state;
state.separator = ';'; // séparateur par dft
parm.generatorState = pState;
endif;
endif; // fin de Start ou StartMultiple
// accès à la DS state générée juste au-dessus
// (le pointeur est transmis à chaque appel)
pState = parm.generatorState;
if parm.event = QrnDgEvent_03_Start;
// s'il y a des options, vérification
if parm.userParm <> *null;
if parm.userParmType <> QrnUserParmType_dataStruct // voir les types
or parm.userParmSize <> %size(propGenOpts_t);
reportError (parm
: ERR_1_GEN_OPTIONS_NOT_VALID
: 'Options must be LIKEDS(propGenOpts_t)');
else; // options ok, récupération des paramètres
pUserParm = parm.userParm;
state.separator = userParm.separator;
state.equalStartQuote = '=' + userParm.quote;
state.endQuote = userParm.quote;
endif;
endif;
elseif parm.event = QrnDgEvent_11_ScalarValue;
// générer nom="valeur"
// d'abord le nom
QrnDgAddText (parm.handle
: %addr(parm.name : *data)
: %len(parm.name));
// le signe = suivi, éventuellement, par le délimiteur
QrnDgAddText (parm.handle
: %addr(state.equalStartQuote : *data)
: %len(state.equalStartQuote));
// puis la valeur
QrnDgAddText (parm.handle
: parm.scalar.value
: parm.scalar.valueLenChars);
// éventuellement, 2ème délimiteur
if %len(state.endQuote) > 0;
QrnDgAddText (parm.handle
: %addr(state.endQuote : *data)
: %len(state.endQuote));
endif;
// sortie fichier : générer retour chariot
if parm.outputIsToFile;
QrnDgAddTextNewline (parm.handle);
else; // sinon caractère ;
QrnDgAddText (parm.handle
: %addr(state.separator : *data)
: %len(state.separator));
endif;
endif;
end-proc genPropsFileOpts;
Sous procédures
//--------------------------------------------------------------
// issueMessage - envoi message *DIAG ou *ESCAPE (erreur)
//--------------------------------------------------------------
dcl-proc issueMessage;
dcl-pi *n extproc(*dclcase);
msg varchar(200) const;
msgType char(10) const;
proc varchar(200) const;
stackOffset int(10) const;
end-pi;
dcl-pr QMHSNDPM extpgm;
msgId char(7) const;
msgFile likeds(qualMsgf);
msgData char(500) const;
dataLen int(10) const;
msgType char(10) const;
stackEntry char(10) const;
stackOffset int(10) const;
msgKey char(4) const;
errorCode likeds(errcode);
end-pr;
dcl-ds qualMsgf qualified;
msgf char(10) inz('QCPFMSG');
lib char(10) inz('*LIBL');
end-ds;
dcl-ds errCode qualified;
bytesProvided int(10) inz(0); // 0 = message d'erreur si prb.
bytesAvailable int(10) inz(0);
end-ds;
dcl-s msgkey char(4);
dcl-c STACK_OFFSET_TO_CALLER 2; // 1 pour le PEP(ILE) + 1 pour l'appelant
QMHSNDPM ('CPF9898' : qualMsgf
: msg : %len(msg) : msgType
: proc : stackOffset
: msgkey : errCode);
end-proc;
//--------------------------------------------------------------
// reportError - fin de l'opération
//--------------------------------------------------------------
dcl-proc reportError;
dcl-pi *n extproc(*dclcase);
parm likeds(QrnDgParm_t);
errorCode int(10) value;
errorMessage varchar(500) const;
end-pi;
// Envoi d'un message diag pour trace
issueMessage (errorMessage
: DIAGNOSTIC_MESSAGE
: '*' : 2); // envoi à l'appelant
// arrêt de l'opération Data-Gen QrnDgReportError (parm.handle
: errorCode);
end-proc;