initial commit
This commit is contained in:
commit
a9f50b264c
10
Makefile
Normal file
10
Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
all: rcms
|
||||
test:
|
||||
./rcms test/index.txt
|
||||
rcms:
|
||||
make --no-print-directory -C src
|
||||
@ln -s src/rcms rcms 2>/dev/null
|
||||
clean:
|
||||
make --no-print-directory clean -C src
|
||||
rm rcms
|
||||
.PHONY: all clean test rcms
|
4
README
Normal file
4
README
Normal file
@ -0,0 +1,4 @@
|
||||
Tool to generate static website from specification documents
|
||||
(text files).
|
||||
|
||||
See test directory for examples.
|
0
p/index.html
Normal file
0
p/index.html
Normal file
3
s.sh
Executable file
3
s.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/sh
|
||||
|
||||
./rcms test/index.txt 2>&1 > p/index.html
|
11
src/Makefile
Normal file
11
src/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
CC= tcc
|
||||
CFLAGS= -Wfatal-errors
|
||||
LDFLAGS= -s
|
||||
OBJS= main.o str.o rcms.o
|
||||
|
||||
all: rcms
|
||||
rcms: $(OBJS)
|
||||
$(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)
|
||||
clean:
|
||||
$(RM) rcms $(OBJS)
|
||||
.PHONY: all clean
|
37
src/main.c
Normal file
37
src/main.c
Normal file
@ -0,0 +1,37 @@
|
||||
#include<fcntl.h>
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<string.h>
|
||||
#include<unistd.h>
|
||||
#include"rcms.h"
|
||||
#include"str.h"
|
||||
|
||||
int main(int argc,char**argv)
|
||||
{
|
||||
char*filename=NULL;
|
||||
String str=str_new(64);
|
||||
|
||||
printf("\r"); // I have no idea why this is necessary
|
||||
str_cpy(&str,"Well what exactly is this?");
|
||||
|
||||
if(argc<2)
|
||||
{
|
||||
puts("error");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Find file
|
||||
assert_file_exists(argv[1]);
|
||||
filename=argv[1];
|
||||
|
||||
// Read file
|
||||
FILE*f=fopen(filename,"r");
|
||||
if(!f)
|
||||
{
|
||||
printf("error: cannot read '%s'\n",filename);
|
||||
exit(3);
|
||||
}
|
||||
|
||||
outputfile(f);
|
||||
str_free(&str);
|
||||
}
|
128
src/rcms.c
Normal file
128
src/rcms.c
Normal file
@ -0,0 +1,128 @@
|
||||
#include<fcntl.h>
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<string.h>
|
||||
#include<unistd.h>
|
||||
#include"rcms.h"
|
||||
#include"str.h"
|
||||
|
||||
int fpeek(FILE *f)
|
||||
{
|
||||
int c;
|
||||
c=fgetc(f);
|
||||
ungetc(c,f);
|
||||
return c;
|
||||
}
|
||||
|
||||
void parse(String str)
|
||||
{
|
||||
String cmd=str_new(64);
|
||||
char*del=" ";
|
||||
char*s=strtok(str.s,del);
|
||||
|
||||
// --- FILE ---
|
||||
//printf("PARSE: ");
|
||||
if(strcmp(s,"file")==0)
|
||||
{
|
||||
s=strtok(NULL,del);
|
||||
//printf("FILE: '%s'\n",s);
|
||||
char*fn=s;
|
||||
FILE*f=fopen(fn,"r");
|
||||
char b[512];
|
||||
size_t n=0;
|
||||
|
||||
if(!f)
|
||||
{
|
||||
printf("\nerror: cannot open file '%s'\n",fn);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while(!feof(f))
|
||||
{
|
||||
n=fread(b,1,512,f);
|
||||
fwrite(b,1,n,stdout);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
// --- H1 ---
|
||||
else if(strcmp(s,"h1")==0)
|
||||
{
|
||||
printf("<h1>");
|
||||
while(s=strtok(NULL,del))printf("%s ",s);
|
||||
//printf("%s",strtok(NULL,del));
|
||||
printf("</h1>");
|
||||
}
|
||||
|
||||
str_free(&cmd);
|
||||
}
|
||||
|
||||
void outputfile(FILE*in)
|
||||
{
|
||||
String str=str_new(64);
|
||||
enum {NORM,UNMATCHED,MATCHED};
|
||||
int state=NORM;
|
||||
|
||||
while(!feof(in))
|
||||
{
|
||||
char b=0;
|
||||
char res=0;
|
||||
char*string=NULL;
|
||||
|
||||
fread(&b,1,1,in);
|
||||
res=fpeek(in);
|
||||
|
||||
if(b=='[' && state==NORM)
|
||||
{
|
||||
if(res=='[')
|
||||
fread(&b,1,1,in);
|
||||
|
||||
// Create command string
|
||||
else
|
||||
{
|
||||
fread(&b,1,1,in);
|
||||
str_cpy(&str,"");
|
||||
state=UNMATCHED;
|
||||
}
|
||||
}
|
||||
|
||||
else if(b==']' && state==UNMATCHED)
|
||||
{
|
||||
//if(res=='\n')
|
||||
//fread(&b,1,1,in);
|
||||
state=MATCHED;
|
||||
parse(str);
|
||||
}
|
||||
|
||||
else if(b==']' && state==NORM)
|
||||
{
|
||||
fread(&b,1,1,in);
|
||||
}
|
||||
|
||||
if(state==UNMATCHED)
|
||||
{
|
||||
char t[2]={b,0};
|
||||
str_cat(&str,t);
|
||||
}
|
||||
else if(state==MATCHED)
|
||||
state=NORM;
|
||||
else if(state==NORM)
|
||||
fwrite(&b,1,1,stdout);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
str_free(&str);
|
||||
}
|
||||
|
||||
void assert_file_exists(char*fn)
|
||||
{
|
||||
int fd=open(fn,O_RDONLY);
|
||||
|
||||
if(!fd)
|
||||
{
|
||||
printf("error: cannot find '%s'\n",fn);
|
||||
close(fd);
|
||||
exit(2);
|
||||
}
|
||||
}
|
12
src/rcms.h
Normal file
12
src/rcms.h
Normal file
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include<fcntl.h>
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<string.h>
|
||||
#include<unistd.h>
|
||||
#include"str.h"
|
||||
|
||||
int fpeek(FILE *f);
|
||||
void assert_file_exists(char*fn);
|
||||
void outputfile(FILE*in);
|
||||
void parse(String str);
|
94
src/str.c
Normal file
94
src/str.c
Normal file
@ -0,0 +1,94 @@
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include"str.h"
|
||||
|
||||
String str_new(size_t n)
|
||||
{
|
||||
String s={.s=NULL,.n=0};
|
||||
|
||||
s.s=malloc(n);
|
||||
if(!s.s)
|
||||
{
|
||||
printf("error: cannot allocate string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
s.n=n;
|
||||
return s;
|
||||
}
|
||||
|
||||
void str_cpy(String*str,char*s)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
if(!str)
|
||||
{
|
||||
printf("error: cannot copy to NULL string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(!str->s)
|
||||
{
|
||||
printf("error: cannot copy to empty string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
n=strlen(s)+1;
|
||||
if(str->n<n)
|
||||
str_grow(str,n);
|
||||
|
||||
//memcpy(str->s,s,n);
|
||||
strcpy(str->s,s);
|
||||
str->n=n;
|
||||
}
|
||||
|
||||
void str_grow(String*str,size_t n)
|
||||
{
|
||||
if(!str->s)
|
||||
{
|
||||
printf("error: cannot grow empty string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(str->n>n)
|
||||
{
|
||||
str->s=realloc(str->s,n);
|
||||
if(!str->s)
|
||||
{
|
||||
printf("error: cannot reallocate string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
str->n=n;
|
||||
}
|
||||
}
|
||||
|
||||
void str_free(String*str)
|
||||
{
|
||||
if(str->s)
|
||||
free(str->s);
|
||||
if(str->n>0)
|
||||
str->n=0;
|
||||
}
|
||||
|
||||
void str_cat(String*str,char*s)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
if(!str)
|
||||
{
|
||||
printf("error: cannot concatenate NULL string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(!str->s)
|
||||
{
|
||||
printf("error: cannot concatenate empty string\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
n=str->n+strlen(s)+1;
|
||||
str_grow(str,n);
|
||||
strcat(str->s,s);
|
||||
str->n=n;
|
||||
}
|
22
src/str.h
Normal file
22
src/str.h
Normal file
@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
#include<stdint.h>
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
|
||||
/***
|
||||
*
|
||||
* Tool-assisted C strings or what
|
||||
*
|
||||
***/
|
||||
|
||||
typedef struct String
|
||||
{
|
||||
char*s;
|
||||
size_t n;
|
||||
} String;
|
||||
|
||||
String str_new(size_t n);
|
||||
void str_cpy(String*str,char*s);
|
||||
void str_free(String*str);
|
||||
void str_grow(String*str,size_t n);
|
||||
void str_cat(String*str,char*s);
|
3
test/footer.html
Normal file
3
test/footer.html
Normal file
@ -0,0 +1,3 @@
|
||||
</br>
|
||||
THIS IS THE END OF THE FILE
|
||||
</br>
|
1
test/header.html
Normal file
1
test/header.html
Normal file
@ -0,0 +1 @@
|
||||
<title>THIS IS TTILE</title>
|
8
test/index.txt
Normal file
8
test/index.txt
Normal file
@ -0,0 +1,8 @@
|
||||
[file test/header.html]
|
||||
[h1 Hello there people]
|
||||
Okay so today we are going to go to the store and buy
|
||||
stuff. You can never even know what I am talking about
|
||||
unless you are a big old monkey with a lot of cigarettes. Do
|
||||
you even understand what I am thinking, you large donkey
|
||||
person?
|
||||
[file test/footer.html]
|
Loading…
Reference in New Issue
Block a user