aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eßer <se@FreeBSD.org>2020-11-05 08:58:21 +0000
committerStefan Eßer <se@FreeBSD.org>2020-11-05 08:58:21 +0000
commit0357fa2632daccc2c11e01434b91e2274eb4775e (patch)
tree3cc4fe0a99fa36a3b080e83e2ff0fdeed2e74f64
parent20172854ab47f3f4b0dac5fe67ac6afe53bb8d64 (diff)
downloadsrc-0357fa2632daccc2c11e01434b91e2274eb4775e.tar.gz
src-0357fa2632daccc2c11e01434b91e2274eb4775e.zip
Notes
-rw-r--r--usr.bin/calendar/calendar.17
-rw-r--r--usr.bin/calendar/calendar.h1
-rw-r--r--usr.bin/calendar/events.c7
-rw-r--r--usr.bin/calendar/io.c80
4 files changed, 63 insertions, 32 deletions
diff --git a/usr.bin/calendar/calendar.1 b/usr.bin/calendar/calendar.1
index 8abaf2096ef1..1b4972b70f78 100644
--- a/usr.bin/calendar/calendar.1
+++ b/usr.bin/calendar/calendar.1
@@ -28,7 +28,7 @@
.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
.\" $FreeBSD$
.\"
-.Dd November 4, 2020
+.Dd November 5, 2020
.Dt CALENDAR 1
.Os
.Sh NAME
@@ -199,13 +199,14 @@ file is preprocessed by a limited subset of
internally, allowing the inclusion of shared files such as
lists of company holidays or meetings.
This limited subset consists of \fB#include\fR, \fB#define\fR,
-\fB#undef\fR, \fB#ifdef\fR, \fB#ifndef\fR, and \fB#else\fR.
+\fB#undef\fR, \fB#ifdef\fR, \fB#ifndef\fR, \fB#else\fR, \fB#warning\fR,
+and \fB#error\fR.
.Pp
Conditions can be nested and the consistency of opening and closing
instructions is checked.
Only the first word after #define is used as the name of the
condition variable being defined.
-More than word following #ifdef, #ifndef, or #undef is a ayntax
+More than word following #ifdef, #ifndef, or #undef is considered a syntax
error, since names cannot include white-space.
Included files are parsed in a global scope with regard to the condition
variables being defined or tested therein.
diff --git a/usr.bin/calendar/calendar.h b/usr.bin/calendar/calendar.h
index 312ef1c2d4c9..48ed999fddcd 100644
--- a/usr.bin/calendar/calendar.h
+++ b/usr.bin/calendar/calendar.h
@@ -130,7 +130,6 @@ struct event {
int month;
int day;
int var;
- char *date;
char *text;
char *extra;
struct event *next;
diff --git a/usr.bin/calendar/events.c b/usr.bin/calendar/events.c
index 9d4dce97e6e0..1df2357fb959 100644
--- a/usr.bin/calendar/events.c
+++ b/usr.bin/calendar/events.c
@@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
#include <iconv.h>
#include <errno.h>
#include <langinfo.h>
-#include <locale.h>
static iconv_t conv = (iconv_t)-1;
static char *currentEncoding = NULL;
@@ -204,13 +203,7 @@ event_print_all(FILE *fp)
struct tm tm;
char dbuf[80];
static int d_first;
- const char *lang;
- lang = getenv("LANG");
- if (lang == NULL)
- lang = "C";
- if (setlocale(LC_ALL, lang) == NULL)
- (void)setlocale(LC_ALL, "C");
d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
while (walkthrough_dates(&e) != 0) {
diff --git a/usr.bin/calendar/io.c b/usr.bin/calendar/io.c
index e6a69581a342..b9fef2684091 100644
--- a/usr.bin/calendar/io.c
+++ b/usr.bin/calendar/io.c
@@ -172,6 +172,16 @@ cal_path(void)
#define WARN1(format, arg1) \
warnx(format " in %s line %d", arg1, cal_path(), cal_line)
+static char*
+cmptoken(char *line, const char* token)
+{
+ char len = strlen(token);
+
+ if (strncmp(line, token, len) != 0)
+ return NULL;
+ return (line + len);
+}
+
static int
token(char *line, FILE *out, int *skip, int *unskip)
{
@@ -181,7 +191,10 @@ token(char *line, FILE *out, int *skip, int *unskip)
const char *this_cal_file;
int this_cal_line;
- if (strncmp(line, "endif", 5) == 0) {
+ while (isspace(*line))
+ line++;
+
+ if (cmptoken(line, "endif")) {
if (*skip + *unskip == 0) {
WARN0("#endif without prior #ifdef or #ifndef");
return (T_ERR);
@@ -194,8 +207,8 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- if (strncmp(line, "ifdef", 5) == 0) {
- walk = line + 5;
+ walk = cmptoken(line, "ifdef");
+ if (walk != NULL) {
sep = trimlr(&walk);
if (*walk == '\0') {
@@ -217,8 +230,8 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- if (strncmp(line, "ifndef", 6) == 0) {
- walk = line + 6;
+ walk = cmptoken(line, "ifndef");
+ if (walk != NULL) {
sep = trimlr(&walk);
if (*walk == '\0') {
@@ -240,8 +253,8 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- if (strncmp(line, "else", 4) == 0) {
- walk = line + 4;
+ walk = cmptoken(line, "else");
+ if (walk != NULL) {
(void)trimlr(&walk);
if (*walk != '\0') {
@@ -267,9 +280,8 @@ token(char *line, FILE *out, int *skip, int *unskip)
if (*skip != 0)
return (T_OK);
- if (strncmp(line, "include", 7) == 0) {
- walk = line + 7;
-
+ walk = cmptoken(line, "include");
+ if (walk != NULL) {
(void)trimlr(&walk);
if (*walk == '\0') {
@@ -306,10 +318,10 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- if (strncmp(line, "define", 6) == 0) {
+ walk = cmptoken(line, "define");
+ if (walk != NULL) {
if (definitions == NULL)
definitions = sl_init();
- walk = line + 6;
sep = trimlr(&walk);
*sep = '\0';
@@ -323,9 +335,9 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- if (strncmp(line, "undef", 5) == 0) {
+ walk = cmptoken(line, "undef");
+ if (walk != NULL) {
if (definitions != NULL) {
- walk = line + 5;
sep = trimlr(&walk);
if (*walk == '\0') {
@@ -345,8 +357,32 @@ token(char *line, FILE *out, int *skip, int *unskip)
return (T_OK);
}
- return (T_PROCESS);
+ walk = cmptoken(line, "warning");
+ if (walk != NULL) {
+ (void)trimlr(&walk);
+ WARN1("Warning: %s", walk);
+ }
+ walk = cmptoken(line, "error");
+ if (walk != NULL) {
+ (void)trimlr(&walk);
+ WARN1("Error: %s", walk);
+ return (T_ERR);
+ }
+
+ WARN1("Undefined pre-processor command \"#%s\"", line);
+ return (T_ERR);
+}
+
+static void
+setup_locale(const char *locale)
+{
+ (void)setlocale(LC_ALL, locale);
+#ifdef WITH_ICONV
+ if (!doall)
+ set_new_encoding();
+#endif
+ setnnames();
}
#define REPLACE(string, slen, struct_) \
@@ -361,6 +397,7 @@ token(char *line, FILE *out, int *skip, int *unskip)
static int
cal_parse(FILE *in, FILE *out)
{
+ char *mylocale = NULL;
char *line = NULL;
char *buf;
size_t linecap = 0;
@@ -459,12 +496,9 @@ cal_parse(FILE *in, FILE *out)
* and does not run iconv(), this variable has little use.
*/
if (strncmp(buf, "LANG=", 5) == 0) {
- (void)setlocale(LC_ALL, buf + 5);
-#ifdef WITH_ICONV
- if (!doall)
- set_new_encoding();
-#endif
- setnnames();
+ if (mylocale == NULL)
+ mylocale = strdup(setlocale(LC_ALL, NULL));
+ setup_locale(buf + 5);
continue;
}
/* Parse special definitions: Easter, Paskha etc */
@@ -538,6 +572,10 @@ cal_parse(FILE *in, FILE *out)
free(line);
fclose(in);
+ if (mylocale != NULL) {
+ setup_locale(mylocale);
+ free(mylocale);
+ }
return (0);
}