/* InsertSkill by Joshua Halls (AKA Xerves)
Copyright (C) 2000 Joshua Halls
GPL has been revoked by the author
Please Read the HOWTO and REQUESTS files before doing anything else.
insertskill.c - Used to sort and insort a skill into the tables and
header file. Please read the HOWTO file for more info
on how to use this program. */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "central.h"
int charused[26]; //Make sure for the case statements to add the character
char space[35];
int is_first_line;
int commnt; //For comment to let the code know
int addone; //Add one, used to make the program go a bit faster and work right
char skillbuf[BUFSIZE];
char searchbuf[BUFSIZE];
char *rch;
//outputs some info to a file called bugs.txt
void bug(char *string)
{
FILE *fp;
fp = fopen( "bugs.txt", "a");
fprintf(fp, "%s\n", string);
fclose(fp);
return;
}
int line_empty(char *buf)
{
int x = 0;
for(;;)
{
if (buf[x] == '\0' || buf[x] == '\n')
return 1;
if (isalnum(buf[x]))
return 0;
x++;
}
return 1;
}
// get the skill name in the header file (mud.h, merc.h, etc)
char *get_dofun_name(char *skill, int type)
{
int x = 0;
int y = 0;
char c;
int fnd;
char *pbuf;
for (x=0; x < BUFSIZE/2; x++)
{
if (type == 0)
skillbuf[x] = 0;
else
searchbuf[x] = 0;
}
x = 0;
for (;;)
{
if (skill[x] == '\0')
{
commnt = 0;
return NULL;
}
//Check for comments
if (skill[x+1] && type == 0)
{
if (skill[x] == '/' && skill[x+1] == '/')
commnt = 1;
}
if (skill[x] == '(') //Check for the beginning (
{
for (;;)
{
if (skill[++x] != '\0')
c = skill[x];
else
{
if (type == 0)
{
pbuf = &skillbuf[0];
if (skillbuf[0] != 'd' || skillbuf[1] != 'o' || skillbuf[2] != '_')
{
commnt = 0;
pbuf = NULL;
}
}
else
{
pbuf = &searchbuf[0];
if (searchbuf[0] != 'd' || searchbuf[1] != 'o' || searchbuf[2] != '_')
pbuf = NULL;
}
return pbuf;
}
if ((isspace(c) && fnd == 1) || skill[x] == ')')
{
if (type == 0)
{
pbuf = &skillbuf[0];
if (skillbuf[0] != 'd' || skillbuf[1] != 'o' || skillbuf[2] != '_')
{
commnt = 0;
pbuf = NULL;
}
}
else
{
pbuf = &searchbuf[0];
if (searchbuf[0] != 'd' || searchbuf[1] != 'o' || searchbuf[2] != '_')
pbuf = NULL;
}
return pbuf;
}
if (!isspace(c) && c != ')' && c != '(')
{
if (type == 0)
skillbuf[y++] = c;
else
searchbuf[y++] = c;
fnd = 0;
}
continue;
}
}
//nothing found, next character please
x++;
continue;
}
}
// gets the skill name for tables.c
char *get_skill_name(char *skill, int type)
{
int x = 0;
int y = 0;
char c;
int fnd;
char *pbuf;
for (x=0; x < BUFSIZE; x++)
{
if (type == 0 || type == 2)
skillbuf[x] = 0;
else
searchbuf[x] = 0;
}
x = 0;
for (;;)
{
if (skill[x] == '\0')
{
return NULL;
}
if (skill[x+1] && (type == 0 || type == 2))
{
if (skill[x] == '/' && skill[x+1] == '/')
commnt = 1;
}
fnd = 0;
y = 0;
//check for eol, mainly to make sure there is enough room for the return
for (;;)
{
if (y == 6)
break;
if (skill[y++] == '\0')
{
fnd = 1;
break;
}
}
if (fnd)
{
x++;
continue;
}
//Check for the return statement, after that, start parsing the string for the
//name
if (skill[x] == 'r' && skill[x+1] == 'e' && skill[x+2] == 't'
&& skill[x+3] == 'u' && skill[x+4] == 'r' && skill[x+5] == 'n')
{
//make sure it is not "do_return"
if ((skill[x-4] == 34 || skill[x-4] == 39) && skill[x-3] == 'd'
&& skill[x-2] == 'o' && skill[x-1] == '_' && (type == 0 || type == 1))
{
x++;
continue;
}
//check for the skill before it
if (skill[x-12] == 's' && skill[x-11] == 'k' && skill[x-10] == 'i'
&& skill[x-9] == 'l' && skill[x-8] == 'l' && (type == 2 || type == 3))
{
x++;
continue;
}
x = x+5; //move the pointer up to the n
fnd = 0;
y = 0;
for (;;)
{
if (skill[++x] != '\0')
c = skill[x];
else
{
if (type == 0 || type == 2)
{
pbuf = &skillbuf[0];
if (skillbuf[0] != 'd' || skillbuf[1] != 'o' || skillbuf[2] != '_')
{
pbuf = NULL;
commnt = 0;
}
}
else
{
pbuf = &searchbuf[0];
if (searchbuf[0] != 'd' || searchbuf[1] != 'o' || searchbuf[2] != '_')
pbuf = NULL;
}
return pbuf;
}
if (c == 34 && (type == 0 || type == 1))
{
commnt = 0;
return NULL;
}
if ((isspace(c) && fnd == 1) || skill[x] == 59 || (skill[x] == 34 && fnd == 1))
{
if (skill[x] != 34 && (type == 2 || type == 3))
{
commnt = 0;
return NULL;
}
if (type == 0 || type == 2)
{
pbuf = &skillbuf[0];
if (skillbuf[0] != 'd' || skillbuf[1] != 'o' || skillbuf[2] != '_')
{
pbuf = NULL;
commnt = 0;
}
}
else
{
pbuf = &searchbuf[0];
if (searchbuf[0] != 'd' || searchbuf[1] != 'o' || searchbuf[2] != '_')
pbuf = NULL;
}
return pbuf;
}
if (!isspace(c) && c != 34 && c != 39)
{
if (type == 0 || type == 2)
skillbuf[y++] = c;
else
searchbuf[y++] = c;
fnd = 1;
}
continue;
}
}
//nothing found, next character please
x++;
continue;
}
}
char get_table_string(char *buf) //kind of like get_table_string but will look for case statements
{
int x = 0;
char one;
if (strstr(buf, "case"))
{
for(;;)
{
if (buf[x] == '\0')
return 0;
if (buf[x] == 34 || buf[x] == 39) // ' and " check, only way I could do it
{
x++;
for (;;)
{
if (!isspace(buf[x]))
{
one = buf[x];
return one;
}
if (buf[x] == '\0')
return 0;
x++;
}
}
x++;
}
}
return 0;
}
int no_eol(char *skill)
{
if (skill[0] == '\0' || skill[1] == '\0' || skill[2] == '\0' || skill[3] == '\0' || skill == NULL)
return 0;
return 1;
}
char *get_space(char *skill)
{
int len;
int x;
char *spt;
space[0] = '\0';
len = (30 - strlen(skill) - 1);
for (x = 1; x < len; x++)
{
strcat(space, " ");
}
spt = space;
return spt;
}
//actually write the file now
void write_file(int cnt, int type, char *skill, FILE *fp)
{
int x;
char buf[BUFSIZE];
char ststr[BUFSIZE];
char ltr[2];
char *space;
int fndstr = 0;
char c;
FILE *pfp;
rewind(fp);
sprintf(buf, " ");
pfp = fopen( TEMPFILE2, "w");
rewind(pfp);
strcpy(ltr, "");
if (addone && type > 3 && cnt < 0)
{
for(;;)
{
x = -10;
c = fgetc( fp );
fputc(c, pfp);
sprintf(ltr, "%c", c);
strcat(ststr, ltr);
if (c == '\n' || c == '\0')
{
if (type <= 3)
{
if (strstr(ststr, CSTART))
break;
}
if (type == 4)
{
if (strstr(ststr, BSTART))
break;
}
if (type == 5)
{
if (strstr(ststr, DOSTART))
break;
}
strcpy(ststr, "");
}
}
}
for (x = 0; x <= cnt; x++)
{
if (addone)
{
for (;;)
{
c = fgetc( fp );
fputc(c, pfp);
if (!fndstr)
{
sprintf(ltr, "%c", c);
strcat(ststr, ltr);
}
if (c == '\n' || c == '\0')
{
if (!fndstr)
{
if (type <= 3)
{
if (strstr(ststr, CSTART))
fndstr = 1;
}
if (type == 4)
{
if (strstr(ststr, BSTART))
fndstr = 1;
}
if (type == 5)
{
if (strstr(ststr, DOSTART))
fndstr = 1;
}
strcpy(ststr, "");
continue;
}
strcpy(ststr, "");
break;
}
}
}
else
{
for (;;)
{
c = fgetc( fp );
fputc(c, pfp);
if (c == '\n' || c == '\0')
break;
}
}
}
if (type == 1)
{
space = get_space(skill); //returns extract space to align everything
if (commnt)
{
fprintf(pfp, " // if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
commnt = 0;
}
else
{
fprintf(pfp, " if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
}
}
if (type == 2)
{
space = get_space(skill); //returns extract space to align everything
if (commnt)
{
fprintf(pfp, " // if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
commnt = 0;
}
else
{
fprintf(pfp, " if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
}
}
if (type == 3)
{
space = get_space(skill); //returns extract space to align everything
fprintf(pfp, " case '%c':\n", skill[3]);
if (commnt)
{
fprintf(pfp, " // if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
commnt = 0;
}
else
{
fprintf(pfp, " if ( !str_cmp( name, \"%s\"%s )) return %s%c\n", skill, space, skill, 59);
}
fprintf(pfp, " break%c\n", 59);
}
if (type == 4)
{
if (commnt)
{
fprintf(pfp, " // if ( skill == %-30s ) return \"%s\"%c\n", skill, skill, 59);
commnt = 0;
}
else
{
fprintf(pfp, " if ( skill == %-30s ) return \"%s\"%c\n", skill, skill, 59);
}
}
if (type == 5)
{
if (commnt)
{
fprintf(pfp, "//DECLARE_DO_FUN( %-30s )%c\n", skill, 59);
commnt = 0;
}
else
{
fprintf(pfp, "DECLARE_DO_FUN( %-30s )%c\n", skill, 59);
}
}
while (!feof(fp))
{
c = fgetc( fp );
if (!feof(fp))
fputc(c, pfp);
}
fclose(fp);
fclose(pfp);
rename( TEMPFILE2, TEMPFILE);
remove( TEMPFILE2);
return;
}
//Scans to make sure the do_ is not already in, and looks for indicators
void scan_for_entry(char *skill)
{
FILE *hfp;
FILE *tfp;
char *sbuf;
int fndind[6];
char buf[BUFSIZE];
int match = 0; //exit if match is found at the end
int cnt = 0;
int type = 0;
hfp = fopen(HEADER_FILE, "r");
tfp = fopen(TABLE_FILE, "r");
while( !feof(tfp))
{
fgets(buf, BUFSIZE, tfp);
if (strstr(buf, CSTART))
{
type = 1;
fndind[0]++;
}
if (strstr(buf, BSTART))
{
type = 2;
fndind[2]++;
}
if (strstr(buf, CEND))
{
type = 0;
fndind[1]++;
}
if (strstr(buf, BEND))
{
type = 0;
fndind[3]++;
}
cnt++;
if (type == 1)
sbuf = get_skill_name(buf, 1);
if (type == 2)
sbuf = get_skill_name(buf, 3);
if (type && sbuf)
{
if (strcmp(skill, sbuf) == 0)
{
printf("%s was found in file %s of line %d.\n", skill, TABLE_FILE, cnt);
match++;
continue;
}
}
}
cnt = 0;
type = 0;
while ( !feof(hfp))
{
fgets(buf, BUFSIZE, hfp);
if (strstr(buf, DOSTART))
{
type = 1;
fndind[4]++;
}
if (strstr(buf, DOEND))
{
fndind[5]++;
type = 0;
}
cnt++;
if (type == 1)
sbuf = get_dofun_name(buf, 1);
if (type && sbuf)
{
if (strcmp(skill, sbuf) == 0)
{
printf("%s was found in file %s of line %d.\n", skill, TABLE_FILE, cnt);
match++;
continue;
}
}
}
fclose(hfp);
fclose(tfp);
if (match)
{
printf("%d matches to the skill %s was found, not adding.\n", match, skill);
exit(0);
}
if (!fndind[0] || !fndind[1] || !fndind[2] || !fndind[3] || !fndind[4] || !fndind[5])
{
if (!fndind[0])
printf("Did not find the marker %s\n", CSTART);
if (!fndind[1])
printf("Did not find the marker %s\n", CEND);
if (!fndind[2])
printf("Did not find the marker %s\n", BSTART);
if (!fndind[3])
printf("Did not find the marker %s\n", BEND);
if (!fndind[4])
printf("Did not find the marker %s\n", DOSTART);
if (!fndind[5])
printf("Did not find the marker %s\n", DOEND);
exit(0);
}
return;
}
void scan_cases(void)
{
FILE *fp;
int c;
char buf[BUFSIZE];
fp = fopen(TABLE_FILE, "r");
while ( !feof(fp))
{
fgets(buf, BUFSIZE, fp);
c = get_table_string(buf);
if (c)
{
if (charused[c - 97] == 0)
charused[c - 97] = 1;
}
}
fclose(fp);
return;
}
//Take the skill and write it to the new file
void write_sort_file(char *skill, FILE *fp, int ftype)
{
char buf[BUFSIZE];
int newcase = 0;
int type;
int cnt = -1;
int fndstr = 0;
char *skillbuf2;
int fndcase = 0;
char sch;
rewind(fp); //start at the top :-)
//First check to see if the case statement exists, charused will remember this
if (charused[skill[3] - 97] == 0 && ftype == 0) // 4th character because of do_
{
newcase = 1;
charused[skill[3] - 97] = 1;
}
while ( !feof(fp))
{
fgets(buf, BUFSIZE, fp);
if (addone && !fndstr)
{
if (ftype == 0)
{
if (!strstr(buf, CSTART))
continue;
else
fndstr = 1;
}
if (ftype == 1)
{
if (!strstr(buf, BSTART))
continue;
else
fndstr = 1;
}
if (ftype == 2)
{
if (!strstr(buf, DOSTART))
continue;
else
fndstr = 1;
}
continue;
}
cnt++;
if (newcase == 0 || ftype == 1 || ftype == 2)
{
if (ftype == 0)
skillbuf2 = get_skill_name(buf, 1);
if (ftype == 1)
skillbuf2 = get_skill_name(buf, 3);
if (ftype == 2)
skillbuf2 = get_dofun_name(buf, 1);
type = 1;
}
else
{
type = 0;
sch = get_table_string(buf);
skillbuf2 = &sch;
}
if (ftype == 1)
{
if (strstr(buf, BEND))
{
write_file(--cnt, 4, skill, fp);
return;
}
}
if (ftype == 2)
{
if (strstr(buf, DOEND))
{
write_file(--cnt, 5, skill, fp);
return;
}
}
if (fndcase == 0 && newcase == 0 && ftype == 0) //find the case statement to see if it exists
{
if (no_eol(skill))
{
sch = skill[3];
if (get_table_string(buf) && get_table_string(buf) == sch)
{
fndcase = 1;
continue;
}
}
}
if (skillbuf2 == NULL && fndcase == 0)
continue;
if (skillbuf2 == NULL && fndcase == 1)
{
write_file(--cnt, 1, skill, fp);
return;
}
if (((newcase == 0 && type) || ftype) && strcmp(skill, skillbuf2) < 0)
{
if (ftype == 0)
write_file(--cnt, 2, skill, fp);
if (ftype == 1)
write_file(--cnt, 4, skill, fp);
if (ftype == 2)
write_file(--cnt, 5, skill, fp);
return;
}
if (newcase == 1 && !type && strcmp(skill+3, skillbuf2) < 0)
{
write_file(--cnt, 3, skill, fp);
return;
}
}
//nothing found, add something
if (ftype == 1 || ftype == 2)
{
if (ftype == 1)
write_file(--cnt, 4, skill, fp);
if (ftype == 2)
write_file(--cnt, 5, skill, fp);
return;
}
if (newcase == 1)
{
write_file(--cnt, 3, skill, fp);
return;
}
}
void remove_spacing(char *filename)
{
FILE *wfp;
FILE *rfp;
char buf[BUFSIZE];
sprintf(buf, " ");
wfp = fopen( TEMPFILE2, "w");
rfp = fopen( filename, "r");
while (!feof(rfp))
{
fgets(buf, BUFSIZE, rfp);
if (!line_empty(buf))
fprintf(wfp, buf);
sprintf(buf, " ");
}
fclose(wfp);
fclose(rfp);
rename( TEMPFILE2, TEMPFILE);
remove( TEMPFILE2);
return;
}
//All the sorting, now the actual writing
void update_file(char *reading, char *start, char *end, int backup)
{
char buf[BUFSIZE*5];
char name[BUFSIZE/2];
char c;
char chr[2];
FILE *fin;
FILE *new;
FILE *org;
sprintf(buf, " ");
fin = fopen( TEMPFILE2, "w");
new = fopen( TEMPFILE, "r");
org = fopen( reading, "r");
for (;;)
{
c = fgetc( org );
fputc(c, fin);
if (feof(org))
{
fprintf(stderr, "Problem writing to file %s, did not find %s.\n", reading, start);
exit(0);
}
sprintf(chr, "%c", c);
strcat(buf, chr);
if (strstr(buf, start))
{
fgets(buf, BUFSIZE, org);
fprintf(fin, buf);
break;
}
if (c == '\0' || c == '\n')
strcpy(buf, "");
}
sprintf(buf, " ");
while (!feof(new))
{
fgets(buf, BUFSIZE, new);
if (!line_empty(buf))
fprintf(fin, buf);
sprintf(buf, " ");
}
for (;;)
{
if (feof(org))
{
fprintf(stderr, "Problem writing to file %s, did not find %s.\n", reading, end);
exit(0);
}
fgets(buf, BUFSIZE, org);
if (strstr(buf, end))
{
fprintf(fin, buf);
break;
}
}
while (!feof(org))
{
c = fgetc( org );
if (!feof(org))
fputc(c, fin);
}
fclose(fin);
fclose(new);
fclose(org);
if (DOBACKUP && backup == 1)
{
sprintf(name, "%s%s", reading, BSUFFIX);
remove(name); //make sure to remove the backup if it already exists
rename( reading, name);
}
remove(reading);
rename( TEMPFILE2, reading);
remove( TEMPFILE2);
remove( TEMPFILE );
return;
}
int load_dofun_tables()
{
FILE *fp;
FILE *dfp;
char buf[BUFSIZE];
char *skill;
if ( (fp = fopen(HEADER_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the mud.h file.\n");
return 0;
}
while ( !feof(fp))
{
fgets(buf, BUFSIZE, fp);
strcat(buf, "/0");
if (strstr(buf, DOSTART))
{
dfp = fopen(TEMPFILE, "w+");
//Start sorting/organizing
while (!feof(fp))
{
fgets(buf, BUFSIZE, fp);
if (line_empty(buf))
continue;
if (strstr(buf, DOEND))
{
fclose(dfp);
fclose(fp);
remove_spacing(TEMPFILE);
update_file(HEADER_FILE, DOSTART, DOEND, 1);
printf("Done sorting the do_fun table.\n");
return 1;
}
skill = get_dofun_name(buf, 0); //Will get the skill name from the buf
if (!skill)
continue;
write_sort_file(skill, dfp, 2); //Will write the skill name into the new file
dfp = fopen(TEMPFILE, "a+");
}
fprintf(stderr, "The end line of %s was not found.\n", DOEND);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
}
fprintf(stderr, "The start line of %s was not found.\n", DOSTART);
remove(TEMPFILE);
fclose(fp);
return 0;
}
int load_bottom_tables()
{
FILE *fp;
FILE *dfp;
char buf[BUFSIZE];
char *skill;
if ( (fp = fopen(TABLE_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the tables.c file.\n");
return 0;
}
while ( !feof(fp))
{
fgets(buf, BUFSIZE, fp);
strcat(buf, "/0");
if (strstr(buf, BSTART))
{
dfp = fopen(TEMPFILE, "w+");
//Start sorting/organizing
while (!feof(fp))
{
fgets(buf, BUFSIZE, fp);
if (line_empty(buf))
continue;
if (strstr(buf, BEND))
{
fclose(dfp);
fclose(fp);
remove_spacing(TEMPFILE);
update_file(TABLE_FILE, BSTART, BEND, 0);
printf("Done sorting the bottom entries.\n");
return 1;
}
skill = get_skill_name(buf, 2); //Will get the skill name from the buf
if (!skill)
continue;
write_sort_file(skill, dfp, 1); //Will write the skill name into the new file
dfp = fopen(TEMPFILE, "a+");
}
fprintf(stderr, "The end line of %s was not found.\n", BEND);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
}
fprintf(stderr, "The start line of %s was not found.\n", BSTART);
remove(TEMPFILE);
fclose(fp);
return 0;
}
int load_case_statements()
{
FILE *fp;
FILE *dfp;
char buf[BUFSIZE];
char *skill;
if ( (fp = fopen(TABLE_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the tables.c file.\n");
return 0;
}
while ( !feof(fp))
{
fgets(buf, BUFSIZE, fp);
strcat(buf, "/0");
if (strstr(buf, CSTART))
{
dfp = fopen(TEMPFILE, "w+");
//Start sorting/organizing
while (!feof(fp))
{
fgets(buf, BUFSIZE, fp);
if (line_empty(buf))
continue;
if (strstr(buf, CEND))
{
fclose(dfp);
fclose(fp);
update_file(TABLE_FILE, CSTART, CEND, 1);
printf("Done sorting case entries.\n");
return 1;
}
skill = get_skill_name(buf, 0); //Will get the skill name from the buf
if (!skill)
continue;
write_sort_file(skill, dfp, 0); //Will write the skill name into the new file
dfp = fopen(TEMPFILE, "a+");
}
fprintf(stderr, "The end line of %s was not found.\n", CEND);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
}
fprintf(stderr, "The start line of %s was not found.\n", CSTART);
remove(TEMPFILE);
fclose(fp);
return 0;
}
void copy_file(FILE *writefile, FILE *readfile)
{
char c;
while (!feof(readfile))
{
c = fgetc( readfile );
if (!feof(readfile))
fputc(c, writefile);
}
rewind(writefile);
rewind(readfile);
}
//Works from command prompt, no internal looping trash
int main(int argc, char *argv[])
{
char *skill;
char buf[BUFSIZE];
char name[BUFSIZE/2];
int fnd = 0;
FILE *fp;
FILE *dfp;
commnt = 0; //If there is a comment at the line, add it back in.
addone = 0; //Gets toggled when a do_ is getting added in.
if (argc == 1)
{
printf("Syntax: insertskill sort\n");
printf("Syntax: insertskill <name>\n");
printf("\nMake sure to read the HOWTO first before using\n");
return 0;
}
skill = argv[1];
if (!strcmp(argv[1], "sort"))
{
if (load_case_statements() == 0)
return 0;
if (load_bottom_tables() == 0)
return 0;
if (load_dofun_tables() == 0)
return 0;
return 1;
}
//Make sure it is an actual do_ skill
if (skill[0] == 'd' && skill[1] == 'o' && skill[2] == '_')
{
scan_for_entry(skill); //Scans to make sure the skill isn't already added
scan_cases(); //Just in case the skill is a new case
addone = 1;
//Start writing the actual junk now :-)
if ( (fp = fopen(TABLE_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the tables.c file.\n");
return 0;
}
dfp = fopen(TEMPFILE, "w+");
copy_file(dfp, fp);
while (!feof(dfp))
{
fgets(buf, BUFSIZE, dfp);
if (strstr(buf, CSTART))
{
write_sort_file(skill, dfp, 0); //Will write the skill name into the new file
fclose(fp);
//Backup if needed
if (DOBACKUP)
{
sprintf(name, "%s%s", TABLE_FILE, BSUFFIX);
remove(name); //make sure to remove the backup if it already exists
rename( TABLE_FILE, name);
}
remove(TABLE_FILE);
rename( TEMPFILE, TABLE_FILE);
remove( TEMPFILE);
printf("Done adding case entries.\n");
fnd = 1;
break;
}
}
if (fnd == 0)
{
fprintf(stderr, "The start line of %s was not found.\n", CSTART);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
fnd = 0; //Bottom part now
if ( (fp = fopen(TABLE_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the tables.c file.\n");
return 0;
}
dfp = fopen(TEMPFILE, "w+");
copy_file(dfp, fp);
while (!feof(dfp))
{
fgets(buf, BUFSIZE, dfp);
if (strstr(buf, BSTART))
{
write_sort_file(skill, dfp, 1); //Will write the skill name into the new file
fclose(fp);
//Backup if needed
remove(TABLE_FILE);
rename( TEMPFILE, TABLE_FILE);
remove( TEMPFILE);
printf("Done adding bottom entries.\n");
fnd = 1;
break;
}
}
if (fnd == 0)
{
fprintf(stderr, "The start line of %s was not found.\n", BSTART);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
fnd = 0; //start mud.h
if ( (fp = fopen(HEADER_FILE, "r")) == NULL)
{
fprintf(stderr, "Error opening the mud.h file.\n");
return 0;
}
dfp = fopen(TEMPFILE, "w+");
copy_file(dfp, fp);
while (!feof(dfp))
{
fgets(buf, BUFSIZE, dfp);
if (strstr(buf, DOSTART))
{
write_sort_file(skill, dfp, 2); //Will write the skill name into the new file
fclose(fp);
//Backup if needed
if (DOBACKUP)
{
sprintf(name, "%s%s", HEADER_FILE, BSUFFIX);
remove(name); //make sure to remove the backup if it already exists
rename( HEADER_FILE, name);
}
remove(HEADER_FILE);
rename( TEMPFILE, HEADER_FILE);
remove( TEMPFILE);
printf("Done adding dofun entries.\n");
fnd = 1;
break;
}
}
if (fnd == 0)
{
fprintf(stderr, "The start line of %s was not found.\n", DOSTART);
remove(TEMPFILE);
fclose(dfp);
fclose(fp);
return 0;
}
return 1;
}
else
{
printf("Any new addition must start with 'do_' to add it in.\n");
return 0;
}
printf("Syntax: insertskill sort\n");
printf("Syntax: insertskill <name>\n");
printf("\nMake sure to read the HOWTO first before using\n");
return 0;
}