aboutsummaryrefslogtreecommitdiff
path: root/fbwarn/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--fbwarn/src/extString.c40
-rw-r--r--fbwarn/src/extString.h5
-rw-r--r--fbwarn/src/parseBVG.c64
-rw-r--r--fbwarn/src/parseBVG.h28
-rw-r--r--fbwarn/src/warn.c6
5 files changed, 107 insertions, 36 deletions
diff --git a/fbwarn/src/extString.c b/fbwarn/src/extString.c
index abe6728..361afa7 100644
--- a/fbwarn/src/extString.c
+++ b/fbwarn/src/extString.c
@@ -2,21 +2,21 @@
#include <string.h>
#include <ctype.h>
-char *strlwr(char *str)
+char *strlwr(char *s)
{
- unsigned char *p = (unsigned char *)str;
+ unsigned char *p = (unsigned char *)s;
while (*p) {
*p = tolower((unsigned char)*p);
p++;
}
- return str;
+ return s;
}
-char *trim(char *str)
+char *trim(char *s)
{
- char *result = strdup(str);
+ char *result = strdup(s);
char *end;
while(isspace((unsigned char)*result)) result++;
@@ -32,3 +32,33 @@ char *trim(char *str)
return result;
}
+
+char *replaceStr(char *s, char *old, char *replace) {
+ char* result;
+ int i, cnt = 0;
+ size_t newSize = strlen(replace);
+ size_t oldSize = strlen(old);
+
+ for (i = 0; s[i] != '\0'; i++) {
+ if (strstr(&s[i], old) == &s[i]) {
+ cnt++;
+ i += oldSize - 1;
+ }
+ }
+
+ result = (char*)malloc(i + cnt * (newSize - oldSize) + 1);
+
+ i = 0;
+ while (*s) {
+ if (strstr(s, old) == s) {
+ strcpy(&result[i], replace);
+ i += newSize;
+ s += oldSize;
+ }
+ else
+ result[i++] = *s++;
+ }
+
+ result[i] = '\0';
+ return result;
+};
diff --git a/fbwarn/src/extString.h b/fbwarn/src/extString.h
index 19a97c6..66149f1 100644
--- a/fbwarn/src/extString.h
+++ b/fbwarn/src/extString.h
@@ -1,2 +1,3 @@
-char *strlwr(char *);
-char *trim(char *);
+char *strlwr(char *s);
+char *trim(char *s);
+char *replaceStr(char *s, char *old, char *replace);
diff --git a/fbwarn/src/parseBVG.c b/fbwarn/src/parseBVG.c
index 94795f8..b71b55f 100644
--- a/fbwarn/src/parseBVG.c
+++ b/fbwarn/src/parseBVG.c
@@ -35,6 +35,11 @@ void BVGDrawCircle(BVGCircle *circle) {
}
}
+void BVGDrawRing(BVGRing *ring) {
+ Vector2 center = {ring->centerX, ring->centerY};
+ DrawRing(center, ring->inRadius, ring->outRadius, ring->startAngle, ring->endAngle, ring->segmets, ring->color);
+}
+
void BVGDrawText(BVGText *text) {
DrawText(text->text, text->x, text->y, text->fontSize, text->color);
}
@@ -53,15 +58,12 @@ FILE *readFile(char *path) {
Converts a multiline function
call into a single line call
*/
-char *multiToSingle(char *lines) {
+char *multiToSingle(char *s) {
// allocating the size of lines is safe since characters arent added
- char *result = malloc (strlen(lines)+1);
+ char *midresult = malloc (strlen(s)+1);
char *line;
- while ((line = strsep(&lines, "\n")) != NULL)
- sprintf(result, "%s%s", result, line);
-
- free(line);
- return result;
+ midresult = replaceStr(s, "\n", "");
+ return replaceStr(midresult, ", ", ",");
}
/*
@@ -246,6 +248,33 @@ BVGCircle *BVGParseCircleSegment(char *argv[7]) {
return result;
}
+BVGRing *BVGParseRing(char *argv[8]) {
+ BVGRing *result = malloc(sizeof(BVGRing));
+ size_t argN = 8;
+ char *args[argN];
+ char *knownArgs[8] = {"x", "y", "innerradius", "outerradius", "startangle", "endangle", "segments", "color"};
+ orderArgs(args, argv, argN, knownArgs);
+ int x, y, segments;
+ float innerRadius, outerRadius, startAngle, endAngle;
+ Color *clr;
+ sscanf(args[0], "%d", &x);
+ sscanf(args[1], "%d", &y);
+ sscanf(args[2], "%f", &innerRadius);
+ sscanf(args[3], "%f", &outerRadius);
+ sscanf(args[4], "%f", &startAngle);
+ sscanf(args[5], "%f", &endAngle);
+ sscanf(args[6], "%d", &segments);
+ args[7] = args[7]+2;
+ args[7][strlen(args[7])-1] = '\0';
+ clr = parseColorFromHex(args[7]);
+ result->centerX=x; result->centerY=y;
+ result->inRadius=innerRadius; result->outRadius=outerRadius;
+ result->startAngle=startAngle; result->endAngle=endAngle;
+ result->segmets=segments;
+ result->color=*clr;
+ return result;
+}
+
BVGText *BVGParseText(char *argv[5]) {
BVGText *result = malloc(sizeof(BVGText));
size_t argN = 5;
@@ -275,7 +304,7 @@ BVGText *BVGParseText(char *argv[5]) {
/*
Takes a BVG function call and calls the according C function
*/
-void matchFunctionCall(char *call, void *ret) {
+void matchFunctionCall(char *call) {
printf("Matching %s\n", call);
char *funcCall = strdup(call);
char *funcName = strsep(&funcCall, "(");
@@ -284,12 +313,12 @@ void matchFunctionCall(char *call, void *ret) {
printf("Got function %s\n", function);
call[strlen(call)-1]='\0';
if (strcmp(function, "rectangle") == 0) {
- char *argv[7];
- call = call+strlen("rectangle (");
- collectArgs(argv, call, 7);
- BVGRectangle *rect = malloc(sizeof(BVGRectangle));
- rect = BVGParseRectangle(argv);
- BVGDrawRectangle(rect);
+ char *argv[7];
+ call = call+strlen("rectangle (");
+ collectArgs(argv, call, 7);
+ BVGRectangle *rect = malloc(sizeof(BVGRectangle));
+ rect = BVGParseRectangle(argv);
+ BVGDrawRectangle(rect);
} else if (strcmp(function, "roundedrectangle") == 0) {
char *argv[9];
call = call+strlen("roundedrectangle (");
@@ -311,6 +340,13 @@ void matchFunctionCall(char *call, void *ret) {
BVGCircle *circle = malloc(sizeof(BVGCircle));
circle = BVGParseCircleSegment(argv);
BVGDrawCircle(circle);
+ } else if (strcmp(function, "ring") == 0) {
+ char *argv[8];
+ call = call+strlen("ring (");
+ collectArgs(argv, call, 8);
+ BVGRing *ring = malloc(sizeof(BVGRing));
+ ring = BVGParseRing(argv);
+ BVGDrawRing(ring);
} 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 b349687..ea465ca 100644
--- a/fbwarn/src/parseBVG.h
+++ b/fbwarn/src/parseBVG.h
@@ -4,18 +4,20 @@
#include "raylib.h"
#include "BVGTypes.h"
-FILE *readFile(char *);
-char *multiToSingle(char *);
-void matchFunctionCall(char *);
-void collectArgs(char *[], char *, int);
-void orderArgs(char *[], char *[], int, char *[]);
-Color *parseColorFromHex(char *);
-bool parseBoolValue(char *);
+FILE *readFile(char *path);
+char *multiToSingle(char *s);
+void matchFunctionCall(char *call);
+void collectArgs(char *res[], char *call, int n);
+void orderArgs(char *res[], char *argv[], int n, char *knownArgs[]);
+Color *parseColorFromHex(char *hex);
+bool parseBoolValue(char *hex);
// Shape functions
-BVGRectangle *BVGParseRectangle(char *[7]);
-void BVGDrawRectangle(BVGRectangle*);
-BVGRoundedRectangle *BVGParseRoundedRectangle(char *[9]);
-void BVGDrawRoundedRectangle(BVGRoundedRectangle*);
-BVGCircle *BVGParseCircle(char *[4]);
-void BVGDrawCircle(BVGCircle);
+BVGRectangle *BVGParseRectangle(char *argv[7]);
+void BVGDrawRectangle(BVGRectangle *rectangle);
+BVGRoundedRectangle *BVGParseRoundedRectangle(char *argv[9]);
+void BVGDrawRoundedRectangle(BVGRoundedRectangle *rectangle);
+BVGCircle *BVGParseCircle(char *argv[4]);
+void BVGDrawCircle(BVGCircle *circle);
+BVGRing *BVGParseRing(char *argv[8]);
+void BVGDrawRing(BVGRing *ring);
diff --git a/fbwarn/src/warn.c b/fbwarn/src/warn.c
index e442643..db2750d 100644
--- a/fbwarn/src/warn.c
+++ b/fbwarn/src/warn.c
@@ -19,13 +19,15 @@ int main(void) {
singleB = multiToSingle(rectB);
free(rectBFree);
- rectCFree = rectC = strdup("circlesegment (x=300,y=200,radius=100,color='#BE79A7FF',startangle=0.0,endangle=90.0,segments=10)");
+ 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);
- rectDFree = rectD = strdup("text (text='haiii :3',x=300,y=10,size=50,color='#DD98E5FF')");
+ 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);