annotate util.c @ 78:9bfe5ce3cc45

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