/* This file is part of hp2ps, a graph drawer for memory profiles.
   Copyright (C) 2002 The University Court of the University of Glasgow.
   This program is governed by the license contained in the file LICENSE.  */

#ifndef HP_FILE_H
#define HP_FILE_H

typedef enum {
        /* These tokens are found in ".hp" files */ 
 
	EOF_TOK,
	INTEGER_TOK,
	FLOAT_TOK,
	IDENTIFIER_TOK,
	STRING_TOK,
	BEGIN_SAMPLE_TOK,
	END_SAMPLE_TOK,
	JOB_TOK, 
	DATE_TOK,
	SAMPLE_UNIT_TOK,
	VALUE_UNIT_TOK,
	MARK_TOK,
 
	/* These extra ones are found only in ".aux" files */ 
 
	X_RANGE_TOK,
	Y_RANGE_TOK,
	ORDER_TOK,
	SHADE_TOK
} token;

struct datapoint {
    int bucket;
    floatish value;
};

struct chunk {
    struct chunk *next;
    short  nd;                          /* 0 .. N_CHUNK - 1 */
    struct datapoint *d;
};


struct entry {
    struct entry *next;
    struct chunk *chk;
    char   *name;
};

extern char *theident;
extern char *thestring;
extern int theinteger;
extern floatish thefloatish;
extern int g_ch;
extern token thetok;
extern int linenum; 
extern int endfile;

char *TokenToString PROTO((token));

extern struct entry** identtable;

extern floatish *samplemap;
extern floatish *markmap;

void GetHpFile PROTO((FILE *));
void StoreSample PROTO((struct entry *, intish, floatish));
struct entry *MakeEntry PROTO((char *));

token GetNumber PROTO((FILE *));
void  GetIdent  PROTO((FILE *));
void  GetString PROTO((FILE *));
boolish IsIdChar PROTO((int)); /* int is a "char" from getc */

extern char *jobstring;
extern char *datestring;
 
extern char *sampleunitstring;
extern char *valueunitstring;

#endif /* HP_FILE_H */
