#include <stdio.h>

static int loaded = 0 ;

static char **abbr_array, **name_array, **name_comp_array ;
static int *reg_num_array, num_counties ;

static void load_data()
{
  FILE *fp ;
  char s[80], *t, *u, abbr[80], name[80] ;
  int i, reg_num ;

  if (!loaded) {
    fp = fopen("./tx_county_name_data", "r") ;
    fgets(s, 80, fp) ;
    sscanf(s, "%d", &num_counties) ;

    reg_num_array = (int *)malloc(sizeof(int) * num_counties) ;
    abbr_array = (char **)malloc(sizeof(char *) * num_counties) ;
    name_array = (char **)malloc(sizeof(char *) * num_counties) ;
    name_comp_array = (char **)malloc(sizeof(char *)*num_counties) ;

    for (i = 0 ; i < num_counties ; i++) {
      fgets(s, 80, fp) ;
      s[strlen(s)-1] = '\0' ;
      t = s ;
      u = t ;
      while (*u != ',') u++ ;
      *u = '\0' ;
      reg_num_array[i] = atoi(t) ;
      u++ ;
      t = u ;
      while (*u != ',') u++ ;
      *u = '\0' ;
      abbr_array[i] = (char *)malloc(sizeof(char) *
				     (strlen(t) + 1)) ;
      strcpy(abbr_array[i], t) ;
      abbr_array[i][3] = '\0' ;
      u++ ;
      t = u ;
      name_array[i] = (char *)malloc(sizeof(char) *
				     (strlen(t) + 1)) ;
      strcpy(name_array[i], t) ;
      name_comp_array[i] = (char *)malloc(sizeof(char) * (strlen(t)+1)) ;
      strcpy(name_comp_array[i], t) ;
      {
	int j ;
	for (j=0 ; name_comp_array[i][j] != '\0' ; j++)
	  name_comp_array[i][j] = tolower(name_comp_array[i][j]) ;
      }
    }
    loaded = 1 ;
  }
}

static int num_search(int s, int n, int *a) 
{
  int i = 0 ;
  while (i < s && a[i] != n) i++ ;
  if (i == s) return(-1) ;
  else return(i) ;
}

static int str_search(int s, char *str, char **a)
{
  int i = 0 ;
  while (i < s && strcmp(a[i], str)) i++ ;
  if (i == s) return(-1) ;
  else return(i) ;
}

char *tx_num_to_cabbr(int num)
{
  int i ;
  load_data() ;
  i = num_search(num_counties, num, reg_num_array) ;
  if (i == -1) return(NULL) ;
  else return(abbr_array[i]) ;
}

char *tx_num_to_cname(int num)
{
  int i ;
  load_data() ;
  i = num_search(num_counties, num, reg_num_array) ;
  if (i == -1) return(NULL) ;
  else return(name_array[i]) ;

}

int tx_cname_to_num(char *name) 
{
  int i ;
  char *s ;
  load_data() ;
  s = (char *)malloc(sizeof(char) *(strlen(name)+1)) ;
  strcpy(s, name) ;
  for (i=0 ; name[i] != '\0' ; i++) s[i] = tolower(s[i]) ;
  i = str_search(num_counties, s, name_comp_array) ;
  if (i == -1) return(-1) ;
  else return(reg_num_array[i]) ;
}

int tx_cabbr_to_num(char *abbr)
{
  int i ;
  load_data() ;
  i = str_search(num_counties, abbr, abbr_array) ;
  if (i == -1) return(-1) ;
  else return(reg_num_array[i]) ;
}

char *tx_cabbr_to_cname(char *abbr)
{
  int i ;
  load_data() ;
  i = str_search(num_counties, abbr, abbr_array) ;
  if (i == -1) return(NULL) ;
  else return(name_array[i]) ;

}

char *tx_cname_to_cabbr(char *name)
{
  int i ;
  char *s ;
  load_data() ;
  s = (char *)malloc(sizeof(char) *(strlen(name)+1)) ;
  strcpy(s, name) ;
  for (i=0 ; name[i] != '\0' ; i++) s[i] = tolower(s[i]) ;
  i = str_search(num_counties, s, name_comp_array) ;

  if (i == -1) return(NULL) ;
  else return(abbr_array[i]) ;
}
