rosenrot-browser

A hackable browser based on Webkitgtk
Log | Files | Refs | README

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 }