text: #ifndef UTIL_H
  #define UTIL_H
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <math.h>
  
  #include "TIO_PrintHandlerExtern.h"
  
  #ifndef TRUE                    /* Some compilers predefine TRUE, FALSE */
  typedef enum {
  	FALSE, TRUE
  } boolean;
  #else
  typedef int boolean;
  #endif
  
  /* Parameter tags for preprocessor to strip */
  #define INP
  #define OUTP
  #define INOUTP
  
  #define BUFSIZE 4096 /* Maximum line length for various parsing proc. */
  #define nint(a) ((int) floor (a + 0.5))
  
  #define ERRTAG "ERROR:\t"
  #define WARNTAG "WARNING:\t"
  
  
  int limit_value(int cur, int max, const char *name);
  
  /* Linked lists of void pointers and integers, respectively. */
  
  typedef struct s_linked_vptr {
  	void *data_vptr;
  	struct s_linked_vptr *next;
  } t_linked_vptr;
  
  typedef struct s_linked_int {
  	int data;
  	struct s_linked_int *next;
  } t_linked_int;
  
  /* Integer vector.  nelem stores length, list[0..nelem-1] stores list of    *
   * integers.                                                                */
  
  typedef struct s_ivec {
  	int nelem;
  	int *list;
  } t_ivec;
  
  /* This structure is to keep track of chunks of memory that is being	*
   * allocated to save overhead when allocating very small memory pieces. *
   * For a complete description, please see the comment in my_chunk_malloc*
   * in libarchfpga/utils.c.						*/
  
  typedef struct s_chunk {
  	struct s_linked_vptr *chunk_ptr_head; 
  	/* chunk_ptr_head->data_vptr: head of the entire linked 
  	 * list of allocated "chunk" memory;
  	 * chunk_ptr_head->next: pointer to the next chunk on the linked list*/
  	int mem_avail; /* number of bytes left in the current chunk */
  	char *next_mem_loc_ptr;/* pointer to the first available (free) *
  				* byte in the current chunk		*/
  } t_chunk;
  
  #ifdef __cplusplus 
  extern "C" {
  #endif
  
  extern int file_line_number; /* line in file being parsed */
  extern char *out_file_prefix; /* Default prefix string for output files */
  
  /************************ Memory allocation routines *************************/
  
  void* my_malloc(size_t size);
  void* my_calloc(size_t nelem, size_t size);
  void *my_realloc(void *ptr, size_t size);
  void *my_chunk_malloc(size_t size, t_chunk *chunk_info);
  void free_chunk_memory(t_chunk *chunk_info);
  
  /******************* Linked list, matrix and vector utilities ****************/
  
  void free_ivec_vector(struct s_ivec *ivec_vector, int nrmin, int nrmax);
  void free_ivec_matrix(struct s_ivec **ivec_matrix, int nrmin, int nrmax,
  		int ncmin, int ncmax);
  void free_ivec_matrix3(struct s_ivec ***ivec_matrix3, int nrmin,
  		int nrmax, int ncmin, int ncmax, int ndmin, int ndmax);
  
  void** alloc_matrix(int nrmin, int nrmax, int ncmin, int ncmax,
  		size_t elsize);
  void ***alloc_matrix3(int nrmin, int nrmax, int ncmin, int ncmax,
  		int ndmin, int ndmax, size_t elsize);
  void ****alloc_matrix4(int nrmin, int nrmax, int ncmin, int ncmax,
  		int ndmin, int ndmax, int nemin, int nemax, size_t elsize);
  
  void free_matrix(void *vptr, int nrmin, int nrmax, int ncmin,
  		size_t elsize);
  void free_matrix3(void *vptr, int nrmin, int nrmax, int ncmin, int ncmax,
  		int ndmin, size_t elsize);
  void free_matrix4(void *vptr, int nrmin, int nrmax, int ncmin, int ncmax,
  		int ndmin, int ndmax, int nemin, size_t elsize);
  
  void print_int_matrix3(int ***vptr, int nrmin, int nrmax, int ncmin,
  		int ncmax, int ndmin, int ndmax, char *file);
  
  struct s_linked_vptr *insert_in_vptr_list(struct s_linked_vptr *head,
  		void *vptr_to_add);
  struct s_linked_vptr *delete_in_vptr_list(struct s_linked_vptr *head);
  t_linked_int *insert_in_int_list(t_linked_int * head, int data,
  		t_linked_int ** free_list_head_ptr);
  void free_int_list(t_linked_int ** int_list_head_ptr);
  void alloc_ivector_and_copy_int_list(t_linked_int ** list_head_ptr,
  		int num_items, struct s_ivec *ivec, t_linked_int ** free_list_head_ptr);
  
  /****************** File and parsing utilities *******************************/
  
  int my_atoi(const char *str);
  
  char* my_strdup(const char *str);
  char *my_strncpy(char *dest, const char *src, size_t size);
  char *my_strtok(char *ptr, const char *tokens, FILE * fp, char *buf);
  
  FILE* my_fopen(const char *fname, const char *flag, int prompt);
  char *my_fgets(char *buf, int max_size, FILE * fp);
  boolean file_exists(const char * filename);
  
  /*********************** Portable random number generators *******************/
  void my_srandom(int seed);
  int my_irand(int imax);
  float my_frand(void);
  
  typedef unsigned char (*messagelogger)( TIO_MessageMode_t messageMode,
                                     char* pszMessage,
                                     ... );
  extern messagelogger vpr_printf;
  
  #ifdef __cplusplus 
  }
  #endif
  
  /*********************** Math operations *************************************/
  int ipow(int base, int exp);
  
  #endif
  
  