#include <stdio.h>
#include <rpc/rpc.h>            /* always need this */
#include <master.h>
#include <time.h>
#include <abs_error.h>
#include <values.h> /* for MAXLONG etc. */
#ifdef _SOLARIS_
#define HIBITLL   (1LL << (BITS(long long) - 1))
#define MAXLONGLONG       (~HIBITLL)
#endif _SOLARIS_
#include "my_error.h"

extern CLIENT *cl;

char * media_type(void)
{
char * eptr; /* error pointer */
static char retbuf[1024];
int count=0,cnt=0;
media_type_t alt,* temp;
mtype_res tr;
int bar, ret;
FILE *fd;
char buf[ABS_STRING_MAX];
int i,len;

memset(retbuf,0,1024);

/*
 * empty the database table
 */
	memset(&tr,0,sizeof(tag_res));
	ret = show_media_type_1(&tr,cl);
	if ( tr.code != ABS_NO_MATCH) {
		if ( tr.code ) {
			LOG_ERROR("",retbuf,debug,"media type",ret,tr.code,eptr);
			exit(-1); /* something bad happened */
		}
		temp = tr.mtype_res_u.value;
		while (temp != NULL ) {
			memset(&alt,0,sizeof(media_type_t));
			MALLOCANDSET(alt.tag,char,temp->tag,cnt);
			ret = delete_media_type_1(&alt,&bar,cl);
			if (ret || bar)
				LOG_ERROR("",retbuf,debug,"media type",ret,bar,eptr);
			temp = temp -> next;
			free(alt.tag);
		}
	}
/*
 * empty show
 */
	ret = show_media_type_1(&tr,cl);
	CHECK_RESULT("a",retbuf,debug,"media_type",ABS_NO_MATCH,1,ret,tr.code,eptr);

/*
 * add a tag without a description
 */
	memset(&alt,0,sizeof(media_type_t));
	MALLOCANDSET(alt.tag,char,"bar",cnt);
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("b",retbuf,debug,"media_type",ABS_INVALID_SPEC,1,ret,bar,eptr);
	free(alt.tag);
/*
 * add a more complicated tag
 */
	memset(&alt,0,sizeof(media_type_t));
	MALLOCANDSET(alt.tag,char,"bar",cnt);
	MALLOCANDSET(alt.description,char,"this is a test",cnt);
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("c",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * tag len 1 description 1
 */
	memset(&alt,0,sizeof(media_type_t));
	MALLOCANDSET(alt.tag,char,"a",cnt);
	MALLOCANDSET(alt.description,char,"t",cnt);
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("d",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/*
 * TAG_MAX-1  STRING_MAX-1
 */
	memset(&alt,0,sizeof(media_type_t));
	alt.tag = (char *) malloc(strlen("012345678")+1);
	if (!alt.tag)
		exit(7);
	strcpy(alt.tag,"012345678");
	alt.description = (char *) malloc( strlen("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456")+1);
	if (!alt.description)
		 exit(8);
	strcpy(alt.description,"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456");
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("e",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/*
 * TAG_MAX STRING_MAX
 */
	memset(&alt,0,sizeof(media_type_t));
	alt.tag = (char *) malloc(strlen("0123456789")+1);
	if (!alt.tag)
		exit(9);
	strcpy(alt.tag,"0123456789");
	alt.description = (char *) malloc( strlen("01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567")+1);
	if (!alt.description)
		 exit(10);
	strcpy(alt.description,"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567");
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("f",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/*
 * TAG_MAX+1 STRING_MAX+1
 */
	memset(&alt,0,sizeof(media_type_t));
	alt.tag = (char *) malloc(strlen("01234567890")+1);
	if (!alt.tag)
		exit(11);
	strcpy(alt.tag,"01234567890");
	alt.description = (char *) malloc( strlen("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678")+1);
	if (!alt.description)
		 exit(12);
	strcpy(alt.description,"012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678");
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("g",retbuf,debug,"media_type",1,0,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/* 
 * TAG_MAX+1 STRING 1
 */
	memset(&alt,0,sizeof(media_type_t));
	alt.tag = (char *) malloc(strlen("01234567890")+1);
	if (!alt.tag)
		exit(13);
	strcpy(alt.tag,"01234567890");
	alt.description = (char *) malloc( strlen("0")+1);
	if (!alt.description)
		 exit(14);
	strcpy(alt.description,"0");
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("h",retbuf,debug,"media_type",1,0,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/*
 * TAG_MAX 1 STRING_MAX+!
 */
	memset(&alt,0,sizeof(media_type_t));
	alt.tag = (char *) malloc(strlen("j")+1);
	if (!alt.tag)
		exit(15);
	strcpy(alt.tag,"j");
	alt.description = (char *) malloc( strlen("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678")+1);
	if (!alt.description)
		 exit(16);
	strcpy(alt.description,"012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678");
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("i",retbuf,debug,"media_type",1,0,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/* 
 * add a null tag
 */
	memset(&alt,0,sizeof(media_type_t));
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("j",retbuf,debug,"media_type",ABS_INVALID_SPEC,1,ret,bar,eptr);

/*
 * delete a null tag
 */
	memset(&alt,0,sizeof(media_type_t));
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("k",retbuf,debug,"media_type",ABS_INVALID_SPEC,1,ret,bar,eptr);
/*
 * delete a tag of len 1
 */
	MALLOCANDSET(alt.tag,char,"a",cnt);
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("l",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);

/* 
 * delete a nonexistant tag
 */
	MALLOCANDSET(alt.tag,char,"adf",cnt);
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("m",retbuf,debug,"media_type",ABS_NO_MATCH,1,ret,bar,eptr);
	free(alt.tag);

/* 
 * delete a tag of len TAG_MAX-1
 */
	MALLOCANDSET(alt.tag,char,"012345678",cnt);
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("n",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
/*
 * delete a tag of len TAG_MAX
 */
	MALLOCANDSET(alt.tag,char,"0123456789",cnt);
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("o",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);

/* 
 * delete a tag of len TAG_MAX+1
 */
	MALLOCANDSET(alt.tag,char,"01234567890",cnt);
	ret = delete_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("p",retbuf,debug,"media_type",1,0,ret,bar,eptr);
	free(alt.tag);

/*
 * eof of 0
 */
	MALLOCANDSET(alt.tag,char,"aa",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 0;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("q",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/*
 * eof of MAXLONG-1
 */
	MALLOCANDSET(alt.tag,char,"bb",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = MAXLONG-1;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("r",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
	
/*
 * eof of MAXLONG
 */
	MALLOCANDSET(alt.tag,char,"cc",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = MAXLONG;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("s",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * eof of MAXLONG+1
 */
	MALLOCANDSET(alt.tag,char,"dd",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = MAXLONG+1;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("t",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * eof of -20
 */
	MALLOCANDSET(alt.tag,char,"ee",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = -20;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("u",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * cap of 0 
 */
	MALLOCANDSET(alt.tag,char,"ff",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 32;
	alt.capacity = 0;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("v",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * cap of MAXLONGLONG -1
 */
	MALLOCANDSET(alt.tag,char,"gg",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 32;
	alt.capacity = MAXLONGLONG-1;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("w",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * cap of MAXLONGLONG 
 */
	MALLOCANDSET(alt.tag,char,"hh",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 32;
	alt.capacity = MAXLONGLONG;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("x",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * cap of MAXLONGLONG + 1
 */
	MALLOCANDSET(alt.tag,char,"ii",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 32;
	alt.capacity = MAXLONGLONG+1;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("y",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);
/*
 * cap of -20
 */
	MALLOCANDSET(alt.tag,char,"jj",cnt);
	MALLOCANDSET(alt.description,char,"aa",cnt);
	alt.eof_marker = 32;
	alt.capacity = -20;
	ret = add_media_type_1(&alt,&bar,cl);
	CHECK_RESULT("z",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,bar,eptr);
	free(alt.tag);
	free(alt.description);

/* 
 * add a number more to round out the top 20
 */
	fd = fopen("/usr/dict/words","r");
	if (fd) {
		for ( i=0;i<20;i++) { /* arbitrary for the moment */
		memset(&alt,0,sizeof(media_type_t));
		(void) fscanf(fd,"%s",buf);
		len = strlen(buf);
		alt.tag=(char *)malloc(len+1);
		if (!alt.tag)
			exit(17);
		if (len >ABS_MAX_TAG)
			 strncpy(alt.tag,buf,ABS_MAX_TAG);
		else
			strcpy(alt.tag,buf);
		(void) fscanf(fd,"%s",buf);
		len = strlen(buf);
		alt.description = (char *)malloc(len+1);
		if (!alt.description)
			exit(18);
		strcpy(alt.description,buf);
		alt.eof_marker = (long)32;
		alt.capacity = MAXLONGLONG;
		ret = add_media_type_1(&alt,&bar,cl);
		free(alt.tag);
		free(alt.description);
		}
	}
	fclose(fd);
/*
 * empty show
 */
	memset(&tr,0,sizeof(tag_res));
	ret = show_media_type_1(&tr,cl);
	CHECK_RESULT("aa",retbuf,debug,"media_type",ABS_SUCCESS,1,ret,tr.code,eptr);
/*
 * valid data
 */
	MALLOCANDSET(alt.tag,char,"8mm",cnt);
	MALLOCANDSET(alt.description,char,"8mm Exabyte",cnt);
        alt.eof_marker = 32;
        alt.capacity = 800000;
        ret = add_media_type_1(&alt,&bar,cl);
        free(alt.tag);
        free(alt.description);
	MALLOCANDSET(alt.tag,char,"dlt",cnt);
	MALLOCANDSET(alt.description,char,"Digital Linear Tape",cnt);
        alt.eof_marker = 8;
        alt.capacity = 80000000;
        ret = add_media_type_1(&alt,&bar,cl);
        free(alt.tag);
        free(alt.description);


	RETURN("media_type",debug);
}
				
