/
2.0.4beta/doc/
2.0.4beta/gnu/
2.0.4beta/sha/
/* textdb.c */

#include "config.h"

/*
 *		       This file is part of TeenyMUD II.
 *		 Copyright(C) 1993, 1994, 1995 by Jason Downs.
 *                           All rights reserved.
 * 
 * TeenyMUD II is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * TeenyMUD II is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program (see the file 'COPYING'); if not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA.
 *
 */

#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif				/* HAVE_STRING_H */
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif				/* HAVE_STDLIB_H */
#include <ctype.h>

#include "conf.h"
#include "teeny.h"
#include "teenydb.h"
#include "textdb.h"
#include "externs.h"

char txt_buffer[TXTBUFFSIZ];

char txt_eoferr[] = "Unexpected EOF near object #%d.\n";
char txt_numerr[] = "Failed to get integer from string near object #%d.\n";
char txt_dberr[] = "Internal database error at object #%d.\n";
char txt_boolerr[] = "Boolexp format error at object #%d.\n";

int text_version(in, read_version, read_flags, read_total)
    FILE *in;
    int *read_version, *read_flags, *read_total;
{
  int ch;
  char *ptr, *optr;
  int done = 0;

  while(!done) {
    ch = fgetc(in);

    /* parse out version number and such */
    switch(ch) {
    case '!':		/* Comments. */
      if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL) {
        fputs("Read failed in header.\n", stderr);
	return(-1);
      }
      break;
    case '%':		/* original TeenyMUD */
      if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL) {
        fputs("Read failed in header.\n", stderr);
	return(-1);
      }
      *read_total = (int)strtol(txt_buffer, &ptr, 10);
      if(ptr == txt_buffer){
        fputs("Failed to get object count from old style database.\n", stderr);
        return(-1);
      }
      if((ch = fgetc(in)) == '~'){	/* 1.2-1.3 version */
        if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL){
	  fputs("Read failed while trying to get database version number.\n",
		stderr);
	  return(-1);
        }
        *read_version = (int)strtol(txt_buffer, &ptr, 10);
        if(ptr == txt_buffer){
	  fputs("Failed to get version number from old style database.\n",
		stderr);
	  return(-1);
        }
      } else {				/* 1.0-1.1 */
        ungetc(ch, in);
        *read_version = 0;
      }
      *read_flags = 0;			/* no flags */

      done++;
      break;
    case '&':				/* 1.4 */
    case '+':				/* 2.0a */
      if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL) {
        fputs("Read failed in header.\n", stderr);
	return(-1);
      }
      *read_total = (int)strtol(txt_buffer, &optr, 10);
      if(optr == txt_buffer){
        fputs("Failed to get object count from old attribute database.\n",
	      stderr);
        return(-1);
      }
      *read_version = (int)strtol(optr, &ptr, 10);
      if(ptr == optr) {
        fputs("Failed to get version number from old attribute database.\n",
	      stderr);
        return(-1);
      }
      *read_flags = 0;			/* no flags */

      done++;
      break;
    case '$':				/* 1.5 */
      if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL) {
        fputs("Read failed in header.\n", stderr);
	return(-1);
      }
      *read_version = (int)strtol(txt_buffer, &optr, 10);
      if(optr == txt_buffer){
        fputs("Failed to get version number from new style database.\n",
	      stderr);
        return(-1);
      }
      *read_flags = (int)strtol(optr, &ptr, 10);
      if(ptr == optr){
        fputs("Failed to get database flags from new style database.\n",
	      stderr);
        return(-1);
      }
      *read_total = (int)strtol(ptr, &optr, 10);
      if(optr == ptr){
        fputs("Failed to get object count from new style database.\n", stderr);
        return(-1);
      }

      done++;
      break;
    case '#':	/* TinyMUD */
      *read_version = -1;
      *read_flags = 0;
      *read_total = -1;

      ungetc(ch, in);

      done++;
      break;
    default:
      fputs("Couldn't figure out database header.  You loose.\n", stderr);
      return(-1);
    }
  }
  return(0);
}

int skip_line(in, obj)
    FILE *in;
    int obj;
{
  if(fgets(txt_buffer, sizeof(txt_buffer), in) == (char *)NULL){
    fprintf(stderr, txt_eoferr, obj);
    return(-1);
  }
  return(0);
}