/***************************************

Programma dimostrativo per le strutture
           last update 10/07/87
      AMIGA-Version by Frank Kremser
PC-Original-Version by Dr. Edgar Huckert
       (C) 1987  by Markt & Technik

****************************************

Lettura e analisi di una cartella personale

******************************************/

#include <stdio.h>

#define LF      0x0a
#define LSTR    20
#define MAXPERS 100

/* Costituzione di una cartella personale */
typedef struct
{
  char fname[LSTR];   /* Cognome */
  char vname[LSTR];   /* Nome    */
  char strasse[LSTR]; /* Via     */
  char wohnort[LSTR]; /* Local.  */
  long verdienst;   /* Retrib. annua */
} PERSONAL;
PERSONAL pakte[MAXPERS];

/* Posiziona in "ziel" (destinazione) una stringa */
/* delimitata da una virgola o da un LF           */
/* Fornisce l'indirizzo di partenza della successiva */
char *getfield(quelle,ziel)
char *quelle,*ziel;
{
  while (*quelle != ',')
    {
     if (*quelle == LF) break;
     *ziel++ = *quelle++;
    }
  *ziel = 0;
  return(quelle+1);
}   /* end getfield */

/* Legge la stringa successiva per la   */
/* Cartella personale                   */
/* Fornisce l'indirizzo della stringa   */
/* memorizzata oppure NULL (zero)       */
/* Ogni input nella stringa deve        */
/* essere completo                      */
/* Ogni input è separato da una virgola */
/* da quello successivo                 */
PERSONAL *readstruct(ifil,npakte)
FILE *ifil;
/* Numero della cartella libera successiva */
int npakte;
{
  char zeile[80],*zadr;

  if (fgets(zeile,80,ifil) == NULL) return(NULL);
  zadr = getfield(zeile,pakte[npakte].fname);
  zadr = getfield(zadr,pakte[npakte].vname);
  zadr = getfield(zadr,pakte[npakte].strasse);
  zadr = getfield(zadr,pakte[npakte].wohnort);
  sscanf(zadr,"%ld",&pakte[npakte].verdienst);
  return(&pakte[npakte]);
}   /* end readstruct */

void main()
{
  int n,maxpers;
  long lohnsum;
  char filna[100];
  FILE *ifil;

  maxpers = 0;  /* conta le cartelle personali */

  /* Lettura dei dati */
  printf("\nFile dati:");
  gets(filna);
  if ((ifil = fopen(filna,"r")) == NULL) exit(1);
  while (1)
    {
     if (readstruct(ifil,maxpers) == NULL) break;
     if (maxpers++ >= MAXPERS) break;
    }

  /* Elaborazione delle cartelle */
  lohnsum = 0;
  for (n = 0; n < maxpers; n++)
    {
     printf("\nDipendente: %15s  Retrib.:%ld", pakte[n].fname,
                                              pakte[n].verdienst);
     lohnsum += pakte[n].verdienst;
    }
  printf("\n\nSomma retrib.: %ld \n\n",lohnsum);
  fclose(ifil);
}   /* end main */
