libre_redirect.c (2482B)
1 #include <stdio.h> 2 #include <string.h> 3 4 #include "../strings/strings.h" 5 6 #define LIBRE_N 50 7 8 /* Inspired by https://libredirect.github.io/, but in C. */ 9 int libre_redirect(const char* uri, char* output) 10 { 11 int len_uri = strlen(uri); 12 int len_output = strlen(output); 13 14 if ((len_output - len_uri) < LIBRE_N) { 15 fprintf(stderr, "Not enough memory\n"); 16 return 1; // not enough memory. 17 } else { 18 char* annoying_sites[] = { 19 "https://www.reddit.com", 20 "https://vitalik.ca", 21 "https://www.youtube.com", 22 // "https://google.com", 23 "https://medium.com", 24 "https://translate.google.com", 25 "https://www.bloomberg.com", 26 "https://www.royalroad.com", 27 "https://genius.com", 28 // "https://twitter.com" 29 // "https://archive.org", 30 // "https://twitter.com" 31 }; 32 33 char* alternatives[] = { 34 "https://redlib.ducks.party", 35 // previously: "https://old.reddit.com", "https://teddit.nunosempere.com", 36 // https://github.com/redlib-org/redlib-instances/blob/main/instances.md 37 "https://vitalik.eth.limo", 38 "https://invidious.private.coffee", 39 // "https://search.nunosempere.com", 40 "https://scribe.rip", 41 "https://translate.riverside.rocks", 42 "https://archive.ph/https://www.bloomberg.com", 43 "https://royalread.nunosempere.com", 44 "https://dumb.vern.cc", 45 "https://example.com" 46 // "https://wayback.nunosempere.com", 47 // "https://nitter.net" 48 }; 49 50 int len = sizeof(annoying_sites) / sizeof(annoying_sites[0]); 51 for (int i = 0; i < len; i++) { 52 str_init(output, len_output); 53 int replace_check = str_replace_start(uri, annoying_sites[i], 54 alternatives[i], output); 55 switch (replace_check) { 56 case 0: // no match found 57 break; 58 case 1: // str_replace_start somehow failed 59 fprintf(stderr, "str_replace_start failed\n"); 60 return 1; 61 break; 62 case 2: // match succeeded 63 return 2; 64 break; 65 default: 66 fprintf(stderr, "Unreachable state\n"); 67 } 68 } 69 strcpy(output, uri); 70 } 71 return 0; 72 }