222 lines
4.6 KiB
C
222 lines
4.6 KiB
C
/*
|
|
SlideScript - minimalistic top-down scripting language.
|
|
(C) Copyright 2014-2022 Chris Dorman - some rights reserved (GPLv2)
|
|
|
|
View README file supplied with this software for more details
|
|
*/
|
|
|
|
|
|
#include "inc/deps.h"
|
|
#include "inc/util.h"
|
|
|
|
time_t current_time;
|
|
|
|
void syn_error(char *message)
|
|
{
|
|
printf("%s\n", message);
|
|
exit(1);
|
|
}
|
|
|
|
long fsize (FILE *in)
|
|
{
|
|
long pos, length;
|
|
pos = ftell(in);
|
|
fseek(in, 0L, SEEK_END);
|
|
length = ftell(in);
|
|
fseek(in, pos, SEEK_SET);
|
|
return length;
|
|
}
|
|
|
|
void syn_warn(char *message)
|
|
{
|
|
printf("%s\n", message);
|
|
}
|
|
|
|
char *strip_nl (char *string)
|
|
{
|
|
int n = strlen (string);
|
|
|
|
if ((n-- > 0) && (string [n] == '\n'))
|
|
{
|
|
string [n] = NULLBYTE;
|
|
return string;
|
|
}
|
|
else
|
|
{
|
|
/* no newline found, return the original string */
|
|
return string;
|
|
}
|
|
}
|
|
|
|
// Check if a file exists, return code
|
|
int file_exists(char *path) {
|
|
struct stat buffer;
|
|
return (stat (path, &buffer) == 0);
|
|
}
|
|
|
|
int is_dir(char *path)
|
|
{
|
|
struct stat buffer;
|
|
|
|
stat(path, &buffer);
|
|
|
|
// Check for file existence
|
|
if (S_ISDIR(buffer.st_mode))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// mkpath function for mkdir and mkfile
|
|
int mkpath(char* file_path, mode_t mode)
|
|
{
|
|
assert(file_path && *file_path);
|
|
for (char* p = strchr(file_path + 1, '/'); p; p = strchr(p + 1, '/'))
|
|
{
|
|
*p = '\0';
|
|
if (mkdir(file_path, mode) == -1)
|
|
{
|
|
if (errno != EEXIST)
|
|
{
|
|
*p = '/';
|
|
return -1;
|
|
}
|
|
}
|
|
*p = '/';
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
char *ss_concat(char *str1, char *str2)
|
|
{
|
|
char *dymem = (char *) malloc((strlen(str1)+strlen(str2)) + 3);
|
|
sprintf(dymem, "%s, %s", str1, str2);
|
|
return dymem;
|
|
}
|
|
|
|
void parse_args(int argc, char** argv)
|
|
{
|
|
/* -h flag given, show help */
|
|
if(argc == 2 && strncmp("-h", argv[1], 2) == 0)
|
|
{
|
|
printf("SlideScript - simple top-down scripting language for the average user\n"
|
|
"Arguments:\n\n"
|
|
"-v\t Display version number\n"
|
|
"-h\t Display this help page\n"
|
|
"Usage: %s <filename>\n", argv[0]);
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
/* -v flag given, show version */
|
|
else if(argc == 2 && strncmp("-v", argv[1], 2) == 0)
|
|
{
|
|
printf("SlideScript %s, Chris Dorman (cddo@riseup.net), 2022\n", VERSION);
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
}
|
|
|
|
char *ss_time()
|
|
{
|
|
time(¤t_time);
|
|
|
|
return ctime(¤t_time);
|
|
}
|
|
|
|
void gen_random_string(char *s, const int len) {
|
|
static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
|
|
time_t tvar;
|
|
srand((unsigned) time(&tvar));
|
|
|
|
for (int ii = 0; ii < len; ++ii) {
|
|
s[ii] = alphanum[rand() % (sizeof(alphanum) - 1)];
|
|
}
|
|
|
|
s[len] = 0;
|
|
}
|
|
|
|
// Removes extension from filename for compression
|
|
char *remove_extension(char *string)
|
|
{
|
|
char *ret_string;
|
|
char *lastExt;
|
|
if (string == NULL) return (char *)NULL;
|
|
if ((ret_string = malloc (strlen (string) + 1)) == NULL) return (char *)NULL;
|
|
strcpy (ret_string, string);
|
|
lastExt = strrchr (ret_string, '.');
|
|
if (lastExt != NULL)
|
|
*lastExt = '\0';
|
|
return ret_string;
|
|
}
|
|
|
|
int check_for_var(char *string)
|
|
{
|
|
if(strchr(string, '=') != NULL)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
char **line_to_args(char *line)
|
|
{
|
|
int bufsize = MAXPATHLENGTH+1, position = 0;
|
|
char **tokens = calloc(bufsize, sizeof(char*));
|
|
char *token, **tokens_backup;
|
|
|
|
if (!tokens) {
|
|
fprintf(stderr, "cdsh: allocation error\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
token = strtok(line, " ");
|
|
while (token != NULL) {
|
|
tokens[position] = strip_nl(token);
|
|
position++;
|
|
|
|
if (position >= bufsize) {
|
|
bufsize += MAXPATHLENGTH;
|
|
tokens_backup = tokens;
|
|
tokens = realloc(tokens, bufsize * sizeof(char*));
|
|
if (!tokens) {
|
|
free(tokens_backup);
|
|
fprintf(stderr, "cdsh: allocation error\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
token = strtok(NULL, " ");
|
|
}
|
|
tokens[position] = NULL;
|
|
return tokens;
|
|
}
|
|
|
|
int ss_exec(char **args)
|
|
{
|
|
pid_t pid;
|
|
int status;
|
|
|
|
pid = fork();
|
|
if (pid == 0) {
|
|
// Child process
|
|
if (execvp(args[0], args) == -1) {
|
|
printf("ss:warn:failed to create child process\n");
|
|
}
|
|
|
|
return 1;
|
|
|
|
} else if (pid < 0) {
|
|
// Error forking
|
|
perror("cdsh");
|
|
} else {
|
|
// Parent process
|
|
do {
|
|
waitpid(pid, &status, WUNTRACED);
|
|
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
|
|
}
|
|
|
|
return 0;
|
|
}
|