skratch/skratch.c
2026-03-20 18:38:24 -07:00

166 lines
2.8 KiB
C

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
struct Flags
{
int use_v;
int use_s;
char suffix[255];
char skratch_path[4096];
char file_path[4096];
char filename[255];
char editor[255];
};
void set_editor(struct Flags *f)
{
char *ed;
if (f->use_v)
ed = getenv("VISUAL");
else
ed = getenv("EDITOR");
if (ed)
strcpy(f->editor, ed);
else
strcpy(f->editor, "vi");
}
int make_skratch_file(struct Flags *f)
{
char fp[4096];
int fd = 0;
snprintf(fp, sizeof(fp), "%s/%s", f->skratch_path, f->filename);
if (!strcmp(f->filename, "skratchXXXXXX"))
{
fd = mkstemp(fp);
close(fd);
}
if (fd == -1)
{
printf("ERROR: Couldn't create skratch file!");
return 3;
}
strcpy(f->file_path, fp);
return 0;
}
int make_skratch_path(struct Flags *f)
{
char sp[4096];
char *home_path = getenv("HOME");
if (home_path == NULL)
{
printf("ERROR: No HOME variable set!");
return 1;
}
snprintf(sp, sizeof(sp), "%s/.skratch", home_path);
int result = mkdir(sp, 0755);
if (result < 0 && errno != EEXIST)
{
printf("ERROR: Couldn't create: %s\n", sp);
return 2;
}
strcpy(f->skratch_path, sp);
return 0;
}
int list_files(struct Flags *f, int delete)
{
DIR *d = opendir(f->skratch_path);
if (d == NULL) return 5;
struct dirent *dir;
if (d)
{
while ((dir = readdir(d)) != NULL)
{
char fn[4096];
strcpy(fn,dir->d_name);
if (!strcmp(".",fn) || !strcmp("..",fn))
{
continue;
}
if (delete)
{
char fp[4096];
snprintf(fp, sizeof(fp), "%s/%s", f->skratch_path, dir->d_name);
remove(fp);
}
else printf("%s\n", dir->d_name);
}
closedir(d);
}
return 0;
}
int delete_files(struct Flags *f)
{
list_files(f, 0);
printf("Delete the listed files? [y/N] ");
char choice = 'N';
scanf(" %c", &choice);
if (choice == 'y' || choice == 'Y')
{
list_files(f, 1);
}
return 0;
}
int main(int argc, char *argv[])
{
int delete = 0;
struct Flags f = {.use_v = 0, .filename="skratchXXXXXX"};
make_skratch_path(&f);
char arg;
for (int i = 1; i < argc; i++)
{
if (argv[i][0] == '-' && strlen(argv[i]) == 2)
{
arg = argv[i][1];
}
else
{
//set filename
if (!strcmp(f.filename,"skratchXXXXXX"))
{
strcpy(f.filename, argv[i]);
continue;
}
else
{
printf("INVALID ARGUMENT: %s\n", argv[i]);
return 4;
}
}
switch (arg)
{
case 'c':
delete_files(&f);
return 0;
case 'l':
list_files(&f, delete);
return 0;
case 'v':
f.use_v = 1;
break;
default:
printf("Unknown Arg %c",arg);
return 5;
}
}
set_editor(&f);
make_skratch_file(&f);
char *args[3];
args[0] = f.editor;
args[1] = f.file_path;
args[2] = NULL;
execvp(f.editor,args);
}