cli.c - frontends - front-ends for some sites (experiment) | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
cli.c (2498B) | |
--- | |
1 #include <sys/socket.h> | |
2 #include <sys/types.h> | |
3 | |
4 #include <ctype.h> | |
5 #include <errno.h> | |
6 #include <netdb.h> | |
7 #include <stdarg.h> | |
8 #include <stdio.h> | |
9 #include <stdlib.h> | |
10 #include <string.h> | |
11 #include <time.h> | |
12 #include <unistd.h> | |
13 | |
14 #include "https.h" | |
15 #include "reddit.h" | |
16 #include "util.h" | |
17 | |
18 #define OUT(s) (fputs((s), stdout)) | |
19 #define OUTESCAPE(s) (printescape(s)) | |
20 | |
21 /* print: ignore control-characters */ | |
22 void | |
23 printescape(const char *s) | |
24 { | |
25 for (; *s; ++s) | |
26 if (!iscntrl((unsigned char)*s)) | |
27 fputc(*s, stdout); | |
28 } | |
29 | |
30 void | |
31 printitem(struct item *item) | |
32 { | |
33 if (!item || !item->title[0]) | |
34 return; | |
35 | |
36 printf("title: %s\n", item->title); | |
37 printf("url: %s\n", item->url); | |
38 printf("subreddit: %s\n", item->subreddit); | |
39 printf("author: %s\n", item->author); | |
40 printf("thumbnail: %s\n", item->thumbnail); | |
41 printf("ups: %ld\n", item->ups); | |
42 printf("downs: %ld\n", item->downs); | |
43 printf("num_comments: %ld\n", item->num_comments); | |
44 | |
45 struct tm *tm = gmtime(&(item->created_utc)); | |
46 printf("created_utc: %lld\n", (long long)item->created_utc); | |
47 printf("created_utc: %s", asctime(tm)); | |
48 | |
49 if (item->is_video) { | |
50 printf("is_video: %d\n", item->is_video); | |
51 printf("duration: %ld\n", item->duration); | |
52 printf("dash_url: %s\n", item->dash_url); | |
53 } | |
54 | |
55 printf("===\n"); | |
56 } | |
57 | |
58 int | |
59 render(struct list_response *r) | |
60 { | |
61 size_t i; | |
62 | |
63 if (pledge("stdio", NULL) == -1) { | |
64 fprintf(stderr, "pledge: %s\n", strerror(errno)); | |
65 exit(1); | |
66 } | |
67 | |
68 for (i = 0; i < r->nitems; i++) | |
69 printitem(&(r->items[i])); | |
70 | |
71 if (r->before[0]) | |
72 printf("before pagination token: %s\n", r->before); | |
73 if (r->after[0]) | |
74 printf("after pagination token: %s\n", r->after); | |
75 | |
76 return 0; | |
77 } | |
78 | |
79 static void | |
80 usage(const char *argv0) | |
81 { | |
82 fprintf(stderr, "usage: %s [subreddit]\n", argv0); | |
83 exit(1); | |
84 } | |
85 | |
86 int | |
87 main(int argc, char *argv[]) | |
88 { | |
89 struct list_response *r; | |
90 char subreddit[1024] = ""; | |
91 | |
92 if (pledge("stdio dns inet rpath unveil", NULL) == -1) { | |
93 fprintf(stderr, "pledge: %s\n", strerror(errno)); | |
94 exit(1); | |
95 } | |
96 if (unveil(TLS_CA_CERT_FILE, "r") == -1) { | |
97 fprintf(stderr, "unveil: %s\n", strerror(errno)); | |
98 exit(1); | |
99 } | |
100 if (unveil(NULL, NULL) == -1) { | |
101 fprintf(stderr, "unveil: %s\n", strerror(errno)); | |
102 exit(1); | |
103 } | |
104 | |
105 if (argc > 1) { | |
106 if (!uriencode(argv[1], subreddit, sizeof(subreddit))) | |
107 usage(argv[0]); | |
108 } | |
109 | |
110 r = reddit_list(subreddit, 100, "", ""); /* TODO: pagination */ | |
111 if (!r || r->nitems == 0) { | |
112 OUT("No items found\n"); | |
113 exit(1); | |
114 } | |
115 | |
116 render(r); | |
117 | |
118 return 0; | |
119 } |