#include #include #include #include #define VERSION "0.43" typedef struct { int position; int size; char *data; } Buffer; struct closeThings { bool Bold; bool Italics; bool Strikethrough; bool Monospace; bool Underline; }; void reallocBuffer(Buffer *buffer) { buffer->size += 1024; buffer->data = realloc(buffer->data,buffer->size); if (!buffer->data) { printf("Error reallocing buffer!"); exit(1); } } void appendToBuffer(Buffer *buffer, Buffer *dataBuffer) { for (int i = 0;i < dataBuffer->size;i++) { if (dataBuffer->data[i] == 0x00) break; /* stop on NULL */ buffer->data[buffer->position] = dataBuffer->data[i]; buffer->position++; if (buffer->position > buffer->size-64) { reallocBuffer(buffer); } } } int main(int argc, char **argv) { if (argc > 1) { printf("Reeses static site generator V %s\n",VERSION); printf(" Usage:\n"); printf(" cat coolthing.txt | staticSiteGen > coolthing.html\n"); printf(" Special characters:\n"); printf(" * = bold\n"); printf(" / = italic\n"); printf(" ` = monospace\n"); printf(" ~ = strikethrough\n"); printf(" _ = underline\n"); printf(" markdown style links are available\n"); printf(" you can escape any character with \\ and it will not be formatted\n"); exit(1); } Buffer buffer; buffer.size = 1024; buffer.data = calloc(buffer.size,sizeof(char)); buffer.position = 0; char character = 'a'; bool skipChar = false; struct closeThings close; while(character != EOF) { character = fgetc(stdin); if (buffer.position > buffer.size-64) { reallocBuffer(&buffer); } if (skipChar) { skipChar = false; buffer.data[buffer.position] = character; buffer.position++; continue; } else if (character == '\\') { skipChar = true; } else if (character == '*') { if (close.Bold) { appendToBuffer(&buffer,&(Buffer){0,4,""}); close.Bold = false; } else { appendToBuffer(&buffer,&(Buffer){0,3,""}); close.Bold = true; } } else if (character == '/') { if (close.Italics) { appendToBuffer(&buffer,&(Buffer){0,4,""}); close.Italics = false; } else { appendToBuffer(&buffer,&(Buffer){0,3,""}); close.Italics = true; } } else if (character == '`') { if (close.Monospace) { appendToBuffer(&buffer,&(Buffer){0,7,""}); close.Monospace = false; } else { appendToBuffer(&buffer,&(Buffer){0,6,""}); close.Monospace = true; } } else if (character == '~') { if (close.Strikethrough) { appendToBuffer(&buffer,&(Buffer){0,6,""}); close.Strikethrough = false; } else { appendToBuffer(&buffer,&(Buffer){0,5,""}); close.Strikethrough = true; } } else if (character == '_') { if (close.Underline) { appendToBuffer(&buffer,&(Buffer){0,6,""}); close.Underline = false; } else { appendToBuffer(&buffer,&(Buffer){0,5,""}); close.Underline = true; } } else if (character == '[') { Buffer linkTxt = {0,256,calloc(256,sizeof(char))}; Buffer linkLoc = {0,256,calloc(256,sizeof(char))}; Buffer linkOut = {0,256,calloc(256,sizeof(char))}; appendToBuffer(&linkOut,&(Buffer){0,10,""}); appendToBuffer(&linkOut,&linkTxt); appendToBuffer(&linkOut,&(Buffer){0,4,""}); appendToBuffer(&buffer,&linkOut); free(linkOut.data); free(linkTxt.data); free(linkLoc.data); } else if (character == '\n') { appendToBuffer(&buffer,&(Buffer){0,5,"
\n"}); } else { buffer.data[buffer.position] = character; buffer.position++; } } int end = buffer.position-1; buffer.position = 0; for (int i = 0;i < end;i++) { printf("%c",buffer.data[i]); } return 0; }