1*d19ef5a2SAaron LI /*-
2*d19ef5a2SAaron LI * SPDX-License-Identifier: BSD-3-Clause
3*d19ef5a2SAaron LI *
4*d19ef5a2SAaron LI * Copyright (c) 2020 The DragonFly Project. All rights reserved.
5*d19ef5a2SAaron LI * Copyright (c) 1989, 1993, 1994
6*d19ef5a2SAaron LI * The Regents of the University of California. All rights reserved.
7*d19ef5a2SAaron LI *
8*d19ef5a2SAaron LI * This code is derived from software contributed to The DragonFly Project
9*d19ef5a2SAaron LI * by Aaron LI <aly@aaronly.me>
10*d19ef5a2SAaron LI *
11*d19ef5a2SAaron LI * Redistribution and use in source and binary forms, with or without
12*d19ef5a2SAaron LI * modification, are permitted provided that the following conditions
13*d19ef5a2SAaron LI * are met:
14*d19ef5a2SAaron LI * 1. Redistributions of source code must retain the above copyright
15*d19ef5a2SAaron LI * notice, this list of conditions and the following disclaimer.
16*d19ef5a2SAaron LI * 2. Redistributions in binary form must reproduce the above copyright
17*d19ef5a2SAaron LI * notice, this list of conditions and the following disclaimer in the
18*d19ef5a2SAaron LI * documentation and/or other materials provided with the distribution.
19*d19ef5a2SAaron LI * 3. Neither the name of the University nor the names of its contributors
20*d19ef5a2SAaron LI * may be used to endorse or promote products derived from this software
21*d19ef5a2SAaron LI * without specific prior written permission.
22*d19ef5a2SAaron LI *
23*d19ef5a2SAaron LI * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24*d19ef5a2SAaron LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25*d19ef5a2SAaron LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*d19ef5a2SAaron LI * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27*d19ef5a2SAaron LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*d19ef5a2SAaron LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*d19ef5a2SAaron LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*d19ef5a2SAaron LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*d19ef5a2SAaron LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*d19ef5a2SAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*d19ef5a2SAaron LI * SUCH DAMAGE.
34*d19ef5a2SAaron LI */
35*d19ef5a2SAaron LI
36*d19ef5a2SAaron LI #include <ctype.h>
37*d19ef5a2SAaron LI #include <err.h>
38*d19ef5a2SAaron LI #include <stdio.h>
39*d19ef5a2SAaron LI #include <stdlib.h>
40*d19ef5a2SAaron LI #include <string.h>
41*d19ef5a2SAaron LI #include <time.h>
42*d19ef5a2SAaron LI
43*d19ef5a2SAaron LI #include "calendar.h"
44*d19ef5a2SAaron LI #include "nnames.h"
45*d19ef5a2SAaron LI #include "utils.h"
46*d19ef5a2SAaron LI
47*d19ef5a2SAaron LI
48*d19ef5a2SAaron LI #define NNAME_INIT0 \
49*d19ef5a2SAaron LI { 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0 }
50*d19ef5a2SAaron LI #define NNAME_INIT1(val, name) \
51*d19ef5a2SAaron LI { (val), name, sizeof(name)-1, NULL, 0, NULL, 0, NULL, 0 }
52*d19ef5a2SAaron LI #define NNAME_INIT2(val, name, f_name) \
53*d19ef5a2SAaron LI { (val), name, sizeof(name)-1, f_name, sizeof(f_name)-1, \
54*d19ef5a2SAaron LI NULL, 0, NULL, 0 }
55*d19ef5a2SAaron LI
56*d19ef5a2SAaron LI /* names of every day of week */
57*d19ef5a2SAaron LI struct nname dow_names[NDOWS+1] = {
58*d19ef5a2SAaron LI NNAME_INIT2(0, "Sun", "Sunday"),
59*d19ef5a2SAaron LI NNAME_INIT2(1, "Mon", "Monday"),
60*d19ef5a2SAaron LI NNAME_INIT2(2, "Tue", "Tuesday"),
61*d19ef5a2SAaron LI NNAME_INIT2(3, "Wed", "Wednesday"),
62*d19ef5a2SAaron LI NNAME_INIT2(4, "Thu", "Thursday"),
63*d19ef5a2SAaron LI NNAME_INIT2(5, "Fri", "Friday"),
64*d19ef5a2SAaron LI NNAME_INIT2(6, "Sat", "Saturday"),
65*d19ef5a2SAaron LI NNAME_INIT0,
66*d19ef5a2SAaron LI };
67*d19ef5a2SAaron LI
68*d19ef5a2SAaron LI /* names of every month */
69*d19ef5a2SAaron LI struct nname month_names[NMONTHS+1] = {
70*d19ef5a2SAaron LI NNAME_INIT2(1, "Jan", "January"),
71*d19ef5a2SAaron LI NNAME_INIT2(2, "Feb", "February"),
72*d19ef5a2SAaron LI NNAME_INIT2(3, "Mar", "March"),
73*d19ef5a2SAaron LI NNAME_INIT2(4, "Apr", "April"),
74*d19ef5a2SAaron LI NNAME_INIT2(5, "May", "May"),
75*d19ef5a2SAaron LI NNAME_INIT2(6, "Jun", "June"),
76*d19ef5a2SAaron LI NNAME_INIT2(7, "Jul", "July"),
77*d19ef5a2SAaron LI NNAME_INIT2(8, "Aug", "August"),
78*d19ef5a2SAaron LI NNAME_INIT2(9, "Sep", "September"),
79*d19ef5a2SAaron LI NNAME_INIT2(10, "Oct", "October"),
80*d19ef5a2SAaron LI NNAME_INIT2(11, "Nov", "November"),
81*d19ef5a2SAaron LI NNAME_INIT2(12, "Dec", "December"),
82*d19ef5a2SAaron LI NNAME_INIT0,
83*d19ef5a2SAaron LI };
84*d19ef5a2SAaron LI
85*d19ef5a2SAaron LI /* names of every sequence */
86*d19ef5a2SAaron LI struct nname sequence_names[NSEQUENCES+1] = {
87*d19ef5a2SAaron LI NNAME_INIT1(1, "First"),
88*d19ef5a2SAaron LI NNAME_INIT1(2, "Second"),
89*d19ef5a2SAaron LI NNAME_INIT1(3, "Third"),
90*d19ef5a2SAaron LI NNAME_INIT1(4, "Fourth"),
91*d19ef5a2SAaron LI NNAME_INIT1(5, "Fifth"),
92*d19ef5a2SAaron LI NNAME_INIT1(-1, "Last"),
93*d19ef5a2SAaron LI NNAME_INIT0,
94*d19ef5a2SAaron LI };
95*d19ef5a2SAaron LI
96*d19ef5a2SAaron LI
97*d19ef5a2SAaron LI void
set_nnames(void)98*d19ef5a2SAaron LI set_nnames(void)
99*d19ef5a2SAaron LI {
100*d19ef5a2SAaron LI char buf[64];
101*d19ef5a2SAaron LI struct tm tm;
102*d19ef5a2SAaron LI struct nname *nname;
103*d19ef5a2SAaron LI
104*d19ef5a2SAaron LI memset(&tm, 0, sizeof(tm));
105*d19ef5a2SAaron LI for (int i = 0; i < NDOWS; i++) {
106*d19ef5a2SAaron LI nname = &dow_names[i];
107*d19ef5a2SAaron LI tm.tm_wday = i;
108*d19ef5a2SAaron LI
109*d19ef5a2SAaron LI strftime(buf, sizeof(buf), "%a", &tm);
110*d19ef5a2SAaron LI free(nname->n_name);
111*d19ef5a2SAaron LI nname->n_name = xstrdup(buf);
112*d19ef5a2SAaron LI nname->n_len = strlen(nname->n_name);
113*d19ef5a2SAaron LI
114*d19ef5a2SAaron LI strftime(buf, sizeof(buf), "%A", &tm);
115*d19ef5a2SAaron LI free(nname->fn_name);
116*d19ef5a2SAaron LI nname->fn_name = xstrdup(buf);
117*d19ef5a2SAaron LI nname->fn_len = strlen(nname->fn_name);
118*d19ef5a2SAaron LI
119*d19ef5a2SAaron LI DPRINTF2("%s: dow[%d]: %s, %s, %s, %s\n", __func__,
120*d19ef5a2SAaron LI nname->value, nname->name, nname->f_name,
121*d19ef5a2SAaron LI nname->n_name, nname->fn_name);
122*d19ef5a2SAaron LI }
123*d19ef5a2SAaron LI
124*d19ef5a2SAaron LI memset(&tm, 0, sizeof(tm));
125*d19ef5a2SAaron LI for (int i = 0; i < NMONTHS; i++) {
126*d19ef5a2SAaron LI nname = &month_names[i];
127*d19ef5a2SAaron LI tm.tm_mon = i;
128*d19ef5a2SAaron LI
129*d19ef5a2SAaron LI strftime(buf, sizeof(buf), "%b", &tm);
130*d19ef5a2SAaron LI free(nname->n_name);
131*d19ef5a2SAaron LI /* The month may have a leading blank (e.g., on *BSD) */
132*d19ef5a2SAaron LI nname->n_name = xstrdup(triml(buf));
133*d19ef5a2SAaron LI nname->n_len = strlen(nname->n_name);
134*d19ef5a2SAaron LI
135*d19ef5a2SAaron LI strftime(buf, sizeof(buf), "%B", &tm);
136*d19ef5a2SAaron LI free(nname->fn_name);
137*d19ef5a2SAaron LI nname->fn_name = xstrdup(triml(buf));
138*d19ef5a2SAaron LI nname->fn_len = strlen(nname->fn_name);
139*d19ef5a2SAaron LI
140*d19ef5a2SAaron LI DPRINTF2("%s: month[%02d]: %s, %s, %s, %s\n", __func__,
141*d19ef5a2SAaron LI nname->value, nname->name, nname->f_name,
142*d19ef5a2SAaron LI nname->n_name, nname->fn_name);
143*d19ef5a2SAaron LI }
144*d19ef5a2SAaron LI }
145*d19ef5a2SAaron LI
146*d19ef5a2SAaron LI void
set_nsequences(const char * seq)147*d19ef5a2SAaron LI set_nsequences(const char *seq)
148*d19ef5a2SAaron LI {
149*d19ef5a2SAaron LI struct nname *nname;
150*d19ef5a2SAaron LI const char *p = seq;
151*d19ef5a2SAaron LI size_t len;
152*d19ef5a2SAaron LI
153*d19ef5a2SAaron LI if (count_char(seq, ' ') != NSEQUENCES - 1) {
154*d19ef5a2SAaron LI warnx("Invalid SEQUENCE: |%s|", seq);
155*d19ef5a2SAaron LI return;
156*d19ef5a2SAaron LI }
157*d19ef5a2SAaron LI
158*d19ef5a2SAaron LI for (int i = 0; i < NSEQUENCES; i++) {
159*d19ef5a2SAaron LI while (*p != ' ' && *p != '\0')
160*d19ef5a2SAaron LI p++;
161*d19ef5a2SAaron LI
162*d19ef5a2SAaron LI len = (size_t)(p - seq);
163*d19ef5a2SAaron LI nname = &sequence_names[i];
164*d19ef5a2SAaron LI free(nname->n_name);
165*d19ef5a2SAaron LI nname->n_name = xcalloc(1, len + 1);
166*d19ef5a2SAaron LI strncpy(nname->n_name, seq, len);
167*d19ef5a2SAaron LI nname->n_len = strlen(nname->n_name);
168*d19ef5a2SAaron LI DPRINTF2("%s: sequence[%d]: %s, %s, %s, %s\n", __func__,
169*d19ef5a2SAaron LI nname->value, nname->name, nname->f_name,
170*d19ef5a2SAaron LI nname->n_name, nname->fn_name);
171*d19ef5a2SAaron LI
172*d19ef5a2SAaron LI seq = ++p;
173*d19ef5a2SAaron LI }
174*d19ef5a2SAaron LI }
175