/** Our Gopher Object Type **/

struct g_struct
{
    char    sFileType;     /* The type of object (A_FILE, A_CSO, etc)*/
    char    sTitle[256];   /* User-displayed title of object         */
    char    sPath[256];    /* Internal pathname to object on host    */
    char    sHost[100];    /* Internet name of host                  */
    int     iPort;         /* Port number on host                    */
/*#ifdef GOPHER_SERVER     */
    int     iItemnum;      /* The number of the item in the directory*/
/*#endif*/
};

typedef struct g_struct GopherStruct;
typedef struct g_struct GopherObj;

#define GSgetType(a) ((a)->sFileType)
#define GSsetType(a,b) (a)->sFileType=(b)

#define GSgetTitle(a) ((a)->sTitle)
#define GSsetTitle(a,b) strncpy((a)->sTitle,(b),255)

#define GSgetPath(a) ((a)->sPath)
#define GSsetPath(a,b) strncpy((a)->sPath,(b),255)

#define GSgetHost(a) ((a)->sHost)
#define GSsetHost(a,b) strncpy((a)->sHost,(b),99)

#define GSgetPort(a) ((a)->iPort)
#define GSsetPort(a,b) (a)->iPort=(b)

#define GSgetNum(a) ((a)->iItemnum)
#define GSsetNum(a,b) (a)->iItemnum=(b)


/*** Real live functions defined in gopherstruct.c ***/

void GSnew();
void GSinit();
void GStoNet();


/****************************************************************
** A Gopher directory structure  You don't want to have too many
** of these defined in a program (they're biiiiiiggggg!)
**
*****************************************************************/

#define MAXGOPHERS 500


struct g_dir_struct {
    GopherStruct Gophers[MAXGOPHERS];

    int Top;
};

typedef struct g_dir_struct GopherDirObj;
typedef struct g_dir_struct *GopherDirObjp;

#define GDgetEntry(a,b)  (&((a)->Gophers[b]))
#define GDgetTop(a)  ((a)->Top)
#define GDsetTop(a,b)  ((a)->Top = (b))

/*** Real live functions declared in gopherstruct.c ***/

void GDnew();
void GDaddGS();
void GDsort();