Thank you!
Here is an excerpt of a C program which reads a directory of a PDS
and inserts the member names into an AVL tree (the insert is not shown,
it is done by a function call - see below).
Kind regards
Bernd
static int lese_memberliste (char *parm_infile,
baumMEMknoten **pres)
/************************************************/
/* Funktion zum Lesen einer Memberliste */
/* einer PO-Datei; die Membernamen werden */
/* in einen AVL-Baum eingetragen */
/************************************************/
{
FILE *direct;
char buf [256];
int x;
char *cp;
int laenge;
unsigned long ttrc;
int ttr;
int anz_bytes;
int eof;
int rc = 0;
char mem_high [8];
baumMEMknoten *proot = NULL;
baumMEMknoten *pneu;
int hchanged;
membname m;
eof = 0;
memset (mem_high, 0xff, 8);
/************************************************/
/* raus, wenn Directory nicht aufgeht */
/************************************************/
direct = fopen (parm_infile, "rb");
if (direct == NULL)
RETURN_VALUE 8;
for (;;)
{
/************************************************/
/* naechsten Directory-Block einlesen */
/************************************************/
memset (buf, 0x00, 256);
x = fread (buf, 1, 256, direct);
if (x == 0)
break;
#ifdef TEST
printf ("[cp2970] \n");
printf ("[cp2970] Rueckgabe von fread = %d\n", x);
printf ("[cp2970] \n");
dump (buf, buf + x - 1, stdout);
#endif
cp = buf + 2;
laenge = *((short *) buf) - 2;
while (laenge > 0)
{
/************************************************/
/* naehere Info hierzu in den IBM-Brosch. */
/* zum Aufbau der PO-Directories. */
/************************************************/
if (memcmp (cp, mem_high, 8) == 0)
{
eof = 1;
break;
}
/************************************************/
/* Laenge des Eintrags in Halbworten steht */
/* in den Bits 3 bis 7 des TTRC-Wortes */
/************************************************/
ttrc = *((unsigned long *) (cp + 8));
ttr = ttrc >> 8;
anz_bytes = (ttrc & 0x1f) * 2;
#ifdef TEST
printf ("[cp2970] Member %-8.8s TTR %06X Laenge/Bytes %d\n",
cp, ttr, anz_bytes);
#endif
if (memcmp (cp, "ED", 2) == 0)
{
memcpy (
m.name, cp, 8);
hchanged = 0;
pneu = baumMEMsuche (&m, &proot, &hchanged, 1);
pneu -> obj = atoi (cp + 2);
}
cp += (anz_bytes + 12);
laenge -= (anz_bytes + 12);
}
if (eof)
break;
}
fclose (direct);
*pres = proot;
RETURN_VALUE rc;