132 lines
3.6 KiB
C++
132 lines
3.6 KiB
C++
|
/*
|
||
|
* File: main.cpp
|
||
|
* Author: Tiberiu
|
||
|
*
|
||
|
* Created on August 31, 2011, 2:54 PM
|
||
|
*/
|
||
|
|
||
|
#include <cstdlib>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <ctype.h>
|
||
|
|
||
|
#include "types.h"
|
||
|
using namespace std;
|
||
|
|
||
|
extern void CommandCreate (char** argv, int argc);
|
||
|
extern void CommandSetFlags (char** argv, int argc);
|
||
|
extern void CommandAddFile (char** argv, int argc);
|
||
|
extern void CommandAddDirectory (char** argv, int argc);
|
||
|
extern void CommandChangeDirectory (char** argv, int argc);
|
||
|
extern void CommandClose ();
|
||
|
|
||
|
void GetParams(char* buffer, char* params[], int &count)
|
||
|
{
|
||
|
bool inside_quotes = false;
|
||
|
int len = strlen(buffer);
|
||
|
count = 0;
|
||
|
|
||
|
if (buffer[0] == '#')
|
||
|
{
|
||
|
count = 1; params[0] = ""; return;
|
||
|
}
|
||
|
|
||
|
if (!isspace(buffer[0])) params[count++] = buffer;
|
||
|
else buffer[0] = 0;
|
||
|
|
||
|
for (int i = 1; i < len && count < 16; i++)
|
||
|
{
|
||
|
if (buffer[i] == '"') {
|
||
|
inside_quotes = (inside_quotes) ? false : true;
|
||
|
if (inside_quotes && buffer[i-1] == 0) params[count++] = &buffer[i];
|
||
|
++i;
|
||
|
}
|
||
|
if (inside_quotes) continue;
|
||
|
|
||
|
// Comment
|
||
|
if (buffer[i] == '#') {
|
||
|
buffer[i] = 0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!isspace(buffer[i]) && (buffer[i-1]==0))
|
||
|
params[count++] = &buffer[i];
|
||
|
|
||
|
else if (isspace(buffer[i])) buffer[i] = 0;
|
||
|
}
|
||
|
|
||
|
if (count == 0) {
|
||
|
count = 1;
|
||
|
params[0] = "";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool LineEmpty (char* s)
|
||
|
{
|
||
|
for (int i = 0; i < strlen(s); i++)
|
||
|
if (!isspace(s[i])) return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
void ExecuteScript (char* input)
|
||
|
{
|
||
|
char buffer[1024];
|
||
|
char* argv[16]; int argc;
|
||
|
|
||
|
// Try to open file
|
||
|
FILE* in = fopen(input, "r");
|
||
|
if (!in) { perror(input); return ; }
|
||
|
|
||
|
// Read file line by line
|
||
|
printf("Reading script file %s...\n", input);
|
||
|
for (int line = 0; fgets(buffer, 1024, in); line++)
|
||
|
{
|
||
|
GetParams(buffer, argv, argc);
|
||
|
|
||
|
try {
|
||
|
if (strcmp(argv[0], "CREATE") == 0) CommandCreate(argv, argc);
|
||
|
else if (strcmp(argv[0], "CLOSE") == 0) CommandClose();
|
||
|
else if (strcmp(argv[0], "MKDIR") == 0) CommandAddDirectory(argv, argc);
|
||
|
else if (strcmp(argv[0], "CD") == 0) CommandChangeDirectory(argv, argc);
|
||
|
else if (strcmp(argv[0], "ADD") == 0) CommandAddFile(argv, argc);
|
||
|
else if (strcmp(argv[0], "SETFLAGS") == 0) CommandSetFlags(argv, argc);
|
||
|
else if (LineEmpty(argv[0])) continue;
|
||
|
else {
|
||
|
fprintf(stderr, "%i: Invalid command.\n", line);
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
catch (int exc) {
|
||
|
// Exception handler
|
||
|
switch (exc) {
|
||
|
case ExcCannotOpenInput: fprintf(stderr, "%i: Cannot open input file.\n", line); break;
|
||
|
case ExcCannotOpenOutput: fprintf(stderr, "%i: Cannot open output file.\n", line); break;
|
||
|
case ExcInvalidCommand: fprintf(stderr, "%i: Invalid command.\n", line); break;
|
||
|
case ExcInvalidPath: fprintf(stderr, "%i: Invalid path.\n", line); break;
|
||
|
case ExcSyntaxError: fprintf(stderr, "%i: Syntax error, robably missing parameter.\n", line); break;
|
||
|
}
|
||
|
printf("An error occurred, execution has been terminated.\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
memset(buffer, 0, 1024 * sizeof(char));
|
||
|
}
|
||
|
|
||
|
fclose (in);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char** argv) {
|
||
|
|
||
|
if (argc < 2) {
|
||
|
fprintf(stderr, "Missing parameter: script file.");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
for (int i = 1; i < argc; i++)
|
||
|
ExecuteScript (argv[i]);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|