/* main.c   by Michael Thorpe   2003-06-18 */

#include <stdlib.h>
#include <stdio.h>
#include "ftree.h"

const char *usage="usage: ftree <ftree> add <string> <int>\n"
                  "       ftree <ftree> check|del|show <string>\n"
                  "       ftree <ftree> dump|list\n";

int dumpfunc(const char *s,int val) {
   printf("%d\t%s\n",val,s);
   return(0);
}

int listfunc(const char *s,int val) {
   printf("%s\n",s);
   return(0);
}

int main(int argc,char **argv) {
   int op=0,retval=0;
   ftree *tree;

   if(argc==5 && !strcmp(argv[2],"add")) {
      op=1;
   } else if(argc==4 && !strcmp(argv[2],"check")) {
      op=2;
   } else if(argc==4 && !strcmp(argv[2],"del")) {
      op=3;
   } else if(argc==4 && !strcmp(argv[2],"show")) {
      op=4;
   } else if(argc==3 && !strcmp(argv[2],"dump")) {
      op=5;
   } else if(argc==3 && !strcmp(argv[2],"list")) {
      op=6;
   } else {
      fputs(usage,stderr);
      return(1);
   }
   tree=ftree_open(argv[1],0);
   if(!tree) {
      fprintf(stderr,"Couldn't open ftree %s!\n",argv[1]);
      return(-1);
   }
   switch(op) {
   case 1: /* add */
      retval=ftree_add(tree,argv[3],atoi(argv[4]));
      if(retval)
         fprintf(stderr,"Couldn't add \"%s\"\n",argv[3]);
      break;
   case 2: /* check */
      retval=!ftree_match(tree,argv[3]);
      break;
   case 3: /* del */
      if(!ftree_del(tree,argv[3])) {
         fprintf(stderr,"Couldn't delete \"%s\"\n",argv[3]);
         retval=1;
      }
      break;
   case 4: /* check */
      retval=ftree_match(tree,argv[3]);
      if(retval)
         printf("%u\n",retval);
      retval=!retval;
      break;
   case 5: /* dump */
      retval=ftree_dumpfull(tree,dumpfunc);
      break;
   case 6: /* list */
      retval=ftree_dumpfull(tree,listfunc);
      break;
   }
   ftree_close(tree);
   return(retval);
}
