cli.c - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       cli.c (1418B)
       ---
            1 #include <sys/types.h>
            2 
            3 #include <ctype.h>
            4 #include <err.h>
            5 #include <errno.h>
            6 #include <locale.h>
            7 #include <stdio.h>
            8 #include <stdlib.h>
            9 #include <string.h>
           10 #include <unistd.h>
           11 #include <wchar.h>
           12 
           13 #include "duckduckgo.h"
           14 #include "https.h"
           15 #include "util.h"
           16 
           17 #define OUT(s) fputs((s), stdout)
           18 #define OUTESCAPE(s) printescape((s))
           19 
           20 /* print: ignore control-characters */
           21 void
           22 printescape(const char *s)
           23 {
           24         for (; *s; ++s)
           25                 if (!iscntrl((unsigned char)*s))
           26                         fputc(*s, stdout);
           27 }
           28 
           29 int
           30 main(int argc, char *argv[])
           31 {
           32         struct duckduckgo_results *results;
           33         struct duckduckgo_result *result;
           34         char buf[512];
           35         size_t i;
           36 
           37         setlocale(LC_CTYPE, "");
           38 
           39         if (pledge("stdio dns inet rpath unveil", NULL) == -1) {
           40                 fprintf(stderr, "pledge: %s\n", strerror(errno));
           41                 exit(1);
           42         }
           43         if (unveil(TLS_CA_CERT_FILE, "r") == -1) {
           44                 fprintf(stderr, "unveil: %s\n", strerror(errno));
           45                 exit(1);
           46         }
           47         if (unveil(NULL, NULL) == -1) {
           48                 fprintf(stderr, "unveil: %s\n", strerror(errno));
           49                 exit(1);
           50         }
           51 
           52         if (argc != 2) {
           53                 fprintf(stderr, "usage: %s <search>\n", argv[0]);
           54                 exit(1);
           55         }
           56 
           57         results = duckduckgo_search(argv[1]);
           58         if (pledge("stdio", NULL) == -1)
           59                 err(1, "pledge");
           60 
           61         if (results) {
           62                 for (i = 0; i < results->nitems; i++) {
           63                         result = &(results->items[i]);
           64 
           65                         if (utf8pad(buf, sizeof(buf), result->title, 70, ' ') != -1)
           66                                 OUTESCAPE(buf);
           67                         OUT("  ");
           68                         OUTESCAPE(result->urldecoded);
           69                         OUT("\n");
           70                 }
           71         }
           72 
           73         return 0;
           74 }