Listing 6

struct rec {
   char name[31];
   char address[21];
   char city[16];
   char state[3];
   char zip[6];
   };
static int field_sizes[] = {31, 21, 16, 3, 6};
/*
Alternatively, this could be written as:

static int field_sizes[] = {    sizeof(rec.name),
   sizeof(rec.address),
   ...
   };
*/
#define field_count (sizeof(field_sizes)/sizeof(int));

   main()
       {
      char record_in[MAX];
      struct rec record;
      ...
      while(fgets(record_inn, MAX, filin) != NULL)
          {
          load_struct(&record, record_in, field_sizes,
field_count, TRUE);
          print_struct(&record, field_sizes, field_count, TRUE);
          ...
          }
      }

print_struct(record, field_sizes, field_count, nul_terminated)
char *record;          /* Record to print */
int field_sizes[];     /* Size of fields */
int field_count;       /* Number of fields */
int nul_terminated;    /* If fields are nul terminated */
   {
   int field;
   int length;
   char *pc;
   printf("\n");
   pc = record;
   for (field = 0; field < field_count; field++)
       {
       if (nul_terminated)
          printf("%s:",pc);
       else
          {
          length = field_sizes[field];
          printf("%.*s:", length, pc);
          }
       pc += field_sizes[field];
       }
   }

load_struct(record, record_in, field_sizes, field_count,
nul_terminated)
char *record;
char *record_in;
int field_sizes[];
int field_count;
int nul_terminated; /* If fields out should be nul terminated */
   {
   int field;
   int length;
   char *pc;
   char *pc_in;

   pc = record;
   pc_in = record_in;
   for (field = 0; field < field_count; field++)
       {
       length = field_sizes[field];
       strncpy(pc, pc_in, length);
       if (nul_terminated)
          {
          pc[length-1] = '\0';
          pc_in += length - 1;
          }
       else
          pc_in += length;
       pc += field_sizes[field];
       }
   }

/* End of File */