Index: unk/Ohana/src/libohana/dvo/Makefile
===================================================================
--- /trunk/Ohana/src/libohana/dvo/Makefile	(revision 4484)
+++ 	(revision )
@@ -1,90 +1,0 @@
-default: dvo-autocode
-help:
-	@echo "make options: install dvo-autocode (default)"
-
-include ../../../Configure
-
-HOME	=	$(ROOT)/src/libohana/dvo
-SRC	=	$(HOME)/src
-BIN	=	$(HOME)/bin
-DEF	=	$(HOME)/def
-LIB	=	$(HOME)/lib
-INC	=	$(HOME)/include
-MAN	= 	$(HOME)/doc
-DESTLIB	=	$(LLIB)
-DESTINC	=	$(LINC)
-DESTMAN	=	$(LMAN)
-
-INCS	=	-I$(INC) -I$(LINC)
-LIBS	= 	-L$(LLIB)
-CFLAGS	=	$(INCS) -D$(ARCH)
-LFLAGS	=	$(LIBS)
-
-install: $(DESTINC)/dvo-autocode.h $(DESTLIB)/libdvo-autocode.a
-	@echo done install
-
-dvo-autocode: $(INC)/dvo-autocode.h $(LIB)/libdvo-autocode.$(ARCH).a 
-	@echo done dvo-autocode
-
-LIBOBJ = \
-$(SRC)/spectrum.$(ARCH).o \
-$(SRC)/spectrum-ascii.$(ARCH).o
-
-LIBINC = \
-$(INC)/spectrum.h \
-$(INC)/spectrum-ascii.h
-
-COMINC = \
-$(DEF)/common.h
-
-$(LIBOBJ): $(INC)/dvo-autocode.h
-
-$(INC)/dvo-autocode.h: $(LIBINC)
-	cat $(COMINC) $(LIBINC) > $(INC)/dvo-autocode.h
-	@echo done with libdvo-autocode.a:
-
-$(DESTINC)/dvo-autocode.h: $(INC)/dvo-autocode.h
-	@if [ ! -d $(DESTINC) ]; then mkdir -p $(DESTINC); fi
-	rm -f $(DESTINC)/dvo-autocode.h
-	cp $(INC)/dvo-autocode.h $(DESTINC)/
-	@echo installed dvo-autocode.h
-
-$(LIB)/libdvo-autocode.$(ARCH).a: $(LIBOBJ)
-	@if [ ! -d $(LIB) ]; then mkdir -p $(LIB); fi
-	rm -f $(LIB)/libdvo-autocode.$(ARCH).a
-	ar rcv $(LIB)/libdvo-autocode.$(ARCH).a $(LIBOBJ)
-	$(RANLIB) $(LIB)/libdvo-autocode.$(ARCH).a
-	@echo done with libdvo-autocode.$(ARCH).a
-
-$(DESTLIB)/libdvo-autocode.a: $(LIB)/libdvo-autocode.$(ARCH).a 
-	@if [ ! -d $(DESTLIB) ]; then mkdir -p $(DESTLIB); fi
-	rm -f  $(DESTLIB)/libdvo-autocode.a
-	cp $(LIB)/libdvo-autocode.$(ARCH).a $(DESTLIB)/libdvo-autocode.a
-	@echo installed libdvo-autocode.a
-
-$(INC)/%.h: $(DEF)/%.d $(DEF)/dvo-autocode.h
-	@if [ ! -d $(INC) ]; then mkdir -p $(INC); fi
-	generate $< $(DEF)/dvo-autocode.h $@
-	@echo done with $*.h
-
-$(SRC)/%.c: $(DEF)/%.d $(DEF)/dvo-autocode.c
-	@if [ ! -d $(SRC) ]; then mkdir -p $(SRC); fi
-	generate $< $(DEF)/dvo-autocode.c $@
-	@echo done with $*.c
-
-%.$(ARCH).o: %.c
-	$(CC) $(CFLAGS) -c $*.c -o $@
-	@echo done with $*.o
-
-clean:	
-	rm -f `find . -name "*.o"`
-	rm -f `find . -name "*.a"`
-	rm -f `find . -name "*~"`
-	rm -f `find . -name "#*"`
-	rm -f `find src -name "*.c"`
-	rm -f `find include -name "*.h"`
-# 	this is an unusual target!  it deletes .c and .h files!
-
-.PRECIOUS: $(SRC)/%.c
-.PRECIOUS: %.$(ARCH).o
-.PRECIOUS: $(BIN)/%.$(ARCH)
Index: unk/Ohana/src/libohana/dvo/def/common.h
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/common.h	(revision 4484)
+++ 	(revision )
@@ -1,25 +1,0 @@
-# include <ohana.h>
-
-# define SWAP_BYTE(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+1]; byte[X+1] = tmp;
-# define SWAP_WORD(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+3]; byte[X+3] = tmp; \
-  tmp = byte[X+1]; byte[X+1] = byte[X+2]; byte[X+2] = tmp;
-# define SWAP_DBLE(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+7]; byte[X+7] = tmp; \
-  tmp = byte[X+1]; byte[X+1] = byte[X+6]; byte[X+6] = tmp; \
-  tmp = byte[X+2]; byte[X+2] = byte[X+5]; byte[X+5] = tmp; \
-  tmp = byte[X+3]; byte[X+3] = byte[X+4]; byte[X+4] = tmp;
-
-# ifdef linux
-# define BYTE_SWAP
-# endif
-
-# ifdef sid
-# define BYTE_SWAP
-# endif
-
-# ifdef dec
-# define BYTE_SWAP
-# endif
-
Index: unk/Ohana/src/libohana/dvo/def/dvo-autocode.c
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/dvo-autocode.c	(revision 4484)
+++ 	(revision )
@@ -1,60 +1,0 @@
-# include "dvo-autocode.h"
-
-int fits_convert_$STRUCT ($STRUCT *data, int size, int nitems) {
-
-  int i;
-  unsigned char *byte, tmp;
-
-  if (size != $SIZE) { 
-    fprintf (stderr, "ERROR: mismatch in data types $STRUCT: %d vs %d\n",
-	     size, $SIZE);
-    exit (1);
-  }
-
-  /* provide initial values to avoid compiler warnings for non-BYTE_SWAP arch */
-  i = tmp = 0;
-  byte = NULL;
-
-# ifdef BYTE_SWAP
-  byte = (char *) data;
-  for (i = 0; i < nitems; i++, byte += $SIZE) {
-    /** BYTE SWAP **/
-  }
-# endif  
-
-  return (TRUE);
-} 
-
-/*** add test of EXTNAME and header-defined columns? ***/
-$STRUCT *fits_table_get_$STRUCT (FTable *ftable, int *Ndata) {
-
-  $STRUCT *data;
-
-  *Ndata = ftable[0].header[0].Naxis[1];
-  data = ($STRUCT *) ftable[0].buffer;
-  fits_convert_$STRUCT (data, sizeof ($STRUCT), *Ndata);
-  
-  return (data);
-}
-
-int fits_table_set_$STRUCT (FTable *ftable, $STRUCT *data, int Ndata) {
-
-  Header *header;
-
-  header = ftable[0].header;
-
-  /* create table header */
-  fits_create_table_header (header, "$TYPE", "$EXTNAME");
-
-  /* define table layout */
-  /** TABLE DEFINITION **/
-
-  /* create table */
-  fits_create_table (header, ftable);
-
-  /* add data values */
-  fits_convert_$STRUCT (data, sizeof ($STRUCT), Ndata);
-  fits_add_rows (ftable, (char *) data, Ndata, sizeof ($STRUCT));
-
-  return (TRUE);
-}
Index: unk/Ohana/src/libohana/dvo/def/dvo-autocode.h
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/dvo-autocode.h	(revision 4484)
+++ 	(revision )
@@ -1,6 +1,0 @@
-
-/** STRUCT DEFINITION **/
-
-$STRUCT *fits_table_get_$STRUCT (FTable *table, int *Ndata);
-int      fits_table_set_$STRUCT (FTable *ftable, $STRUCT *data, int Ndata);
-int      fits_convert_$STRUCT ($STRUCT *data, int size, int nitems);
Index: unk/Ohana/src/libohana/dvo/def/old/template.c
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/old/template.c	(revision 4484)
+++ 	(revision )
@@ -1,242 +1,0 @@
-# include "fitsdb.h"
-
-/* allocate db and components (not data) */
-$NAME_DB *$NAME_DB_Allocate (dbMode mode) {
-  
-  $NAME_DB *db;
-
-  ALLOCATE (db, $NAME_DB, 1);
-  ALLOCATE (db[0].phu,    Header, 1);
-  ALLOCATE (db[0].header, Header, 1);
-  if (mode == DB_VIRTUAL) {
-    ALLOCATE (db[0].vtable, VTable, 1);
-    db[0].ftable = NULL;
-  } else {
-    ALLOCATE (db[0].ftable, FTable, 1);
-    db[0].vtable = NULL;
-  }
-  return (db);
-}
-
-/* Create a new database table (in memory, not on disk) */
-/* we always use BINTABLE for the db tables */
-$NAME_DB *$NAME_DB_Init (dbMode mode) {
-
-  $NAME_DB *db;
-
-  db = $NAME_DB_Allocate (mode);
-
-  /* create the empty PHU */
-  fits_init_header (db[0].phu);    
-  db[0].phu[0].extend = TRUE;
-  fits_create_header (db[0].phu);
-  fits_print (db[0].phu, "NEXTEND", "%d", 1, 1);
-
-  /* create the basic table header */
-  fits_create_table_header (db[0].header, "BINTABLE", EXTNAME);
-  /** TABLE DEFINITION **/ 
-
-  /* create the initial table data */
-  if (mode == DB_VIRTUAL) {
-    fits_create_vtable (db[0].header, db[0].vtable, 0);
-  } else {
-    fits_create_table (db[0].header, db[0].ftable);
-  }
-
-  db[0].f = (FILE *) NULL;
-  db[0].filename = (char *) NULL;
-  db[0].lockreq = LCK_UNLOCK;
-  db[0].lockstate = LCK_UNLOCK;
-
-  return (db);
-}
-
-$NAME_DB *$NAME_DB_Load (char *filename, int lockreq) {
-
-  int i, Nx, Ny, Nc;
-  int lockstate;
-  char *byte, tmp;
-  FILE *f;
-  $NAME_DB *db;
-
-  /* filename is not defined */
-  if (filename == (char *) NULL) {
-    fprintf (stderr, "db file is not valid\n");
-    return (NULL);
-  }
-
-  /* lock database (soft) */
-  f = fsetlockfile (filename, TIMEOUT, lockreq, &lockstate);
-
-  /* lock set failure */
-  if ((f == (FILE *) NULL) && (lockstate != LCK_EMPTY)) {
-    fprintf (stderr, "can't set lock on %s\n", filename);
-    return (NULL);
-  }
-
-  /* this can only happen if lockreq is SOFT (file does not exist) */
-  if (lockstate == LCK_EMPTY) {
-    db = $NAME_DB_Init (DB_TOTAL);
-    db[0].lockreq = lockreq;
-    db[0].lockstate = lockstate;
-    return (db);
-  }
-    
-  /* build db data structure */
-  db = $NAME_DB_Allocate (DB_TOTAL);
-  db[0].f = f;
-  db[0].filename = filename;
-  db[0].lockreq = lockreq;
-  db[0].lockstate = lockstate;
-  
-  /* init & load in table data */
-  if (!fits_fread_header (f, db[0].phu)) { }
-  /* validate PHU vs FITS DB rules */
-
-  if (!fits_fread_header (f, db[0].header)) { }
-  /* validate header vs schema */
-
-  if (!fits_fread_ftable_data (f, db[0].ftable)) { }
-
-  fits_scan (db[0].header, "NAXIS1",  "%d", 1, &Nx);
-  fits_scan (db[0].header, "NAXIS2",  "%d", 1, &Ny);
-  fits_scan (db[0].header, "TFIELDS", "%d", 1, &Nc);
-
-  db[0].Nbyte = Nx;
-  db[0].Nrows = Ny;
-  db[0].Ncols = Nc;
-
-  $NAME_DB_Convert (db);
-
-  db[0].data = ($NAME *)db[0].ftable[0].buffer;
-  return (db);
-}
-
-$NAME_DB *$NAME_DB_Loadset (char *filename, int lockreq, int start, int Nrows) {
-
-  int i, Nx, Ny, Nc;
-  int lockstate;
-  char *byte, tmp;
-  FILE *f;
-  $NAME_DB *db;
-
-  /* filename is not defined */
-  if (filename == (char *) NULL) {
-    fprintf (stderr, "db file is not valid\n");
-    return (NULL);
-  }
-
-  /* lock database (soft) */
-  f = fsetlockfile (filename, TIMEOUT, lockreq, &lockstate);
-
-  /* lock set failure */
-  if ((f == (FILE *) NULL) && (lockstate != LCK_EMPTY)) {
-    fprintf (stderr, "can't set lock on %s\n", filename);
-    return (NULL);
-  }
-
-  /* this can only happen if lockreq is SOFT (file does not exist) */
-  if (lockstate == LCK_EMPTY) {
-    /* file is empty; if we requested any data, it is not there */
-    if (Nrows > 0) return (NULL);
-    db = $NAME_DB_Init (DB_VIRTUAL);
-    db[0].lockreq = lockreq;
-    db[0].lockstate = lockstate;
-    return (db);
-  }
-    
-  /* build db data structure */
-  db = $NAME_DB_Allocate (DB_VIRTUAL);
-  db[0].f = f;
-  db[0].filename = filename;
-  db[0].lockreq = lockreq;
-  db[0].lockstate = lockstate;
-  
-  /* init & load in table data */
-  if (!fits_fread_header (f, db[0].phu)) { }
-  /* validate PHU vs FITS DB rules */
-
-  if (!fits_fread_header (f, db[0].header)) { }
-  /* validate header vs schema */
-
-  if (!fits_fread_vtable_range (f, db[0].vtable, start, Nrows)) { }
-
-  fits_scan (db[0].header, "TFIELDS", "%d", 1, &Nc);
-  db[0].Nbyte = db[0].header[0].Naxis[0];
-  db[0].Nrows = db[0].header[0].Naxis[1];
-  db[0].Ncols = Nc;
-
-  $NAME_DB_Convert (db);
-
-  /** this does not make sense; how do we access vtable data? **/
-  /** db[0].data = ($NAME *)db[0].ftable.buffer; **/
-  return (db);
-}
-
-/* write out complete db */
-int $NAME_DB_Save ($NAME_DB *db) {
-
-  make_backup (db[0].filename);
-
-  $NAME_DB_Convert (db);
-
-  Fseek (db[0].f, 0, SEEK_SET);
-  if (!fits_fwrite_header  (db[0].f, db[0].phu)) { }
-  if (!fits_fwrite_header  (db[0].f, db[0].header)) { }
-  if (!fits_fwrite_table   (db[0].f, db[0].ftable)) { }
-
-  $NAME_DB_Free (db);
-
-  fclearlockfile (db[0].filename, db[0].f, db[0].lockreq, &db[0].lockstate);
-  return (TRUE);
-}
-
-/* write out complete headers and specific rows of db */
-int $NAME_DB_Saveset ($NAME_DB *db) {
-
-  $NAME_DB_Convert (db);
-
-  Fseek (db[0].f, 0, SEEK_SET);
-  if (!fits_fwrite_header  (db[0].f, db[0].phu)) { }
-  if (!fits_fwrite_header  (db[0].f, db[0].header)) { }
-  if (!fits_fwrite_vtable  (db[0].f, db[0].vtable)) { }
-
-  $NAME_DB_Free (db);
-
-  fclearlockfile (db[0].filename, db[0].f, db[0].lockreq, &db[0].lockstate);
-  return (TRUE);
-}
-
-$NAME_DB *$NAME_DB_Free ($NAME_DB *db) {
-
-  fits_free_header (db[0].phu);
-  fits_free_header (db[0].header);
-  fits_free_table  (db[0].ftable);
-  fits_free_vtable (db[0].vtable);
-  return (NULL);
-}
-
-/** this function does disk <--> memory conversion **/
-void $NAME_DB_Convert ($NAME_DB *db) {
-  
-  int i, Nx;
-  char *byte, tmp;
-
-  Nx = db[0].Nbyte;
-
-  if (db[0].ftable != NULL) {
-    for (i = 0; i < db[0].Nrows; i++) {
-      byte = &db[0].ftable[0].buffer[i*Nx];
-      /** BYTE SWAP **/
-    }
-  }
-
-  if (db[0].vtable != NULL) {
-    for (i = 0; i < db[0].vtable[0].Nrow; i++) {
-      byte = db[0].vtable[0].buffer[i];
-      /** BYTE SWAP **/
-    }
-  }
-
-}
-
Index: unk/Ohana/src/libohana/dvo/def/old/template.h
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/old/template.h	(revision 4484)
+++ 	(revision )
@@ -1,39 +1,0 @@
-# define TIMEOUT $TIMEOUT
-# define EXTNAME "$EXTNAME"
-
-/** STRUCT DEFINITION **/
-
-typedef struct {
-  FILE *f;
-  char *filename;
-
-  Header *phu;
-  Header *header;
-  FTable *ftable;
-  VTable *vtable;
-
-  int Nrows;
-  int Ncols;
-  int Nbyte;
-
-  int Nphu_disk;    // original size of PHU
-  int Nheader_disk; // original size of header 
-  int Nrows_disk;   // original number of rows
-
-  int lockstate;
-  int lockreq;
-  int virtual;
-
-  $NAME *data;
-} $NAME_DB;
-
-$NAME_DB *$NAME_DB_Allocate (dbMode mode);
-$NAME_DB *$NAME_DB_Init (dbMode mode);
-$NAME_DB *$NAME_DB_Load (char *filename, int lockreq);
-$NAME_DB *$NAME_DB_Loadset (char *filename, int lockreq, int start, int Nrows);
-$NAME_DB *$NAME_DB_Free ($NAME_DB *db);
-
-void $NAME_DB_Convert ($NAME_DB *db);
-
-int $NAME_DB_Saveset ($NAME_DB *db);
-int $NAME_DB_Save ($NAME_DB *db);
Index: unk/Ohana/src/libohana/dvo/def/old/test.d
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/old/test.d	(revision 4484)
+++ 	(revision )
@@ -1,10 +1,0 @@
-TIMEOUT 300
-
-NAME TEST
-EXTNAME TEST
-STRUCT Test
-FILE test
-
-FIELD time,   double,   data point in time, seconds 
-FIELD length, int,      file length,        bytes 
-FIELD name,   char[23], file name,           
Index: unk/Ohana/src/libohana/dvo/def/smpdata.d
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/smpdata.d	(revision 4484)
+++ 	(revision )
@@ -1,17 +1,0 @@
-# name of structure type
-STRUCT  SMPData
-EXTNAME SMPFILE
-
-# elements of data structure / FITS table
-FIELD X,      X_PIX,      float,    x coord,              pixels
-FIELD Y,      Y_PIX,      float,    y coord,              pixels
-FIELD M,      MAG_RAW,    float,    inst mags,            mags
-FIELD dM,     MAG_ERR,    float,    inst mag error,       mags
-FIELD Mgal,   MAG_GAL,    float,    galaxy mag,           mags
-FIELD Map,    MAG_AP,     float,    aperture mag,         mags
-FIELD sky,    LOG_SKY,    float,    log-10 of sky,        cnts/sec
-FIELD fx,     FWHM_X,     float,    semi-major,           pixels
-FIELD fy,     FWHM_Y,     float,    semi-minor,           pixels
-FIELD df,     THETA,      float,    ellipse angle,        degrees
-FIELD dophot, DOPHOT,     char,     dophot type,          none
-FIELD dummy,  DUMMY,      char[3],  padding,              none
Index: unk/Ohana/src/libohana/dvo/def/spectrum-ascii.d
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/spectrum-ascii.d	(revision 4484)
+++ 	(revision )
@@ -1,29 +1,0 @@
-# name of structure type
-STRUCT  SpectrumASCII
-EXTNAME SPECTRUM
-TYPE    TABLE
-SIZE    328
-
-# elements of data structure / FITS table
-FIELD filename,   FILENAME,   char[32],    filename in db,        
-FIELD pathname,   PATHNAME,   char[64],    fullpath in db,        
-FIELD instrument, INSTRUMENT, char[16],    instrument,            
-FIELD telescope,  TELESCOPE,  char[16],    telescope,             
-FIELD objname,    OBJNAME,    char[16],    object name,           
-FIELD extname,    EXTNAME,    char[16],    extname in file,       
-
-FIELD ra,         RA,         float[10.6], ra,                    degrees
-FIELD dec,        DEC,        float[10.6], dec,                   degrees
-FIELD exptime,    EXPTIME,    float[6.1],  exposure time,         seconds
-FIELD airmass,    AIRMASS,    float[5.3],  airmass,               none
-FIELD Ws,         Ws,         float[7.2],  spectral range start,  Angstrom
-FIELD We,         We,         float[7.2],  spectral range end,    Angstrom
-FIELD dW,         dW,         float[7.2],  spectral resolution,   Angstrom / pix
-	       			      
-FIELD Nspec,      NSPECTRA,   int[3],      number of spectra,     none
-FIELD obstime,    OBS_TIME,   char[20],    time of measurement,   yyyy/mm/dd
-FIELD regtime,    REG_TIME,   char[20],    time of registration,  yyyy/mm/dd
-	       			      
-FIELD mode,       MODE,       int[2],      phu/mef/ext,           
-FIELD state,      STATE,      int[2],      raw/wav/flx/etc,       
-FIELD flag,       FLAG,       int[3],      status flags,          
Index: unk/Ohana/src/libohana/dvo/def/spectrum.d
===================================================================
--- /trunk/Ohana/src/libohana/dvo/def/spectrum.d	(revision 4484)
+++ 	(revision )
@@ -1,32 +1,0 @@
-# name of structure type
-STRUCT  Spectrum
-EXTNAME SPECTRUM_DATABASE
-TYPE    BINTABLE
-SIZE    216
-
-# elements of data structure / FITS table
-	       			      
-FIELD ra,         RA,         float,     ra,                    degrees
-FIELD dec,        DEC,        float,     dec,                   degrees
-FIELD exptime,    EXPTIME,    float,     exposure time,         seconds
-FIELD airmass,    AIRMASS,    float,     airmass,               
-FIELD Ws,         Ws,         float,     spectral range start,  Angstrom
-FIELD We,         We,         float,     spectral range end,    Angstrom
-FIELD dW,         dW,         float,     spectral resolution,   Angstrom / pix
-	       			      
-FIELD Nspec,      NSPECTRA,   int,       number of spectra,     
-FIELD obstime,    OBS_TIME,   int,       time of measurement,   seconds since 1 Jan 1970 UT
-FIELD regtime,    REG_TIME,   int,       time of registration,  seconds since 1 Jan 1970 UT
-	       			      
-FIELD mode,       MODE,       char,      phu/mef/ext           
-FIELD state,      STATE,      char,      raw/wav/flx/etc       
-FIELD flag,       FLAG,       char,      status flags
-FIELD extra,      EXTRA,      char[13],  room for expansion
-
-FIELD pathname,   PATHNAME,   char[64],  fullpath in db
-FIELD filename,   FILENAME,   char[32],  filename in db
-FIELD extname,    EXTNAME,    char[16],  extname in file,       
-
-FIELD instrument, INSTRUMENT, char[16],  instrument,            
-FIELD telescope,  TELESCOPE,  char[16],  telescope,             
-FIELD objname,    OBJNAME,    char[16],  object name,           
Index: unk/Ohana/src/libohana/dvo/generate
===================================================================
--- /trunk/Ohana/src/libohana/dvo/generate	(revision 4484)
+++ 	(revision )
@@ -1,277 +1,0 @@
-#!/usr/bin/env perl
-
-if (@ARGV != 3) { die "generate (schema) (template) (output)\n"; }
-
-$schema   = $ARGV[0];
-$template = $ARGV[1];
-$output   = $ARGV[2];
-
-&parse_schema;
-&parse_template;
-exit 0;
-
-sub parse_schema {
-    open (FILE, "$schema");
-    @list = <FILE>;
-    close (FILE);
-
-    $NAME    = "";
-    $FILE    = "";
-    $Nfield  = 0;
-    $TIMEOUT = 0;
-
-    &init_key ("TIMEOUT");
-    &init_key ("NAME");
-    &init_key ("EXTNAME");
-    &init_key ("STRUCT");
-    &init_key ("FILE");
-    &init_key ("SIZE");
-    &init_key ("TYPE");
-
-    foreach $line (@list) {
-	chop $line;
-	($key, $value) = split (" ", $line, 2);
-	
-	&set_keypair ($key, $value);
-
-	# there are used internally (not just a replacement)
-	if ($key eq "TYPE") { $TYPE = $value; }
-	if ($key eq "STRUCT") { $STRUCT = $value; }
-
-	# not a simple key/value entry
-	if ($key eq "FIELD") {
-	    ($element, $field, $format, $comment, $unit) = split (/,\s+/, $value);
-	    push @element, $element;
-	    push @field,   $field;
-	    push @format,  $format;
-	    push @comment, $comment;
-	    push @unit,    $unit;
-	}
-    }
-    if ($TYPE eq "BINTABLE") { &count_bintablesize; }
-    if ($TYPE eq "TABLE") { &count_tablesize; }
-}
-
-sub parse_template {
-    open (FILE, $template);
-    @list = <FILE>;
-    close (FILE);
-
-    open (FILE, ">$output");
-
-    foreach $line (@list) {
-	
-	&check_keypairs;
-
-	print FILE $line;
-
-	# fill in structure
-	if ($line =~ m|/\*\* STRUCT DEFINITION \*\*/|) {
-	    &write_structure;
-	}
-
-	# fill in structure
-	if ($line =~ m|/\*\* TABLE DEFINITION \*\*/|) {
-	    if ($TYPE eq "BINTABLE") { &write_bintabledefs; }
-	    if ($TYPE eq "TABLE")    { &write_tabledefs; }
-	}
-
-	# fill in swaps
-	if ($line =~ m|/\*\* BYTE SWAP \*\*/|) {
-	    &write_byteswaps;
-	}
-    }
-    close (FILE);
-}
-
-sub write_bintabledefs {
-
-    for ($i = 0; $i < @field; $i++) {
-	# add [\d\.] to match ascii-type formats
-	($type, $length) = $format[$i] =~ m|^(\w+)\[(\d+)\]|;
-	if (!$type && !$length) { $type = $format[$i]; }
-
-	if ($type eq "char") {
-	    if ($length == 0) { 
-		$pt1 = sprintf "A";
-	    } else {
-		$pt1 = sprintf "%dA", $length;
-	    }
-	}
-
-	if ($type eq "byte")   { $pt1 = "B"; }
-	if ($type eq "short")  { $pt1 = "I"; }
-	if ($type eq "int")    { $pt1 = "J"; }
-	if ($type eq "float")  { $pt1 = "E"; }
-	if ($type eq "double") { $pt1 = "D"; }
-
-	printf FILE "  fits_define_bintable_column (header, ";
-	printf FILE "\"%s\",   ", $pt1;
-	printf FILE "\"%s\",   ", $field[$i];
-	printf FILE "\"%s\", ",   $comment[$i];
-	printf FILE "\"%s\", 1.0, 0.0);\n", $unit[$i];
-    }
-
-}
-
-sub write_tabledefs {
-
-    for ($i = 0; $i < @field; $i++) {
-	($type, $length) = $format[$i] =~ m|^(\w+)\[([\d\.]+)\]|;
-	if (!$type && !$length) { die "format must be specified for ASCII table"; }
-
-	if ($type eq "char")   { $pt1 = sprintf "A%s", $length; }
-	if ($type eq "byte")   { $pt1 = sprintf "I%s", $length; }
-	if ($type eq "short")  { $pt1 = sprintf "I%s", $length; }
-	if ($type eq "int")    { $pt1 = sprintf "I%s", $length; }
-	if ($type eq "float")  { $pt1 = sprintf "F%s", $length; }
-	if ($type eq "double") { $pt1 = sprintf "F%s", $length; }
-
-	printf FILE "  fits_define_table_column (header, ";
-	printf FILE "\"%s\", ",   $pt1;
-	printf FILE "\"%s\", ",   $field[$i];
-	printf FILE "\"%s\", ",   $comment[$i];
-	printf FILE "\"%s\");\n", $unit[$i];
-    }
-
-}
-
-sub write_structure {
-    print FILE "typedef struct {\n";
-    for ($i = 0; $i < @element; $i++) {
-	($type, $length) = $format[$i] =~ m|^(\w+)\[([\d\.]+)\]|;
-	if (!$type && !$length) { $type = $format[$i]; }
-
-	if (($type eq "char") && ($length != 0)) { 
-	    $pt2 = sprintf "%s[%d];", $element[$i], $length;
-	} else {
-	    $pt2 = sprintf "%s;", $element[$i];
-	}
-
-	if ($unit[$i] eq "") {
-	    $pt3 = sprintf "// %s", $comment[$i];
-	} else {
-	    $pt3 = sprintf "// %s (%s)", $comment[$i], $unit[$i];
-	}
-	printf FILE "  %-16s %-21s %s\n", $type, $pt2, $pt3;
-    }    
-    print FILE "} $STRUCT;\n";
-}
-
-sub write_byteswaps {
-    $N = 0;
-    for ($i = 0; $i < @field; $i++) {
-	($type, $length) = $format[$i] =~ m|^(\w+)\[([\d\.]+)\]|;
-	if (!$type && !$length) { $type = $format[$i]; }
-
-	if ($type eq "char") {
-	    if ($length == 0) { 
-		$N ++;
-	    } else {
-		$N += $length;
-	    }
-	    next;   # skip byte swap command
-	}
-	if ($type eq "byte")  {
-	    $N ++;
-	    next;
-	}
-	if ($type eq "short")  {
-	    $T = "BYTE";
-	    $n = 2;
-	}
-	if ($type eq "float")  {
-	    $T = "WORD";
-	    $n = 4;
-	}
-	if ($type eq "int")    {
-	    $T = "WORD";
-	    $n = 4;
-	}
-	if ($type eq "double") { 
-	    $T = "DBLE";
-	    $n = 8;
-	}
-	printf FILE "    SWAP_%s (%d); // %s\n", $T, $N, $field[$i];
-	$N += $n;
-    }
-}
-
-sub count_bintablesize {
-
-    $Nbytes = 0;
-    for ($i = 0; $i < @field; $i++) {
-
-	# add [\d\.] to match ascii-type formats
-	($type, $length) = $format[$i] =~ m|^(\w+)\[(\d+)\]|;
-	if (!$type && !$length) { 
-	    $type = $format[$i]; 
-	    $length = 0;
-	}
-
-	if ($type eq "char") {
-	    if ($length) {
-		$Nbytes += $length;
-	    } else {
-		$Nbytes ++;
-	    }
-	}
-	if ($type eq "double") { $Nbytes += 8; }
-	if ($type eq "int")    { $Nbytes += 4; }
-	if ($type eq "short")  { $Nbytes += 2; }
-	if ($type eq "float")  { $Nbytes += 4; }
-    }
-    return ($Nbytes);
-}
-
-sub count_tablesize {
-
-    $Nbytes = 0;
-    for ($i = 0; $i < @field; $i++) {
-	($length) = $format[$i] =~ m|^\w+\[([\d\.]+)\]|;
-	if ($length == 0) { die "ASCII table format requires field size"; }
-	$Nbytes += $length;
-    }
-    return ($Nbytes);
-}
-
-sub init_key {
-    my ($key)   = $_[0];
-
-    push @key, $key;
-    push @value, "";
-}
-
-sub set_keypair {
-    my ($i);
-    my ($key)   = $_[0];
-    my ($value) = $_[1];
-
-    for ($i = 0; $i < @key; $i++) {
-	if ($key eq $key[$i]) {
-	    if ($value[$i] ne "") { die "key is multiply defined\n"; }
-	    $value[$i] = $value;
-	    return;
-	}
-    }
-}
-
-sub check_keypairs {
-    my ($i);
-    for ($i = 0; $i < @key; $i++) {
-	if ($line =~ m|\$$key[$i]|) {
-#	    print "$key[$i]  -- $value[$i]\n";
-	    if ($value[$i] eq "") { die "missing value for required key $key[$i]\n"; }
-	    $line =~ s|\$$key[$i]|$value[$i]|g;
-	}
-    }
-}
-
-# we need to find the structure size, including padding 
-# i'm not sure I know the answer to this: it is probably 
-# the total number of bytes rounded up to the largest 
-# data item in the structure (ie, 8 for a double, etc)
-# if we have the size, then we can double check the structure
-# against the expectation at runtime.  for the moment,
-# calculate by hand and add to def.d file 
-
