@ -0,0 +1 @@ | |||||
/.ccls-cache/ |
@ -0,0 +1,18 @@ | |||||
## | |||||
# massurl | |||||
# | |||||
# @file Makefile | |||||
# @version 0.1 | |||||
VERSION = 0.1 | |||||
CC = gcc | |||||
CFLAGS = -g -w | |||||
SRC = linkedlist.c urlparse.c tree.c massurl.c | |||||
all: massurl | |||||
massurl: $(SRC) | |||||
${CC} $(SRC) -o massurl $(CFLAGS) | |||||
# end |
@ -0,0 +1,45 @@ | |||||
/* | |||||
* linkedlist.c | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include "linkedlist.h" | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <stdio.h> | |||||
LinkedList *linkedlistalloc(void){ | |||||
return (LinkedList *) malloc(sizeof(LinkedList)); | |||||
} | |||||
int linkedlistfind(LinkedList *p, char *str) { | |||||
int count = 0; | |||||
while(p != NULL){ | |||||
if(!strcmp(p->data, str)) | |||||
return count; | |||||
count++; | |||||
p = p->next; | |||||
} | |||||
return -1; | |||||
} | |||||
LinkedList *linkedlistadd(LinkedList *p, char *data){ | |||||
if(p == NULL){ | |||||
p = linkedlistalloc(); | |||||
p->next = NULL; | |||||
p->data = data; | |||||
}else | |||||
p->next = linkedlistadd(p->next, data); | |||||
return p; | |||||
} | |||||
void linkedlistprint(LinkedList *p, FILE *out){ | |||||
if(p != NULL){ | |||||
(p->data == NULL) ? fprintf(out, "NULL") : fprintf(out, "%s", p->data); | |||||
(p->next == NULL) ? : fprintf(out, "%c",'&'); | |||||
linkedlistprint(p->next, out); | |||||
} | |||||
} |
@ -0,0 +1,22 @@ | |||||
/* | |||||
* linkedlist.h | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#ifndef linkedlist_h | |||||
#define linkedlist_h | |||||
#include <stdio.h> | |||||
typedef struct { | |||||
struct linkedlist *next; | |||||
char *data; | |||||
} LinkedList; | |||||
LinkedList *linkedlistalloc(void); | |||||
int linkedlistfind(LinkedList *p, char *str); | |||||
LinkedList*linkedlistadd(LinkedList *p, char *data); | |||||
void linkedlistprint(LinkedList *p, FILE *out); | |||||
#endif /* Symbol’s value as variable is void: \. */ |
@ -0,0 +1,68 @@ | |||||
/* | |||||
* massurl.c | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include <stdio.h> | |||||
#include "urlparse.h" | |||||
#include "tree.h" | |||||
#include "strings.h" | |||||
#define MAXURL 100000 | |||||
static void usage(void){ | |||||
fputs("\n", stderr); | |||||
} | |||||
enum outformat{ PLAIN = 01 }; | |||||
int main(int argc, char *argv[]) { | |||||
FILE *fin = stdin, *fout = stdout; | |||||
char *param, urlstr[MAXURL]; | |||||
while(--argc > 0){ | |||||
param= *++argv; | |||||
if(param[0] == '-'){ | |||||
param++; | |||||
argc--; | |||||
switch(*param){ | |||||
case 'o': | |||||
if ((fout = fopen(*++argv, "w")) == NULL) { | |||||
fprintf(stderr, "Can't open output file for writing.\n"); | |||||
return 1; | |||||
} | |||||
if(ferror(fout)){ | |||||
fprintf(stderr, "Can't open output file for writing.\n"); | |||||
return 1; | |||||
} | |||||
break; | |||||
default: | |||||
fprintf(stderr, "Parameter -%c does not exist!", *param); | |||||
} | |||||
}else{ | |||||
if((fin = fopen(param, "r")) == NULL){ | |||||
fprintf(stderr, "Can't open file %s\n", param); | |||||
return 1; | |||||
} | |||||
} | |||||
} | |||||
TreeNode *urltree = treealloc(); | |||||
URL *url; | |||||
while(fgets(urlstr, MAXURL, fin) != NULL){ | |||||
if((url = parseurl(urlstr)) == NULL){ | |||||
fprintf(stderr, "Malformed URL %s", urlstr); | |||||
continue; | |||||
} | |||||
if(urltree->path == NULL){ | |||||
urltree->path = url->base; | |||||
urltree->params = url->params; | |||||
}else{ | |||||
urltree = addtree(urltree, url); | |||||
} | |||||
} | |||||
printtree(urltree, fout); | |||||
return 0; | |||||
} |
@ -0,0 +1,8 @@ | |||||
http://test.com?param4=var4 | |||||
http://test.com?param3=var3 | |||||
http://abc.com?abcpar=123&asdasd=asdas | |||||
http://abc.com?abcpar123=123 | |||||
http://test.com/path1?param3=var3 | |||||
http://test.com/path1?param1=var2¶m2=var2 | |||||
http://bc.com | |||||
http://test.com?param1=var2¶m2=var2 |
@ -0,0 +1,51 @@ | |||||
/* | |||||
* tree.c | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include "tree.h" | |||||
#include "linkedlist.h" | |||||
#include "urlparse.h" | |||||
#include <stdlib.h> | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
TreeNode *addtree(TreeNode *p, URL *url) { | |||||
if (p == NULL) { | |||||
TreeNode *newnode = treealloc(); | |||||
newnode->path = url->base; | |||||
newnode->params = url->params; | |||||
newnode->left = newnode->right = NULL; | |||||
return newnode; | |||||
} | |||||
int strdiff = strcmp(url->base, p->path); | |||||
if (!strdiff) { | |||||
while(url->params != NULL){ | |||||
if(p->params == NULL || linkedlistfind(p->params, url->params->data) == -1){ | |||||
p->params = linkedlistadd(p->params, url->params->data); | |||||
} | |||||
url->params = url->params->next; | |||||
} | |||||
} else if (strdiff < 0) { | |||||
p->left = addtree(p->left, url); | |||||
} else { | |||||
p->right = addtree(p->right, url); | |||||
} | |||||
return p; | |||||
} | |||||
TreeNode *treealloc(void){ | |||||
return (TreeNode *) malloc(sizeof(TreeNode)); | |||||
} | |||||
void printtree(TreeNode *root, FILE *out){ | |||||
if(root != NULL){ | |||||
printtree(root->left, out); | |||||
fprintf(out, "%s ", root->path); | |||||
linkedlistprint(root->params, out); | |||||
fprintf(out, "%c", '\n'); | |||||
printtree(root->right, out); | |||||
} | |||||
} |
@ -0,0 +1,25 @@ | |||||
/* | |||||
* tree.h | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include "urlparse.h" | |||||
#include <stdio.h> | |||||
#ifndef tree_h | |||||
#define tree_h | |||||
typedef struct { | |||||
char *path; | |||||
LinkedList *params; | |||||
struct tnode *left; | |||||
struct tnode *right; | |||||
} TreeNode; | |||||
TreeNode *addtree(TreeNode *root, URL *url); | |||||
TreeNode *treealloc(void); | |||||
void printtree(TreeNode *root, FILE *out); | |||||
#endif /* Symbol’s value as variable is void: \. */ |
@ -0,0 +1,86 @@ | |||||
/* | |||||
* urlparse.c | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include "urlparse.h" | |||||
#include "linkedlist.h" | |||||
#include <stdlib.h> | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
URL *parseurl(char *url) { | |||||
URL *urlp = urlalloc(); | |||||
urlp->params = NULL; | |||||
short stage = 0; /* var to keep track of where we are in url */ | |||||
int counter = 0; | |||||
while (*url != '\0' && *url != '\n') { | |||||
switch (*url++) { | |||||
case ':': | |||||
if (stage == 0) { | |||||
urlp->https = *(url - 2) == 's'; | |||||
if (*(url + 1) == '\0' || *url == '\0' || *url == '\n') /* weird stuff would happen with strings like "http:" */ | |||||
return NULL; | |||||
url += 2; /* Skip the // after the :*/ | |||||
stage = 1; | |||||
counter+=4; | |||||
} | |||||
break; | |||||
case '?': | |||||
if (stage == 1) { | |||||
urlp->base = | |||||
(char *)malloc(counter); /* +1 for the '\0' in the end */ | |||||
strncpy(urlp->base, url - counter, counter - 1); | |||||
stage = 2; | |||||
counter = 1; | |||||
} else { | |||||
return NULL; | |||||
} | |||||
break; | |||||
case '=': | |||||
if (stage == 2) { | |||||
char *foo; | |||||
foo = (char *)malloc(counter); | |||||
strncpy(foo, url - counter, counter-1); | |||||
counter = 1; | |||||
if (urlp->params == NULL){ | |||||
urlp->params = linkedlistalloc(); | |||||
urlp->params->data = foo; | |||||
}else | |||||
urlp->params = linkedlistadd(urlp->params, foo); | |||||
while(*url != '&' && *url != '\0' && *url != '\n') | |||||
url++; | |||||
url++; | |||||
} else { | |||||
return NULL; | |||||
} | |||||
break; | |||||
default: | |||||
counter++; | |||||
break; | |||||
} | |||||
} | |||||
switch(stage){ | |||||
case 0: | |||||
return NULL; | |||||
break; | |||||
case 1: | |||||
urlp->base = (char *)malloc(counter); /* +1 for the '\0' in the end */ | |||||
strncpy(urlp->base, url - (counter-1), counter - 1); | |||||
break; | |||||
case 2: | |||||
break; | |||||
default: | |||||
return NULL; | |||||
} | |||||
return urlp; | |||||
} | |||||
URL *urlalloc(void) { return (URL *)malloc(sizeof(URL)); } |
@ -0,0 +1,22 @@ | |||||
/* | |||||
* urlparse.h | |||||
* | |||||
* Created by Yigit Colakoglu on 07/06/2021. | |||||
* Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. | |||||
*/ | |||||
#include "linkedlist.h" | |||||
#ifndef urlparse_h | |||||
#define urlparse_h | |||||
typedef struct{ | |||||
unsigned int https : 1; | |||||
char *base; | |||||
LinkedList *params; | |||||
} URL; | |||||
URL *parseurl(char *urlstr); | |||||
URL *urlalloc(void); | |||||
#endif /* Symbol’s value as variable is void: \. */ |