Initial commit for CHP
This commit is contained in:
parent
e9ebefd5bb
commit
9424f3a1b4
6
Makefile
6
Makefile
@ -29,6 +29,12 @@ LOMMEREIMAR_OBJ = $(patsubst %.c, build/lommereimar/%.o, $(LOMMEREIMAR_SRC))
|
||||
lommereimar: $(LOMMEREIMAR_OBJ) $(COMMON_OBJ)
|
||||
$(CC) -o bin/$@ $(CFLAGS) $^ -lm
|
||||
|
||||
CHP_SRC = chp.c
|
||||
CHP_OBJ = $(patsubst %.c, build/chp/%.o, $(LOMMEREIMAR_SRC))
|
||||
|
||||
chp: $(CHP_OBJ) $(COMMON_OBJ)
|
||||
$(CC) -o bin/$@ $(CFLAGS) $^ -lm
|
||||
|
||||
build/%.o: %.c $(shell find -name *.h)
|
||||
mkdir $(@D) -p
|
||||
$(CC) -c -o $@ $(CFLAGS) $<
|
||||
|
98
chp/chp.c
Normal file
98
chp/chp.c
Normal file
@ -0,0 +1,98 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <linux/limits.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <string.h>
|
||||
|
||||
#define BASE_DIR "/tmp/chp"
|
||||
#define INTERMEDIATE_DIR "/tmp/chp/intermediate"
|
||||
#define COMPILE_DIR "/tmp/chp/compiled"
|
||||
|
||||
#define BUFFER_SIZE 25565
|
||||
|
||||
char *replace_tag(char *str, int pos)
|
||||
{
|
||||
// TODO
|
||||
|
||||
char *new = malloc(strlen(str) + 256);
|
||||
memset(new, strlen(str) + 256, sizeof(char));
|
||||
|
||||
strncat(new, str, pos);
|
||||
}
|
||||
|
||||
void handle_file(char *filename)
|
||||
{
|
||||
int filename_length = strlen(filename);
|
||||
|
||||
if (strncmp(filename + filename_length - 4, ".chp", 4) != 0)
|
||||
return;
|
||||
|
||||
char *intermediate_filename = strdup(filename);
|
||||
intermediate_filename[filename_length - 2] = '\0';
|
||||
|
||||
|
||||
FILE *input = fopen(filename, "r");
|
||||
FILE *output = fopen(intermediate_filename, "w");
|
||||
|
||||
char buffer[BUFFER_SIZE], newbuffer[BUFFER_SIZE];
|
||||
|
||||
while (fgets(buffer, BUFFER_SIZE, input) != NULL) {
|
||||
char *str = buffer, *pos;
|
||||
|
||||
// TODO
|
||||
/*while ((pos = strstr(str, "<?c")) != NULL)
|
||||
str = replace_tag(str, pos - str);*/
|
||||
|
||||
fputs(newbuffer, output);
|
||||
}
|
||||
|
||||
free(intermediate_filename);
|
||||
}
|
||||
|
||||
void read_directory(char *dirname)
|
||||
{
|
||||
DIR *dir = opendir(dirname);
|
||||
if (!dir) return;
|
||||
|
||||
struct dirent *entry;
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
if (!strncmp(entry->d_name, ".", 1) || !strncmp(entry->d_name, "..", 2)) continue;
|
||||
|
||||
int pathlength = strlen(dirname) + strlen(entry->d_name) + 2;
|
||||
char *pathname = malloc(pathlength);
|
||||
snprintf(pathname, pathlength, "%s/%s", dirname, entry->d_name);
|
||||
|
||||
switch (entry->d_type) {
|
||||
case DT_REG:
|
||||
handle_file(pathname);
|
||||
break;
|
||||
case DT_DIR:
|
||||
read_directory(pathname);
|
||||
break;
|
||||
}
|
||||
|
||||
free(pathname);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("Compiling..");
|
||||
|
||||
mkdir(BASE_DIR, 0777);
|
||||
mkdir(INTERMEDIATE_DIR, 0777);
|
||||
mkdir(COMPILE_DIR, 0777);
|
||||
|
||||
char current_dir[PATH_MAX];
|
||||
getcwd(current_dir, sizeof(current_dir));
|
||||
|
||||
read_directory(current_dir);
|
||||
|
||||
puts("Ready");
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user