Code:
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#define MAX_ALIASES 10
char *aliasnames[MAX_ALIASES];
char *aliasstrings[MAX_ALIASES];
int aliascount = 0;
const int EXEC = 0;
const int ECHO = 1;
const int ALIAS = 2;
const int ALIASES = 3;
char usage[][38] =
{
"usage: exec <configfilename>",
"usage: echo <text to print>",
"usage: alias aliasname \"command\"",
"usage: aliases (NO ARGUMENTS)"
};
const int FOPEN = 0;
const int FCLOSE = 1;
const int FWRITE = 2;
const int FREAD = 3;
const int MALLOC = 4;
const int CMD = 5;
const int ERRORREADCONFIG = 6;
const int BAILOUT = 7;
const int UNKNOWNCOMMAND = 8;
const int NOALIASFOUND = 9;
char errors[][30] =
{
"Error opening file",
"Error closing file",
"Error writing file",
"Error reading file",
"Error allocing memory",
"Error parsing command",
"Error reading config",
"Bailing out!",
"Unknown command!",
"No array to clear!"
};
const int STARTUP = 0;
const int DONEREADCONFIG = 1;
const int CONFIGWRITTEN = 2;
char infos[][38] =
{
"Starting up...!",
"Done reading config",
"A new configfile have been written",
};
const int NOCONFIGFOUND = 0;
const int QUITTING = 1;
char notifys[][138] =
{
"There seems to be no configfile present in working directory\n[!] Attempting to write a new configfile\n",
"Quitting!"
};
const char VERSION[] = "0.1";
const char configfilename[] = "quickstart.cfg";
const char defaultconfig[] = "#This is a comment!\n#This is also a comment!\necho Starting up...1!\necho Starting up...2!\necho Starting up...3!\necho DONE!!\n";
int run_config();
int configremake();
int cmd(char*);
int print_error(int);
int print_usage(int);
int print_info(int);
int print_notify(int);
int main(int argc, char *argv[])
{
int i;
for(i=0;i<MAX_ALIASES;i++)
{
aliasnames[i]=NULL;
aliasstrings[i]=NULL;
}
print_info(STARTUP);
if(run_config(configfilename)==-1)
{
print_error(ERRORREADCONFIG);
quit(-1);
}
print_info(DONEREADCONFIG);
char input[128];
while(1)
{
memset(input,0,sizeof(input));
putchar('\n');
putchar('|');
fgets(input,sizeof(input)-1,stdin);
input[strlen(input)-1] = '\x00';
cmd(input);
}
return 0;
}
int configremake()
{
FILE *f;
print_notify(NOCONFIGFOUND);
if((f=fopen(configfilename,"w"))==NULL)
{
print_error(FOPEN);
return -1;
}
if(fwrite(defaultconfig,1,strlen(defaultconfig),f)<strlen(defaultconfig))
{
print_error(FWRITE);
return -1;
}
if(fclose(f)!=0)
{
print_error(FCLOSE);
return -1;
}
print_info(CONFIGWRITTEN);
return 1;
}
int run_config(char *cfg)
{
FILE *f;
int s,cmdp=0,cmds=0,cmde=0;
char *b, *t;
if(cfg!=NULL)
{
f=fopen(cfg,"r");
}
else
{
f=fopen(configfilename,"r");
}
if(f==NULL)
{
print_error(FOPEN);
if(cfg==NULL)
{
return configremake();
}
else
{
return -1;
}
}
fseek(f,0,SEEK_END);
if((s=ftell(f))<3)
{
if(fclose(f)!=0)
{
print_error(FCLOSE);
if(cfg==NULL)
{
return configremake();
}
else
{
return 0;
}
}
}
rewind(f);
if((b=(char*)malloc(s+1))==NULL)
{
print_error(MALLOC);
return -1;
}
memset(b,'\x00',s+1);
if(fread(b,1,s,f)==0)
{
print_error(FREAD);
free(b);
return -1;
}
t=(char*)strtok(b,"\n");
while(t!=NULL)
{
if(t[0]!='#')
{
if(cmd(t)==-1)
{
printf("%s\n",CMD);
cmde++;
}
else
{
cmdp++;
}
}
else
{
cmds++;
}
t=(char*)strtok(NULL,"\n");
}
free(b);
if(fclose(f)!=0)
{
print_error(FCLOSE);
return -1;
}
return 0;
}
int cmd(char *tok)
{
int r;
if(!strncmp(tok,"echo",4))
{
console_print(tok+4);
}
else if(!strcmp(tok,"quit"))
{
quit(0);
}
else if(!strcmp(tok,"exit"))
{
quit(0);
}
else if(!strncmp(tok,"exec",4))
{
config_exec(tok+4);
}
else if(!strncmp(tok,"aliases",7))
{
if(tok[7]=='\x00')
{
print_aliases();
}
else
{
print_usage(ALIASES);
}
}
else if(!strncmp(tok,"alias",5))
{
if((tok[5]==' ')&&(tok[6]!='\x00'))
{
new_alias(tok+6);
}
else
{
print_usage(ALIAS);
}
}
else if((r=alias_exist(tok))==-1)
{
print_error(UNKNOWNCOMMAND);
}
else
{
cmd(aliasstrings[r]);
}
return 0;
}
int print_aliases()
{
int i=0,f=0;
putchar('\n');
while((i<MAX_ALIASES)&&(f<aliascount))
{
if(aliasnames[i]!=NULL)
{
printf("%s = \"%s\"\n",aliasnames[i],aliasstrings[i]);
f++;
}
i++;
}
return 0;
}
int new_alias(char *tok)
{
int i=0,k,j,l1,f,l=strlen(tok);
while((tok[i]!=' ')&&(tok[i]!='\x00'))i++;
char *b;
b=(char*)malloc(i+1);
if((tok[0]=='\"')||(tok[i-1]=='\"'))
{
if((tok[0]=='\"')&&(tok[i-1]=='\"'))
{
/* for(k=1;k<i-2;k++)
{
b[k-1]=tok[k];
}
b[k-1]='\x00';*/
strncpy(b,tok+1,i-2);
b[i-1]=0;
}
else
{
print_usage(ALIAS);
return 0;
}
}
else
{
strncpy(b,tok,i);
b[i]=0;
}
f=alias_exist(b);
if((tok[i]==' ')&&(tok[i+1]=='\"'))
{
if(tok[i+2]=='\"')
{
if(f!=-1)
{
free(aliasnames[f]);
free(aliasstrings[f]);
aliasnames[f]=NULL;
aliasstrings[f]=NULL;
}
else
{
print_error(NOALIASFOUND);
}
}
i+=2;
k=0;
while((k<l-i)&&(tok[i+k]!='\"'))k++;
if(tok[i+k]=='\"')
{
if(f!=-1)
{
free(aliasstrings[f]);
aliasstrings[f]=(char*)malloc(k+1);
strncpy(aliasstrings[f],tok+i,k);
aliasstrings[f][k]='\x00';
printf("%s = \"%s\"\n",aliasnames[j],aliasstrings[j]);
return 0;
}
else
{
j=0;
while(j<MAX_ALIASES)
{
if(aliasnames[j]==NULL)
{
aliasnames[j]=(char*)malloc(strlen(b)+1);
strcpy(aliasnames[j],b);
aliasnames[j][strlen(b)]='\x00';
free(b);
aliasstrings[j]=(char*)malloc(k+1);
strncpy(aliasstrings[j],tok+i,k);
aliasstrings[j][k]='\x00';
aliascount++;
printf("%s = \"%s\"\n",aliasnames[j],aliasstrings[j]);
return 0;
}
j++;
}
}
}
}
else if(tok[i]=='\x00')
{
if(f!=-1)
{
printf("%s = \"%s\"\n",aliasnames[j],aliasstrings[j]);
free(b);
return 0;
}
}
free(b);
print_usage(ALIAS);
return 0;
}
int alias_exist(char *b)
{
int i=0,f=0;
while((i<MAX_ALIASES)&&(f<aliascount))
{
if(aliasnames[i]!=NULL)
{
if(!strcmp(b,aliasnames[i]))
{
return i;
}
f++;
}
i++;
}
return -1;
}
int console_print(char *b)
{
if((b[0]!=' ')||(b[1]=='\x00'))
{
print_usage(ECHO);
}
else
{
printf("%s\n",b+1);
}
}
int config_exec(char *b)
{
if((b[0]!=' ')||(b[1]=='\x00'))
{
print_usage(EXEC);
}
else
{
if(run_config(b+1)==-1)
{
print_error(ERRORREADCONFIG);
}
else
{
print_info(DONEREADCONFIG);
}
}
}
int print_error(int errnum)
{
printf("\n[-] %s\n",errors[errnum]);
return 0;
}
int print_notify(int notifynum)
{
printf("\n[!] %s\n",notifys[notifynum]);
return 0;
}
int print_info(int infonum)
{
printf("\n[+] %s\n",infos[infonum]);
return 0;
}
int print_usage(int usagenum)
{
printf("\n[?] %s\n",usage[usagenum]);
return 0;
}
int quit(int m)
{
if(!m)
{
print_notify(QUITTING);
}
else
{
print_error(BAILOUT);
}
system("pause");
exit(0);
}
If you read the code you might want to know this: I plan on adding these possibilitys in cmd():