aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fbwarn/src/BVGTypes.h5
-rw-r--r--fbwarn/src/parseBVG.c68
-rw-r--r--fbwarn/src/parseBVG.h1
-rw-r--r--fbwarn/src/warn.c113
-rw-r--r--fbwarn/test.bvg28
5 files changed, 156 insertions, 59 deletions
diff --git a/fbwarn/src/BVGTypes.h b/fbwarn/src/BVGTypes.h
index be7669f..95e1dd8 100644
--- a/fbwarn/src/BVGTypes.h
+++ b/fbwarn/src/BVGTypes.h
@@ -1,6 +1,11 @@
#include <raylib.h>
#include <stdbool.h>
+typedef struct BVGIMG {
+ int width;
+ int height;
+} BVGIMG;
+
typedef struct BVGRectangle {
Rectangle rayrectangle;
bool fill;
diff --git a/fbwarn/src/parseBVG.c b/fbwarn/src/parseBVG.c
index b71b55f..4209383 100644
--- a/fbwarn/src/parseBVG.c
+++ b/fbwarn/src/parseBVG.c
@@ -29,8 +29,6 @@ void BVGDrawCircle(BVGCircle *circle) {
if (circle->drawSector) {
DrawCircleSector(center, circle->radius, circle->startAngle, circle->endAngle, circle->segments, circle->color);
} else {
- printf("center: %f, %f\n", center.x, center.y);
- printf("radius: %f, color: %d\n", circle->radius, circle->color.a);
DrawCircle(circle->centerX, circle->centerY, circle->radius, circle->color);
}
}
@@ -40,6 +38,14 @@ void BVGDrawRing(BVGRing *ring) {
DrawRing(center, ring->inRadius, ring->outRadius, ring->startAngle, ring->endAngle, ring->segmets, ring->color);
}
+void BVGDrawTriangle(BVGTriangle *triangle) {
+ if (triangle->fill) {
+ DrawTriangle(triangle->corner1, triangle->corner2, triangle->corner3, triangle->color);
+ } else {
+ DrawTriangleLines(triangle->corner1, triangle->corner2, triangle->corner3, triangle->color);
+ }
+}
+
void BVGDrawText(BVGText *text) {
DrawText(text->text, text->x, text->y, text->fontSize, text->color);
}
@@ -61,9 +67,11 @@ FILE *readFile(char *path) {
char *multiToSingle(char *s) {
// allocating the size of lines is safe since characters arent added
char *midresult = malloc (strlen(s)+1);
+ char *notab = malloc(strlen(s)+1);
char *line;
midresult = replaceStr(s, "\n", "");
- return replaceStr(midresult, ", ", ",");
+ notab = replaceStr(midresult, "\t", "");
+ return replaceStr(notab, ", ", ",");
}
/*
@@ -85,7 +93,11 @@ void collectArgs(char *res[], char *call, int n) {
the res array contains only the values of each argument
*/
void orderArgs(char *res[], char *argv[], int n, char *knownArgs[]) {
+ if (argv == NULL || knownArgs == NULL)
+ exit(1);
for(int i=0; i<n; i++) {
+ if (argv[i] == NULL)
+ continue;
for(int j=0; j<n; j++) {
if (strncmp(argv[i], knownArgs[j], strlen(knownArgs[j])) == 0) {
res[j] = argv[i]+strlen(knownArgs[j])+1;
@@ -120,7 +132,6 @@ Color *parseColorFromHex(char *hex) {
*/
bool parseBoolValue(char *value) {
char *valueLower = strdup(strlwr(value));
- printf("Matching bool %s --- %s", valueLower, value);
if (strcmp(valueLower, "false") == 0) {
return false;
} else {
@@ -128,6 +139,19 @@ bool parseBoolValue(char *value) {
}
}
+BVGIMG *BVGParseIMG(char *argv[2]) {
+ BVGIMG *result = malloc(sizeof(BVGIMG));
+ size_t argN = 2;
+ char *args[argN];
+ char *knownArgs[2] = {"width", "height"};
+ orderArgs(args, argv, argN, knownArgs);
+ int width, height;
+ sscanf(args[0], "%d", &width);
+ sscanf(args[1], "%d", &height);
+ result->width=width; result->height=height;
+ return result;
+}
+
/*
Creates a BVGRectangle based on a BVG function call
*/
@@ -137,7 +161,6 @@ BVGRectangle *BVGParseRectangle(char *argv[7]) {
size_t argN = 7;
char *args[argN];
char *knownArgs[7] = {"x", "y", "width", "height", "color", "fill", "thickness"};
- //printf("118 Parsing...%s \n", args[0]);
orderArgs(args, argv, argN, knownArgs);
printf("119 Parsing...%s \n", args[0]);
int x, y, width, height, r, g, b, a;
@@ -275,6 +298,34 @@ BVGRing *BVGParseRing(char *argv[8]) {
return result;
}
+BVGTriangle *BVGParseTriangle(char *argv[8]) {
+ BVGTriangle *result = malloc(sizeof(BVGTriangle));
+ size_t argN = 8;
+ char *args[argN];
+ char *knownArgs[8] = {"x1", "y1", "x2", "y2", "x3", "y3", "fill", "color"};
+ orderArgs(args, argv, argN, knownArgs);
+ int x1, x2, x3;
+ int y1, y2, y3;
+ bool fill;
+ Color *clr;
+ sscanf(args[0], "%d", &x1);
+ sscanf(args[1], "%d", &y1);
+ sscanf(args[2], "%d", &x2);
+ sscanf(args[3], "%d", &y2);
+ sscanf(args[4], "%d", &x3);
+ sscanf(args[5], "%d", &y3);
+ fill = parseBoolValue(args[6]);
+ args[7] = args[7]+2;
+ args[7][strlen(args[7])-1] = '\0';
+ clr = parseColorFromHex(args[7]);
+ result->corner1 = (Vector2){x1, y1};
+ result->corner2 = (Vector2){x2, y2};
+ result->corner3 = (Vector2){x3, y3};
+ result->fill = fill;
+ result->color = *clr;
+ return result;
+}
+
BVGText *BVGParseText(char *argv[5]) {
BVGText *result = malloc(sizeof(BVGText));
size_t argN = 5;
@@ -347,6 +398,13 @@ void matchFunctionCall(char *call) {
BVGRing *ring = malloc(sizeof(BVGRing));
ring = BVGParseRing(argv);
BVGDrawRing(ring);
+ } else if (strcmp(function, "triangle") == 0) {
+ char *argv[8];
+ call = call+strlen("triangle (");
+ collectArgs(argv, call, 8);
+ BVGTriangle *triangle = malloc(sizeof(BVGTriangle));
+ triangle = BVGParseTriangle(argv);
+ BVGDrawTriangle(triangle);
} else if (strcmp(function, "text") == 0) {
char *argv[5];
call = call+strlen("text (");
diff --git a/fbwarn/src/parseBVG.h b/fbwarn/src/parseBVG.h
index ea465ca..bf833cf 100644
--- a/fbwarn/src/parseBVG.h
+++ b/fbwarn/src/parseBVG.h
@@ -13,6 +13,7 @@ Color *parseColorFromHex(char *hex);
bool parseBoolValue(char *hex);
// Shape functions
+BVGIMG *BVGParseIMG(char *argv[2]);
BVGRectangle *BVGParseRectangle(char *argv[7]);
void BVGDrawRectangle(BVGRectangle *rectangle);
BVGRoundedRectangle *BVGParseRoundedRectangle(char *argv[9]);
diff --git a/fbwarn/src/warn.c b/fbwarn/src/warn.c
index db2750d..a495f6b 100644
--- a/fbwarn/src/warn.c
+++ b/fbwarn/src/warn.c
@@ -1,76 +1,81 @@
#include "raylib.h"
#include "parseBVG.h"
+#include "extString.h"
+#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
- char *rectA, *rectB, *rectC, *rectD, *rectAFree, *rectBFree, *rectCFree, *rectDFree, *singleA, *singleB, *singleC, *singleD;
- char *rectE, *rectF, *rectEFree, *rectFFree, *singleE, *singleF;
- rectAFree = rectA = strdup("rectangle (x=10,y=20,\nwidth=100,\nheight=100,\ncolor='#9787CFFF',\nfill=true,\nthickness=1.0)\n");
- if (rectA == NULL)
- return 1;
- singleA = multiToSingle(rectA);
- free(rectAFree);
-
- rectBFree = rectB = strdup("rectangle (x=130,y=160,\nwidth=100,\nheight=60,\ncolor='#88C2B1FF',\nfill=false,\nthickness=5.0)\n");
- if (rectB == NULL)
- return 1;
- singleB = multiToSingle(rectB);
- free(rectBFree);
+ FILE *bvgfile = readFile("./test.bvg");
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t nread = 0;
+ ssize_t totallinesize = 0;
+ ssize_t funcCount = 0;
+ int inComment = 0;
+ char *funcline = strdup("");
+ char **funcs = malloc(1*sizeof(char));
+
+ while ((nread = getline(&line, &len, bvgfile)) != -1) {
+ if (strstr(line, "/*")) {
+ inComment += 1;
+ continue;
+ }
+ if (strstr(line, "*/")) {
+ inComment -= 1;
+ continue;
+ }
+ if (inComment != 0 || strstr(line, "//") || line[0] == '\n')
+ continue;
+ void *newfuncline = realloc(funcline, sizeof(char)*(strlen(funcline)+strlen(line)+1));
+ if (newfuncline)
+ funcline = newfuncline;
+ else
+ exit(2);
+ totallinesize=totallinesize+nread;
+ sprintf(funcline, "%s%s", funcline, line);
+ if (line[nread-2] == ')') {
+ funcCount += 1;
+ void *newfuncs = realloc(funcs, sizeof(char)*(sizeof(funcs)+1+strlen(funcline)*2));
+ if (newfuncs)
+ funcs = newfuncs;
+ else
+ exit(2);
+ funcs[funcCount-1]=strdup(funcline);
+ totallinesize = 0;
+ free(funcline);
+ funcline = strdup("");
+ }
+ }
+ free(line);
- rectCFree = rectC = strdup("circlesegment (x=300, y=200,radius=100,color='#BE79A7FF',startangle=0.0,endangle=90.0,segments=10)");
- if (rectC == NULL)
- return 1;
- singleC = multiToSingle(rectC);
- printf("SingleC %s", rectC);
- free(rectCFree);
+ for (int i = 0; i<funcCount; i++) {
+ printf("%s", funcs[i]);
+ }
- rectDFree = rectD = strdup("ring (x=300,y=50,innerradius=20,outerradius=30,startangle=0.0,endangle=360.0,segments=10,color='#DD98E5FF')");
- // rectDFree = rectD = strdup("text (text='haiii :3',x=300,y=10,size=50,color='#DD98E5FF')");
- if (rectD == NULL)
- return 1;
- singleD = multiToSingle(rectD);
- free(rectDFree);
+ fclose(bvgfile);
- rectEFree = rectE = strdup("roundedrectangle (x=90,y=300,\nwidth=92,\nheight=20,\ncolor='#BE79A7FF',\nfill=false,\nthickness=3.0,roundness=5.0,segments=100)\n");
- if (rectE == NULL)
- return 1;
- singleE = multiToSingle(rectE);
- free(rectEFree);
+ char *call = strdup(multiToSingle(funcs[0]));
+ char *args[2];
+ call=call+strlen("IMG (");
+ char *callTrim = trim(call);
+ callTrim[strlen(callTrim)-1]='\0';
+ collectArgs(args, callTrim, 2);
+ BVGIMG *imgsize = BVGParseIMG(args);
- rectFFree = rectF = strdup("circle (x=700,y=300,radius=90.0,color='#7676DCFF')\n");
- if (rectF == NULL)
- return 1;
- singleF = multiToSingle(rectF);
- free(rectFFree);
-
-
- InitWindow (800, 400, ":3");
+ InitWindow (imgsize->width, imgsize->height, ":3");
while (!WindowShouldClose ()) {
BeginDrawing ();
ClearBackground (RAYWHITE);
- char *parseA = strdup(singleA);
- matchFunctionCall(parseA);
-
- char *parseB = strdup(singleB);
- matchFunctionCall(parseB);
-
- char *parseC = strdup(singleC);
- matchFunctionCall(parseC);
- char *parseD = strdup(singleD);
- matchFunctionCall(parseD);
-
- char *parseE = strdup(singleE);
- matchFunctionCall(parseE);
+ for (int i = 0; i<funcCount; i++) {
+ matchFunctionCall(multiToSingle(funcs[i]));
+ }
- char *parseF = strdup(singleF);
- matchFunctionCall(parseF);
-
char *text = malloc(strlen("100")*100);
sprintf(text, "%d", GetFPS());
DrawText(text, 2, 2, 20, MAROON);
diff --git a/fbwarn/test.bvg b/fbwarn/test.bvg
new file mode 100644
index 0000000..b2e125d
--- /dev/null
+++ b/fbwarn/test.bvg
@@ -0,0 +1,28 @@
+// Single line comments are started with //
+
+/*
+A multiline comment can be
+done in this fashion
+basically like C
+*/
+
+
+// The IMG function is always required
+// it initializes the image with its size
+IMG (width=800, height=600)
+
+rectangle (x=0,y=0,width=800,height=100,fill=true,color="#E40303FF",thickness=1.0)
+rectangle (x=0,y=100,width=800,height=100,fill=true,color="#FF8C00FF",thickness=1.0)
+rectangle (x=0,y=200,width=800,height=100,fill=true,color="#FFED00FF",thickness=1.0)
+rectangle (x=0,y=300,width=800,height=100,fill=true,color="#008026FF",thickness=1.0)
+rectangle (x=0,y=400,width=800,height=100,fill=true,color="#24408EFF",thickness=1.0)
+rectangle (x=0,y=500,width=800,height=100,fill=true,color="#732982FF",thickness=1.0)
+
+triangle (x1=100,y1=0,x2=100,y2=600,x3=400,y3=300,fill=true,color="#000000FF")
+rectangle (x=50,y=0,width=50,height=600,fill=true,color="#000000FF")
+triangle (x1=50,y1=0,x2=50,y2=600,x3=350,y3=300,fill=true,color="#613915FF")
+rectangle (x=0,y=0,width=50,height=600,fill=true,color="#613915FF")
+triangle (x1=0,y1=0,x2=0,y2=600,x3=300,y3=300,fill=true,color="#74D7EEFF")
+triangle (x1=0,y1=50,x2=0,y2=550,x3=250,y3=300,fill=true,color="#FFAFC8FF")
+triangle (x1=0,y1=100,x2=0,y2=500,x3=200,y3=300,fill=true,color="#FFFFFFFF")
+