Mercurial > paster
annotate util.c @ 85:478d96a4b039 default tip @
pasterd: use a thread as more portable
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 17 Mar 2023 11:43:36 +0100 |
parents | 52029a52a385 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * util.c -- various utilities | |
3 * | |
72
1a98bc0daa49
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
77
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
5 * |
0 | 6 * Permission to use, copy, modify, and/or distribute this software for any |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
77
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
9 * |
0 | 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <assert.h> | |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
20 #include <ctype.h> |
0 | 21 #include <errno.h> |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
22 #include <limits.h> |
0 | 23 #include <stdarg.h> |
1
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
24 #include <stdio.h> |
0 | 25 #include <stdlib.h> |
26 #include <string.h> | |
5
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
27 #include <time.h> |
0 | 28 |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
29 #include "config.h" |
79
52029a52a385
pasterd: revert using ktemplate
David Demelier <markand@malikania.fr>
parents:
78
diff
changeset
|
30 #include "paste.h" |
0 | 31 #include "util.h" |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
32 |
77
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
33 const char * const languages[] = { |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
34 "nohighlight", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
35 "1c", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
36 "abnf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
37 "accesslog", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
38 "actionscript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
39 "ada", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
40 "apache", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
41 "applescript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
42 "arduino", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
43 "armasm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
44 "asciidoc", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
45 "aspectj", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
46 "autohotkey", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
47 "autoit", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
48 "avrasm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
49 "awk", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
50 "axapta", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
51 "bash", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
52 "basic", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
53 "bnf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
54 "brainfuck", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
55 "cal", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
56 "capnproto", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
57 "ceylon", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
58 "clean", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
59 "clojure", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
60 "clojure-repl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
61 "cmake", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
62 "coffeescript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
63 "coq", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
64 "cos", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
65 "cpp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
66 "crmsh", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
67 "crystal", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
68 "cs", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
69 "csp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
70 "css", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
71 "dart", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
72 "delphi", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
73 "diff", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
74 "django", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
75 "d", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
76 "dns", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
77 "dockerfile", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
78 "dos", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
79 "dsconfig", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
80 "dts", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
81 "dust", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
82 "ebnf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
83 "elixir", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
84 "elm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
85 "erb", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
86 "erlang", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
87 "erlang-repl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
88 "excel", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
89 "fix", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
90 "flix", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
91 "fortran", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
92 "fsharp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
93 "gams", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
94 "gauss", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
95 "gcode", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
96 "gherkin", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
97 "glsl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
98 "go", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
99 "golo", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
100 "gradle", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
101 "groovy", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
102 "haml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
103 "handlebars", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
104 "haskell", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
105 "haxe", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
106 "hsp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
107 "htmlbars", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
108 "http", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
109 "hy", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
110 "inform7", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
111 "ini", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
112 "irpf90", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
113 "java", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
114 "javascript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
115 "jboss-cli", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
116 "json", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
117 "julia", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
118 "julia-repl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
119 "kotlin", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
120 "lasso", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
121 "ldif", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
122 "leaf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
123 "less", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
124 "lisp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
125 "livecodeserver", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
126 "livescript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
127 "llvm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
128 "lsl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
129 "lua", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
130 "makefile", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
131 "markdown", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
132 "mathematica", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
133 "matlab", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
134 "maxima", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
135 "mel", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
136 "mercury", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
137 "mipsasm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
138 "mizar", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
139 "mojolicious", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
140 "monkey", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
141 "moonscript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
142 "n1ql", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
143 "nginx", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
144 "nimrod", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
145 "nix", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
146 "nsis", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
147 "objectivec", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
148 "ocaml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
149 "openscad", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
150 "oxygene", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
151 "parser3", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
152 "perl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
153 "pf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
154 "php", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
155 "pony", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
156 "powershell", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
157 "processing", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
158 "profile", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
159 "prolog", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
160 "protobuf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
161 "puppet", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
162 "purebasic", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
163 "python", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
164 "q", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
165 "qml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
166 "rib", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
167 "r", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
168 "roboconf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
169 "routeros", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
170 "rsl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
171 "ruby", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
172 "ruleslanguage", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
173 "rust", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
174 "scala", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
175 "scheme", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
176 "scilab", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
177 "scss", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
178 "shell", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
179 "smali", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
180 "smalltalk", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
181 "sml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
182 "sqf", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
183 "sql", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
184 "stan", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
185 "stata", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
186 "step21", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
187 "stylus", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
188 "subunit", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
189 "swift", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
190 "taggerscript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
191 "tap", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
192 "tcl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
193 "tex", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
194 "thrift", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
195 "tp", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
196 "twig", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
197 "typescript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
198 "vala", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
199 "vbnet", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
200 "vbscript-html", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
201 "vbscript", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
202 "verilog", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
203 "vhdl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
204 "vim", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
205 "x86asm", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
206 "xl", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
207 "xml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
208 "xquery", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
209 "yaml", |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
210 "zephir" |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
211 }; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
212 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
213 const size_t languagesz = NELEM(languages); |
0 | 214 |
77
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
215 const struct duration durations[] = { |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
216 { "day", PASTE_DURATION_DAY }, |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
217 { "hour", PASTE_DURATION_HOUR }, |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
218 { "week", PASTE_DURATION_WEEK }, |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
219 { "month", PASTE_DURATION_MONTH } |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
220 }; |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
221 |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
222 const size_t durationsz = NELEM(durations); |
fe78b16c694d
pasterd: refactor json utilities
David Demelier <markand@malikania.fr>
parents:
73
diff
changeset
|
223 |
71
d3d3937c5756
misc: remove deprecated noreturn
David Demelier <markand@malikania.fr>
parents:
60
diff
changeset
|
224 void |
0 | 225 die(const char *fmt, ...) |
226 { | |
227 va_list ap; | |
228 | |
229 va_start(ap, fmt); | |
230 vfprintf(stderr, fmt, ap); | |
231 va_end(ap); | |
232 | |
233 exit(1); | |
234 } | |
235 | |
236 char * | |
237 estrdup(const char *str) | |
238 { | |
239 assert(str); | |
240 | |
241 char *ret; | |
242 size_t length = strlen(str); | |
243 | |
244 if (!(ret = calloc(1, length + 1))) | |
245 die(strerror(errno)); | |
246 | |
247 return strcpy(ret, str); | |
248 } | |
1
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
249 |
73
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
250 void * |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
251 ecalloc(size_t n, size_t w) |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
252 { |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
253 void *ptr; |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
254 |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
255 if (!(ptr = calloc(n, w))) |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
256 die(strerror(errno)); |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
257 |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
258 return ptr; |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
259 } |
6792975da9a0
pasterd: start removing themes
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
260 |
1
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
261 const char * |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
262 bprintf(const char *fmt, ...) |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
263 { |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
264 static char buf[BUFSIZ]; |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
265 va_list ap; |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
266 |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
267 va_start(ap, fmt); |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
268 vsnprintf(buf, sizeof (buf), fmt, ap); |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
269 va_end(ap); |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
270 |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
271 return buf; |
836a698946f8
pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
272 } |
5
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
273 |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
274 const char * |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
275 bstrftime(const char *fmt, const struct tm *tm) |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
276 { |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
277 static char buf[BUFSIZ]; |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
278 |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
279 strftime(buf, sizeof (buf), fmt, tm); |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
280 |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
281 return buf; |
f455893bf0b0
pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
282 } |
51
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
283 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
284 const char * |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
285 path(const char *filename) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
286 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
287 assert(filename); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
288 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
289 /* Build path to the template file. */ |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
290 static char path[PATH_MAX]; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
291 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
292 snprintf(path, sizeof (path), "%s/%s", config.themedir, filename); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
293 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
294 return path; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
295 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
296 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
297 void |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
298 replace(char **dst, const char *s) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
299 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
300 assert(dst); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
301 assert(s); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
302 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
303 /* Trim leading spaces. */ |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
304 while (*s && isspace(*s)) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
305 s++; |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
306 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
307 if (*s) { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
308 free(*dst); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
309 *dst = estrdup(s); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
310 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
311 } |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
312 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
313 const char * |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
314 ttl(time_t timestamp, long long int duration) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
315 { |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
316 const time_t now = time(NULL); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
317 const long long int left = duration - difftime(now, timestamp); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
318 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
319 if (left < PASTE_DURATION_HOUR) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
320 return bprintf("%lld minute(s)", left / 60); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
321 if (left < PASTE_DURATION_DAY) |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
322 return bprintf("%lld hour(s)", left / 3600); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
323 |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
324 /* Other in days. */ |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
325 return bprintf("%lld day(s)", left / 86400); |
07b6887d3557
pasterd: split into individual pages
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
326 } |