/* 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);
}