summaryrefslogtreecommitdiffstats
path: root/common.h
blob: 3647f49684d189b172a915697804cda9f1f1e4a7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>

#include <grapheme.h>

#include "arg.h"


#if defined(__GNUC__)
# pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
# pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
#endif


#define EXIT_STYLE         1
#define EXIT_CONFUSING     2
#define EXIT_WARNING       3
#define EXIT_UNSPECIFIED   4
#define EXIT_NONCONFORMING 5
#define EXIT_UNDEFINED     6
#define EXIT_CRITICAL      7
#define EXIT_ERROR         8


#define ELEMSOF(ARRAY) (sizeof(ARRAY) / sizeof(*(ARRAY)))
#define MAX(A, B) ((A) > (B) ? (A) : (B))


#define LIST_WARNING_CLASSES(X)\
	X(WC_MAKEFILE, "makefile", INFORM)\
	X(WC_EXTRA_MAKEFILE, "extra-makefile", WARN)\
	X(WC_CMDLINE, "cmdline", WARN)\
	X(WC_TEXT, "text", WARN)\
	X(WC_ENCODING, "encoding", WARN)\
	X(WC_LONG_LINE, "long-line", WARN_STYLE)\
	X(WC_NONEMPTY_BLANK, "nonempty-blank", WARN_STYLE)\
	X(WC_LEADING_BAD_SPACE, "leading-bad-space", WARN)\
	X(WC_ILLEGAL_INDENT, "illegal-indent", WARN)\
	X(WC_CONTINUATION_OF_BLANK, "continuation-of-blank", WARN)\
	X(WC_CONTINUATION_TO_BLANK, "continuation-to-blank", WARN)\
	X(WC_EOF_LINE_CONTINUATION, "eof-line-continuation", WARN)\
	X(WC_UNINDENTED_CONTINUATION, "unindented-continuation", WARN)\
	X(WC_SPACELESS_CONTINUATION, "spaceless-continuation", WARN)\
	X(WC_COMMENT_CONTINUATION, "comment-continuation", WARN)


enum action {
	IGNORE,
	INFORM,
	WARN_STYLE,
	WARN
};

enum warning_class {
#define X(ENUM, NAME, ACTION) ENUM,
	LIST_WARNING_CLASSES(X)
#undef X
	NUM_WARNING_CLASS
};

struct warning_class_data {
	const char *name;
	enum action action;
};

enum line_class {
	EMPTY, /* Classified as comment lines in the specification */
	BLANK, /* Classified as comment lines in the specification */
	COMMENT,
	COMMAND_LINE,
	OTHER
};

struct line {
	char *data;
	size_t len;
	const char *path;
	size_t lineno;
	int eof;
	int nest_level;
	char continuation_joiner; /* If '\\', it shall be '\\\n' */
};

enum macro_bracket_style {
	INCONSISTENT,
	ROUND,
	CURLY
};

struct style {
	size_t max_line_length;
	int only_empty_blank_lines;
	enum macro_bracket_style macro_bracket_style;
};


extern int exit_status;
extern struct style style;


/* makefile.c */
int open_default_makefile(const char **pathp);
void cmdline_opt_f(const char *arg, const char **makefile_pathp);
struct line *load_makefile(const char *path, size_t *nlinesp);


/* text.c */
struct line *load_text_file(int fd, const char *fname, int nest_level, size_t *nlinesp);
void check_utf8_encoding(struct line *line);
void check_column_count(struct line *line);
int is_line_blank(struct line *line);


/* ui.c */
extern struct warning_class_data warning_classes[];
void xprintwarningf(enum warning_class class, int severity, const char *fmt, ...);
#define warnf_style(CLASS, ...) xprintwarningf(CLASS, EXIT_STYLE, __VA_ARGS__)
#define warnf_confusing(CLASS, ...) xprintwarningf(CLASS, EXIT_CONFUSING, __VA_ARGS__)
#define warnf_warning(CLASS, ...) xprintwarningf(CLASS, EXIT_WARNING, __VA_ARGS__)
#define warnf_unspecified(CLASS, ...) xprintwarningf(CLASS, EXIT_UNSPECIFIED, __VA_ARGS__)
#define warnf_nonconforming(CLASS, ...) xprintwarningf(CLASS, EXIT_NONCONFORMING, __VA_ARGS__)
#define warnf_undefined(CLASS, ...) xprintwarningf(CLASS, EXIT_UNDEFINED, __VA_ARGS__)
void printinfof(enum warning_class class, const char *fmt, ...);
void printerrorf(const char *fmt, ...);
void printtipf(enum warning_class class, const char *fmt, ...);


/* util.c */
void *erealloc(void *, size_t);
void *ecalloc(size_t, size_t);
void *emalloc(size_t);
void *ememdup(const void *, size_t);
void eprintf(const char *, ...);