L'exemple de programme C suivant, ZFLDATA, procède à l'analyse dynamique du nom de fichier
d'un nom symbolique transmis. L'exemple de programme PL/I dans les références associées illustre l'appel à ce
programme C pour analyser le nom de fichier du nom symbolique SYSXMLSD pour le suivi des erreurs.
Dans le cadre du traitement,
TMPLT00 appelle une
routine C appelée ZFLDATA. Cette routine a pour seul objet de prendre un nom de définition de données
de fichier et, le cas échéant, de renvoyer le nom de fichier auquel fait référence le nom de définition
de données. La source de ZFLDATA est présentée ci-dessous.
#include <stdio.h>
#include <string.h>
#define FILENAMEMAX 255
#define ATTRMAX 100
int main(void)
{
FILE *stream;
char dsn[FILENAMEMAX];
char filename[FILENAMEMAX];
char fileattrs[ATTRMAX];
int rc;
int getFileData(char * dsn, char * filename, char * fileattrs);
memset(filename ,'\0',sizeof(filename));
memset(filename ,'\0',sizeof(fileattrs));
memcpy(filename ,"DD:SYSXMLSD",sizeof("DD:SYSXMLSD"));
memcpy(fileattrs ,"a+",
sizeof("a+"));
rc = ZFLDATA(dsn,filename,fileattrs);
if (rc != 0)
printf("fldata failed\n");
else
printf("filename is %s\n",dsn);
}
int ZFLDATA(char * dsn, char *fn, char *fileattrs)
{
fldata_t fileinfo;
fldata_t * fileinfoptr;
int rc;
FILE *stream;
/******************************************************/
/*Get a stream for the file and attributes passed in */
/******************************************************/
stream = fopen(fn,fileattrs);
if (stream == NULL)
{
perror("***FAILURE OPENING FILE*****");
}
/******************************************************/
/*Get the actual dataset name on DASD from fldata */
/******************************************************/
memset(dsn ,'\0',
sizeof(dsn));
fileinfoptr = &fileinfo;
rc = fldata(stream, dsn, &fileinfo;);
if (rc != 0)
{
printf("fldata failed\n");
}
else
{
memcpy (dsn,
fileinfoptr->__dsname,
strlen(fileinfoptr->__dsname));
}
fclose(stream);
return rc;
}