367 lines
6.9 KiB
C
367 lines
6.9 KiB
C
#include <tos.h>
|
|
#include <vdi.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#include "script.h"
|
|
|
|
static short echo_off = 1;
|
|
|
|
static void scripterror( char * msg )
|
|
{
|
|
printf( "Error: %s\n", msg );
|
|
printf("Press any key to continue\n");
|
|
getch();
|
|
}
|
|
|
|
static int isspace( unsigned char x ) {
|
|
|
|
int ret = 0;
|
|
|
|
if( (x > 0 && x <= 0x20) || x == 255 ){
|
|
ret = 1;
|
|
}
|
|
|
|
return( ret );
|
|
}
|
|
|
|
static char * strstrip( char * s )
|
|
{
|
|
long size;
|
|
char * end;
|
|
|
|
size = strlen( s );
|
|
if(!size){
|
|
return( s );
|
|
}
|
|
|
|
end = s + size;
|
|
while( end >= s && isspace(*end) )
|
|
end--;
|
|
if( end <= (s + size) )
|
|
*end = '\0';
|
|
|
|
while( *s && isspace(*s) )
|
|
s++;
|
|
return( s );
|
|
}
|
|
|
|
static char * getline( char ** curpos )
|
|
{
|
|
char * start;
|
|
char * end;
|
|
static char line[SCRIPT_MAX_LEN+1];
|
|
start = *curpos;
|
|
|
|
if( *start == 0 ) {
|
|
return( NULL );
|
|
}
|
|
|
|
end = strpbrk( start, "\r\n" );
|
|
if( end == NULL ) {
|
|
end = (start + strlen(start));
|
|
if( end == start ) {
|
|
return( NULL );
|
|
}
|
|
}
|
|
if( end < start ) {
|
|
printf("getline: end < start!?\n");
|
|
return( NULL );
|
|
}
|
|
|
|
if( (end-start) > 0 ){
|
|
memcpy( line, start, end-start );
|
|
}
|
|
|
|
line[end-start]=0;
|
|
*curpos += (end-start)+1;
|
|
return( strstrip( line ) );
|
|
|
|
}
|
|
|
|
static long copy_file( char * src, char * dst)
|
|
{
|
|
long count;
|
|
int srcf,dstf;
|
|
static buf[8192];
|
|
|
|
srcf = Fopen( src, 0 );
|
|
dstf = Fcreate( dst, 0 );
|
|
|
|
if( srcf < 0 || dstf < 0 ){
|
|
if( srcf > 0)
|
|
Fclose( srcf );
|
|
if( dstf > 0 )
|
|
Fclose( srcf );
|
|
return( -2 );
|
|
}
|
|
|
|
count = Fread( srcf, 8192, &buf );
|
|
if( count > 0 ){
|
|
do{
|
|
Fwrite(dstf, count, &buf );
|
|
count = Fread( srcf, 8192, &buf);
|
|
}while( count > 0 );
|
|
}
|
|
|
|
Fclose(dstf);
|
|
Fclose(srcf);
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static long exec_rewrite_cmd(char * line)
|
|
{
|
|
long len_needle = -1;
|
|
long len_repl = -1;
|
|
FILE * fh;
|
|
FILE * tmpfh;
|
|
char * linebuf;
|
|
char * linebuf2;
|
|
char * needle;
|
|
char * curchar;
|
|
char * curchar2;
|
|
char found = 0;
|
|
|
|
char *arg1;
|
|
char *arg2;
|
|
char *arg3;
|
|
|
|
arg1 = strstrip(line); /* filename */
|
|
if(arg1 == NULL) {
|
|
scripterror("Invalid Arguments!\n");
|
|
return(-1000);
|
|
}
|
|
|
|
arg2 = strchr(arg1, ' '); /* needle */
|
|
if(arg2 == NULL) {
|
|
scripterror("Invalid Arguments!\n");
|
|
return(-1000);
|
|
}
|
|
|
|
arg3 = strchr(arg2+1, ' '); /* replacement */
|
|
if(arg3 == NULL) {
|
|
scripterror("Invalid Arguments!\n");
|
|
return(-1000);
|
|
}
|
|
|
|
*arg2 = 0;
|
|
arg2++;
|
|
arg2 = strstrip( arg2 );
|
|
|
|
*arg3 = 0;
|
|
arg3++;
|
|
|
|
arg3 = strstrip( arg3 );
|
|
/*
|
|
printf("Replacing line containing %s with %s in %s\n",
|
|
arg2, arg3, arg1
|
|
);
|
|
*/
|
|
len_needle = strlen(arg2);
|
|
len_repl = strlen(arg3);
|
|
|
|
/* keep the original string: */
|
|
needle = malloc(len_needle+1);
|
|
|
|
strcpy(needle, arg2);
|
|
strlwr(needle);
|
|
|
|
if( len_needle < 3 || len_repl < 3 ){
|
|
scripterror("Invalid Argument lenght, each string must be at least 3 chracters long!\n");
|
|
return(-1001);
|
|
}
|
|
|
|
/* read file, line by line */
|
|
/* foreach line */
|
|
/* when line contains needle */
|
|
/* write replacement */
|
|
/* else */
|
|
/* write orignal data */
|
|
|
|
fh = fopen(arg1, "rb");
|
|
if(!fh){
|
|
scripterror("Could not open input file!\n");
|
|
return(-1002);
|
|
}
|
|
tmpfh = fopen("rewrite.tmp", "wb");
|
|
if(!tmpfh){
|
|
scripterror("Could not open output temp. file!\n");
|
|
return(-1003);
|
|
}
|
|
|
|
linebuf = malloc(2048);
|
|
linebuf2 = malloc(2048);
|
|
while (feof(fh) == 0){
|
|
fgets(linebuf, 2048, fh);
|
|
strcpy(linebuf2, linebuf);
|
|
strlwr(linebuf);
|
|
if(strstr(linebuf, needle) != NULL){
|
|
curchar = linebuf;
|
|
curchar2 = linebuf2;
|
|
while(*curchar != 0){
|
|
if(strstr(curchar, needle) == curchar) {
|
|
fwrite(arg3, len_repl, 1, tmpfh);
|
|
curchar += len_needle;
|
|
curchar2 += len_needle;
|
|
} else {
|
|
fputc(*curchar2, tmpfh);
|
|
curchar++;
|
|
curchar2++;
|
|
}
|
|
}
|
|
found = 1;
|
|
} else {
|
|
fwrite(linebuf2, strlen(linebuf), 1, tmpfh);
|
|
}
|
|
}
|
|
fclose(fh);
|
|
fclose(tmpfh);
|
|
|
|
if(found == 1) {
|
|
unlink(arg1);
|
|
copy_file("rewrite.tmp", arg1);
|
|
}
|
|
unlink("rewrite.tmp");
|
|
|
|
free(needle);
|
|
free(linebuf);
|
|
free(linebuf2);
|
|
#undef MAX_LINE_LEN
|
|
return(0);
|
|
}
|
|
|
|
static long exec_copy_cmd( char * line )
|
|
{
|
|
|
|
char * arg1 = strstrip(line);
|
|
char * arg2 = strchr( arg1, ' ' );
|
|
|
|
if( arg2 == NULL ){
|
|
scripterror("Missing second parameter!\n");
|
|
return(-1000);
|
|
}
|
|
*arg2 = 0;
|
|
arg2++;
|
|
|
|
arg2 = strstrip( arg2 );
|
|
|
|
if( strlen(arg1) > 2 && strlen(arg2) > 2 ){
|
|
copy_file( arg1, arg2 );
|
|
} else {
|
|
scripterror("Parameters to copy must be at least 3 chartacters long!\n");
|
|
return( -1001 );
|
|
}
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static long exec_set_cmd( char * line ){
|
|
|
|
char * arg1 = strstrip(line);
|
|
char * arg2 = strchr( arg1, ' ' );
|
|
|
|
if( strlen(line) <= 1 || arg1 == NULL ) {
|
|
scripterror("Missing first parameter!");
|
|
return(-1000);
|
|
}
|
|
|
|
if( arg2 == NULL ){
|
|
scripterror("Missing second parameter!");
|
|
return(-1000);
|
|
}
|
|
*arg2 = 0;
|
|
arg2++;
|
|
|
|
arg2 = strstrip( arg2 );
|
|
|
|
if( strlen(arg1) >= 2 && strlen(arg2) >= 2 ){
|
|
if( strncmp(arg1, "echo", 4) == 0 ) {
|
|
if( strncmp(arg2, "on", 2) == 0 ){
|
|
echo_off = 0;
|
|
}
|
|
if( strncmp(arg2, "off", 3) == 0){
|
|
echo_off = 1;
|
|
}
|
|
printf("echo is now %s\n", ( echo_off==1) ? "off" : "on" );
|
|
}
|
|
} else {
|
|
scripterror("Invalid parameters passed to set!\n");
|
|
return( -1001 );
|
|
}
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static long exec_pause_cmd( char * line ){
|
|
|
|
char * arg1 = strstrip(line);
|
|
if( strlen(arg1)<=1 ){
|
|
printf("Press any key to continue...\n");
|
|
} else {
|
|
printf( "%s\n", arg1 );
|
|
}
|
|
getch();
|
|
return( 0 );
|
|
}
|
|
|
|
static long exec_echo_cmd( char * line ){
|
|
|
|
char * arg1 = strstrip(line);
|
|
printf( "%s\n", arg1 );
|
|
return( 0 );
|
|
}
|
|
|
|
static void parse_line( char * line ){
|
|
|
|
long len;
|
|
|
|
len = strlen( line ) ;
|
|
|
|
if( len < 1 ) {
|
|
return;
|
|
}
|
|
if( strchr(line, '#') == line ){
|
|
return;
|
|
}
|
|
|
|
if( echo_off == 0 )
|
|
printf("%s\n", line );
|
|
|
|
if( strncmp( line, "copy", 4) == 0 ) {
|
|
exec_copy_cmd( line+4 );
|
|
}
|
|
else if( strncmp( line, "pause", 5) == 0 ) {
|
|
exec_pause_cmd( line+5 );
|
|
}
|
|
else if( strncmp( line, "echo", 4) == 0 ) {
|
|
exec_echo_cmd( line+4 );
|
|
}
|
|
else if( strncmp( line, "set", 3) == 0 ) {
|
|
exec_set_cmd( line+3 );
|
|
}
|
|
else if( strncmp( line, "rewrite", 7) == 0 ) {
|
|
exec_rewrite_cmd( line+7 );
|
|
}
|
|
}
|
|
|
|
static char script_copy[SCRIPT_MAX_LEN+1];
|
|
long execute_script( char * script_in )
|
|
{
|
|
char ** curline;
|
|
char * line;
|
|
|
|
*curline=&script_copy[0];
|
|
|
|
strncpy( script_copy, script_in, SCRIPT_MAX_LEN );
|
|
script_copy[SCRIPT_MAX_LEN]=0;
|
|
|
|
while( strlen(*curline) > 0 && (line=getline(curline)) != NULL ) {
|
|
if( strlen(line) > 0 ) {
|
|
parse_line( line );
|
|
}
|
|
}
|
|
return( 0 );
|
|
} |