-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathst_cobol.c
193 lines (161 loc) · 17.2 KB
/
st_cobol.c
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include <string.h>
#include <syntax.h>
#include <ctype.h>
int st_cobol_depth(const char *line, int length) {
char in_string = '\0';
int depth = 0;
for (int i = 0; i < length; i++) {
if (in_string) {
if (line[i] == '\\') {
i++;
} else if (line[i] == in_string) {
in_string = '\0';
}
} else if (strchr("\"'", line[i])) {
in_string = line[i];
}
}
if (depth < 0) {
depth = 0;
}
return depth;
}
char st_cobol_pair(const char *line, int length, char chr) {
char in_string = '\0';
for (int i = 0; i < length; i++) {
if (in_string) {
if (line[i] == '\\') {
i++;
} else if (line[i] == in_string) {
in_string = '\0';
}
} else if (strchr("\"'", line[i])) {
in_string = line[i];
}
}
if (in_string) {
return '\0';
}
if (chr == '"') {
return '"';
}
if (chr == '\'') {
return '\'';
}
return '\0';
}
static int is_ident(char chr) {
return isalnum(chr) || strchr("_-", chr);
}
enum {
st_cobol_default,
st_cobol_ident,
st_cobol_number,
st_cobol_string,
st_cobol_char,
st_cobol_string_escape,
st_cobol_char_escape,
st_cobol_line_comment,
};
/* https://gnucobol.sourceforge.io/HTML/gnucobpg.html */
static const char *keywords[] = {
"3-D",
"ABSENT", "ABS", "ACCEPT", "ACCESS", "ACOS", "ACTION", "ACTIVE-CLASS", "ACTIVE-X", "ADDRESS", "ADD", "ADJUSTABLE-COLUMNS", "ADVANCING", "AFTER", "ALIGNED", "ALIGNMENT", "ALLOCATE", "ALL", "ALPHABETIC-LOWER", "ALPHABETIC-UPPER", "ALPHABETIC", "ALPHABET", "ALPHANUMERIC-EDITED", "ALPHANUMERIC", "ALSO", "ALTERNATE", "ALTER", "AND", "ANNUITY", "ANYCASE", "ANY", "AREAS", "AREA", "ARE", "ARGUMENT-NUMBER", "ARGUMENT-VALUE", "ARITHMETIC", "ASCENDING", "ASCII", "ASIN", "ASSIGN", "AS", "ATAN", "ATTRIBUTE", "AT", "AUTHOR", "AUTO-DECIMAL", "AUTOMATIC", "AUTO-SKIP", "AUTO-SPIN", "AUTOTERMINATE", "AUTO", "AWAY-FROM-ZERO",
"BACKGROUND-COLOR", "BACKGROUND-COLOUR", "BACKGROUND-HIGH", "BACKGROUND-LOW", "BACKGROUND-STANDARD", "B-AND", "BAR", "BASED", "BEEP", "BEFORE", "BELL", "BINARY-CHAR", "BINARY-C-LONG", "BINARY-DOUBLE", "BINARY-INT", "BINARY-LONG-LONG", "BINARY-LONG", "BINARY-SEQUENTIAL", "BINARY-SHORT", "BINARY", "BITMAP-END", "BITMAP-HANDLE", "BITMAP-NUMBER", "BITMAP-START", "BITMAP-TIMER", "BITMAP-TRAILING", "BITMAP-TRANSPARENT-COLOR", "BITMAP-WIDTH", "BITMAP", "BIT", "BLANK", "BLINK", "BLOCK", "B-NOT", "BOOLEAN", "BOOLEAN-OF-INTEGER", "B-OR", "BOTTOM", "BOXED", "BOX", "BUSY", "BUTTONS", "B-XOR", "BYTE-LENGTH", "BY",
"C01", "C02", "C03", "C04", "C05", "C06", "C07", "C08", "C09", "C10", "C11", "C12", "CALENDAR-FONT", "CALL-CONVENTION", "CALL", "CANCEL-BUTTON", "CANCEL", "CAPACITY", "CARD-PUNCH", "CARD-READER", "CASSETTE", "CBL_AND", "CBL_CHANGE_DIR", "CBL_CHECK_FILE_EXIST", "CBL_CLOSE_FILE", "CBL_COPY_FILE", "CBL_CREATE_DIR", "CBL_CREATE_FILE", "CBL_DELETE_DIR", "CBL_DELETE_FILE", "CBL_EQ", "CBL_ERROR_PROC", "CBL_EXIT_PROC", "CBL_FLUSH_FILE", "CBL_GC_FORK", "CBL_GC_GETOPT", "CBL_GC_HOSTED", "CBL_GC_NANOSLEEP", "CBL_GC_PRINTABLE", "CBL_GC_WAITPID", "CBL_GET_CSR_POS", "CBL_GET_CURRENT_DIR", "CBL_GET_SCR_SIZE", "CBL_IMP", "CBL_NIMP", "CBL_NOR", "CBL_NOT", "CBL_OC_GETOPT", "CBL_OC_HOSTED", "CBL_OC_NANOSLEEP", "CBL_OPEN_FILE", "CBL_OR", "CBL_READ_FILE", "CBL_READ_KBD_CHAR", "CBL_RENAME_FILE", "CBL_SET_CSR_POS", "CBL_TOLOWER", "CBL_TOUPPER", "CBL_WRITE_FILE", "CBL_XOR", "C$CALLEDBY", "C$CHDIR", "CCOL", "C$COPY", "C$DELETE", "CD", "CELL-COLOR", "CELL-DATA", "CELL-FONT", "CELL-PROTECTION", "CELLS", "CELL", "CENTERED-HEADINGS", "CENTER", "CENTURY-DATE", "C$FILEINFO", "CF", "C$GETPID", "CHAINING", "CHAIN", "CHARACTERS", "CHARACTER", "CHAR-NATIONAL", "CHAR", "CHECK-BOX", "CH", "C$JUSTIFY", "CLASS-ID", "CLASSIFICATION", "CLASS", "CLEAR-SELECTION", "CLINES", "CLINE", "CLOSE", "C$MAKEDIR", "C$NARG", "COB-CRT-STATUS", "COBOL", "CODE-SET", "CODE", "COLLATING", "COLORS", "COLOR", "COLOURS", "COLS", "COLUMN-COLOR", "COLUMN-DIVIDERS", "COLUMN-FONT", "COLUMN-HEADINGS", "COLUMN-PROTECTION", "COLUMNS", "COLUMN", "COL", "COMBINED-DATETIME", "COMBO-BOX", "COMMAND-LINE", "COMMA", "COMMIT", "COMMON", "COMMUNICATION", "COMP-1", "COMP-2", "COMP-3", "COMP-4", "COMP-5", "COMP-6", "COMPUTATIONAL-1", "COMPUTATIONAL-2", "COMPUTATIONAL-3", "COMPUTATIONAL-4", "COMPUTATIONAL-5", "COMPUTATIONAL-6", "COMPUTATIONAL-X", "COMPUTATIONAL", "COMPUTE", "COMP-X", "COMP", "CONCATENATE", "CONDITION", "CONFIGURATION", "CONSOLE", "CONSTANT", "CONTAINS", "CONTENT", "CONTINUE", "CONTROLS", "CONTROL", "CONVERSION", "CONVERTING", "COPY-SELECTION", "COPY", "CORRESPONDING", "CORR", "COS", "COUNT", "C$PARAMSIZE", "C$PRINTABLE", "CRT-UNDER", "CRT", "CSIZE", "C$SLEEP", "CSP", "C$TOLOWER", "C$TOUPPER", "CURRENCY-SYMBOL", "CURRENCY", "CURRENT-DATE", "CURSOR-COLOR", "CURSOR-COL", "CURSOR-FRAME-WIDTH", "CURSOR-ROW", "CURSOR-X", "CURSOR", "CURSOR-Y", "CUSTOM-PRINT-TEMPLATE", "CYCLE",
"DASHED", "DATA-COLUMNS", "DATA-POINTER", "DATA-TYPES", "DATA", "DATE-COMPILED", "DATE-ENTRY", "DATE-MODIFIED", "DATE-OF-INTEGER", "DATE-TO-YYYYMMDD", "DATE-WRITTEN", "DATE", "DAY-OF-INTEGER", "DAY-OF-WEEK", "DAY-TO-YYYYDDD", "DAY", "DEBUGGING", "DEBUG-ITEM", "DECIMAL-POINT", "DECLARATIVES", "DEFAULT-BUTTON", "DEFAULT-FONT", "DEFAULT", "DELETE", "DELIMITED", "DELIMITER", "DEPENDING", "DESCENDING", "DESTINATION", "DESTROY", "DETAIL", "DE", "DISABLE", "DISC", "DISK", "DISPLAY-COLUMNS", "DISPLAY-FORMAT", "DISPLAY-OF", "DISPLAY", "DIVIDER-COLOR", "DIVIDERS", "DIVIDE", "DIVISION", "DOTDASH", "DOTTED", "DOUBLE", "DOWN", "DRAG-COLOR", "DROP-DOWN", "DROP-LIST", "DUPLICATES", "DYNAMIC",
"E", "EBCDIC", "ECHO", "EC", "EGI", "ELSE", "EMI", "EMPTY-CHECK", "ENABLE", "END-ACCEPT", "END-ADD", "END-CALL", "END-CHAIN", "END-COLOR", "END-COMPUTE", "END-DELETE", "END-DISPLAY", "END-DIVIDE", "END-EVALUATE", "END-IF", "END-MODIFY", "END-MULTIPLY", "END-OF-PAGE", "END-PERFORM", "END-READ", "END-RECEIVE", "END-RETURN", "END-REWRITE", "END-SEARCH", "END-START", "END-STRING", "END-SUBTRACT", "END-UNSTRING", "END-WRITE", "END", "ENGRAVED", "ENSURE-VISIBLE", "ENTRY-CONVENTION", "ENTRY-FIELD", "ENTRY-REASON", "ENTRY", "ENVIRONMENT-NAME", "ENVIRONMENT-VALUE", "ENVIRONMENT", "EOL", "EO", "EOP", "EOS", "EQUALS", "EQUAL", "ERASE", "ERROR", "ESCAPE-BUTTON", "ESCAPE", "ESI", "EVALUATE", "EVENT-LIST", "EVENT", "EXCEPTION-FILE-N", "EXCEPTION-FILE", "EXCEPTION-LOCATION-N", "EXCEPTION-LOCATION", "EXCEPTION-OBJECT", "EXCEPTION-STATEMENT", "EXCEPTION-STATUS", "EXCEPTION-VALUE", "EXCEPTION", "EXCLUSIVE", "EXIT", "EXP10", "EXPANDS", "EXPAND", "EXP", "EXTEND", "EXTERNAL-FORM", "EXTERNAL", "EXTERN",
"F", "FACTORIAL", "FACTORY", "FALSE", "FD", "FILE-CONTROL", "FILE-ID", "FILE-NAME", "FILE-POS", "FILE", "FILL-COLOR2", "FILL-COLOR", "FILLER", "FILL-PERCENT", "FINAL", "FINISH-REASON", "FIRST", "FIXED-FONT", "FIXED-WIDTH", "FIXED", "FLAT-BUTTONS", "FLAT", "FLOAT-BINARY-128", "FLOAT-BINARY-32", "FLOAT-BINARY-64", "FLOAT-DECIMAL-16", "FLOAT-DECIMAL-34", "FLOAT-EXTENDED", "FLOAT-INFINITY", "FLOATING", "FLOAT-LONG", "FLOAT-NOT-A-NUMBER", "FLOAT-SHORT", "FLOAT", "FONT", "FOOTING", "FOREGROUND-COLOR", "FOREGROUND-COLOUR", "FOREVER", "FORMAT", "FORMATTED-CURRENT-DATE", "FORMATTED-DATETIME", "FORMATTED-DATE", "FORMATTED-TIME", "FORMFEED", "FOR", "FRACTION-PART", "FRAMED", "FRAME", "FREE", "FROM", "FULL-HEIGHT", "FULL", "FUNCTION-ID", "FUNCTION-POINTER", "FUNCTION",
"GENERATE", "GET", "GIVING", "GLOBAL", "GOBACK", "GO-BACK", "GO-FORWARD", "GO-HOME", "GO-SEARCH", "GO", "GRAPHICAL", "GREATER", "GRID", "GROUP-USAGE", "GROUP-VALUE", "GROUP",
"HANDLE", "HAS-CHILDREN", "HEADING-COLOR", "HEADING-DIVIDER-COLOR", "HEADING-FONT", "HEADING", "HEAVY", "HEIGHT-IN-CELLS", "HIDDEN-DATA", "HIGH-COLOR", "HIGHEST-ALGEBRAIC", "HIGHLIGHT", "HIGH-VALUES", "HIGH-VALUE", "HOT-TRACK", "HSCROLL-POS", "HSCROLL",
"ICON", "IDENTIFICATION", "IDENTIFIED", "ID", "IF", "IGNORE", "IGNORING", "IMPLEMENTS", "INDEPENDENT", "INDEXED", "INDEX", "INDICATE", "INHERITS", "INITIALISED", "INITIALISE", "INITIALIZED", "INITIALIZE", "INITIAL", "INITIATE", "INPUT-OUTPUT", "INPUT", "INQUIRE", "INSERTION-INDEX", "INSERT-ROWS", "INSPECT", "INSTALLATION", "INTEGER-OF-BOOLEAN", "INTEGER-OF-DATE", "INTEGER-OF-DAY", "INTEGER-OF-FORMATTED-DATE", "INTEGER-PART", "INTEGER", "INTERFACE-ID", "INTERFACE", "INTERMEDIATE", "INTO", "INTRINSIC", "INVALID", "INVOKE", "IN", "I-O-CONTROL", "I-O", "IS", "ITEM-TEXT", "ITEM-TO-ADD", "ITEM-TO-DELETE", "ITEM-TO-EMPTY", "ITEM-VALUE", "ITEM",
"JUSTIFIED", "JUST",
"KEPT", "KEY", "KEYBOARD",
"LABEL-OFFSET", "LABEL", "LARGE-FONT", "LARGE-OFFSET", "LAST-ROW", "LAST", "LAYOUT-DATA", "LAYOUT-MANAGER", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MESSAGES", "LC_MONETARY", "LC_NUMERIC", "LC_TIME", "LEADING-SHIFT", "LEADING", "LEFT-JUSTIFY", "LEFTLINE", "LEFT-TEXT", "LEFT", "LENGTH-AN", "LENGTH-CHECK", "LENGTH", "LESS", "LIMITS", "LIMIT", "LINAGE-COUNTER", "LINAGE", "LINE-COUNTER", "LINES-AT-ROOT", "LINE-SEQUENTIAL", "LINES", "LINE", "LINKAGE", "LIST-BOX", "LM-RESIZE", "LOCALE-COMPARE", "LOCALE-DATE", "LOCALE-TIME-FROM-SECONDS", "LOCALE-TIME", "LOCALE", "LOCAL-STORAGE", "LOCK", "LOG10", "LOG", "LONG-DATE", "LOW-COLOR", "LOWER-CASE", "LOWERED", "LOWER", "LOWEST-ALGEBRAIC", "LOWLIGHT", "LOW-VALUES", "LOW-VALUE",
"MAGNETIC-TAPE", "MANUAL", "MASS-UPDATE", "MAX-LINES", "MAX-PROGRESS", "MAX-TEXT", "MAX-VAL", "MAX", "MEAN", "MEDIAN", "MEDIUM-FONT", "MEMORY", "MENU", "MERGE", "MESSAGE", "METHOD-ID", "METHOD", "MIDRANGE", "MINUS", "MIN-VAL", "MIN", "MODE", "MODIFY", "MODULE-CALLER-ID", "MODULE-DATE", "MODULE-FORMATTED-DATE", "MODULE-ID", "MODULE-PATH", "MODULE-SOURCE", "MODULES", "MODULE-TIME", "MOD", "MONETARY-DECIMAL-POINT", "MONETARY-THOUSANDS-SEPARATOR", "MOVE", "MULTILINE", "MULTIPLE", "MULTIPLY",
"NAME", "NATIONAL-EDITED", "NATIONAL-OF", "NATIONAL", "NATIVE", "NAVIGATE-URL", "NEAREST-AWAY-FROM-ZERO", "NEAREST-EVEN", "NEAREST-TOWARD-ZERO", "NEGATIVE", "NESTED", "NEW", "NEXT-ITEM", "NEXT", "NO-AUTO-DEFAULT", "NO-AUTOSEL", "NO-BOX", "NO-DIVIDERS", "NO-ECHO", "NO-F4", "NO-FOCUS", "NO-GROUP-TAB", "NO-KEY-LETTER", "NONE", "NORMAL", "NO-SEARCH", "NOTAB", "NOTHING", "NOTIFY-CHANGE", "NOTIFY-DBLCLICK", "NOTIFY-SELCHANGE", "NOTIFY", "NOT", "NO-UPDOWN", "NO", "NULLS", "NULL", "NUMBER-OF-CALL-PARAMETERS", "NUMBERS", "NUMBER", "NUM-COL-HEADINGS", "NUMERIC-DECIMAL-POINT", "NUMERIC-EDITED", "NUMERIC-THOUSANDS-SEPARATOR", "NUMERIC", "NUM-ROWS", "NUMVAL-C", "NUMVAL-F", "NUMVAL",
"OBJECT-COMPUTER", "OBJECT-REFERENCE", "OBJECT", "OCCURS", "OFF", "OF", "OK-BUTTON", "OMITTED", "ONLY", "ON", "OPEN", "OPTIONAL", "OPTIONS", "ORDER", "ORD-MAX", "ORD-MIN", "ORD", "ORGANISATION", "ORGANIZATION", "OR", "OTHER", "OUTPUT", "OVERFLOW", "OVERLAP-LEFT", "OVERLAP-TOP", "OVERLINE", "OVERRIDE",
"PACKED-DECIMAL", "PADDING", "PAGE-COUNTER", "PAGED", "PAGE-SETUP", "PAGE", "PARAGRAPH", "PARENT", "PASSWORD", "PERFORM", "PERMANENT", "PF", "PH", "PHYSICAL", "PICTURE", "PIC", "PIXELS", "PIXEL", "PI", "PLACEMENT", "PLUS", "POINTER", "POP-UP", "POSITION-SHIFT", "POSITION", "POSITIVE", "PREFIXED", "PRESENT-VALUE", "PRESENT", "PREVIOUS", "PRINT", "PRINTER-1", "PRINTER", "PRINTING", "PRINT-NO-PROMPT", "PRINT-PREVIEW", "PRINT", "PRIORITY", "PROCEDURE-POINTER", "PROCEDURES", "PROCEDURE", "PROCEED", "PROGRAM-ID", "PROGRAM-POINTER", "PROGRAM", "PROGRESS", "PROHIBITED", "PROMPT", "PROPERTIES", "PROPERTY", "PROTECTED", "PROTOTYPE", "PURGE", "PUSH-BUTTON",
"QUERY-INDEX", "QUEUE", "QUOTES", "QUOTE",
"RADIO-BUTTON", "RAISED", "RAISE", "RAISING", "RANDOM", "RANGE", "RD", "READ-ONLY", "READ", "RECEIVE", "RECORD-DATA", "RECORDING", "RECORDS", "RECORD-TO-ADD", "RECORD-TO-DELETE", "RECORD", "RECURSIVE", "REDEFINES", "REEL", "REFERENCE", "REFERENCES", "REFRESH", "REGION-COLOR", "RELATION", "RELATIVE", "RELEASE", "REMAINDER", "REMARKS", "REMOVAL", "REM", "RENAMES", "REPLACE", "REPLACING", "REPORTING", "REPORTS", "REPORT", "REPOSITORY", "REQUIRED", "RESERVE", "RESET-GRID", "RESET-LIST", "RESET-TABS", "RESET", "RESUME", "RETRY", "RETURN-CODE", "RETURNING", "RETURN", "REVERSED", "REVERSE-VIDEO", "REVERSE", "REWIND", "REWRITE", "RF", "RH", "RIGHT-ALIGN", "RIGHT-JUSTIFY", "RIGHT", "RIMMED", "ROLLBACK", "ROUNDED", "ROUNDING", "ROW-COLOR-PATTERN", "ROW-COLOR", "ROW-DIVIDERS", "ROW-FONT", "ROW-HEADINGS", "ROW-PROTECTION", "RUN",
"S", "SAME", "SAVE-AS-NO-PROMPT", "SAVE-AS", "SCREEN", "SCROLL-BAR", "SCROLL", "SD", "SEARCH-OPTIONS", "SEARCH-TEXT", "SEARCH", "SECONDS-FROM-FORMATTED-TIME", "SECONDS-PAST-MIDNIGHT", "SECONDS", "SECTION", "SECURE", "SECURITY", "SEGMENT-LIMIT", "SEGMENT", "SELECT-ALL", "SELECTION-INDEX", "SELECTION-TEXT", "SELECT", "SELF-ACT", "SELF", "SEND", "SENTENCE", "SEPARATE", "SEPARATION", "SEQUENCE", "SEQUENTIAL", "SET", "SHADING", "SHADOW", "SHARING", "SHORT-DATE", "SHOW-LINES", "SHOW-NONE", "SHOW-SEL-ALWAYS", "SIGNED-INT", "SIGNED-LONG", "SIGNED-SHORT", "SIGNED", "SIGN", "SIN", "SIZE", "SMALL-FONT", "SORT-MERGE", "SORT-ORDER", "SORT-RETURN", "SORT", "SOURCE-COMPUTER", "SOURCES", "SOURCE", "SPACE-FILL", "SPACES", "SPACE", "SPECIAL-NAMES", "SPINNER", "SQRT", "SQUARE", "STANDARD-1", "STANDARD-2", "STANDARD-BINARY", "STANDARD-COMPARE", "STANDARD-DECIMAL", "STANDARD-DEVIATION", "STANDARD", "START-X", "START", "START-Y", "STATEMENT", "STATIC-LIST", "STATIC", "STATUS-BAR", "STATUS-TEXT", "STATUS", "STDCALL", "STDERR", "STDIN", "STDOUT", "STEP", "STOP", "STORED-CHAR-LENGTH", "STRING", "STRONG", "STYLE", "SUB-QUEUE-1", "SUB-QUEUE-2", "SUB-QUEUE-3", "SUBSTITUTE-CASE", "SUBSTITUTE", "SUBTRACT", "SUBWINDOW", "SUM", "SUM", "SUPER", "SUPPRESS", "SWITCH-0", "SWITCH-10", "SWITCH-11", "SWITCH-12", "SWITCH-13", "SWITCH-14", "SWITCH-15", "SWITCH-16", "SWITCH-17", "SWITCH-18", "SWITCH-19", "SWITCH-1", "SWITCH-20", "SWITCH-21", "SWITCH-22", "SWITCH-23", "SWITCH-24", "SWITCH-25", "SWITCH-26", "SWITCH-27", "SWITCH-28", "SWITCH-29", "SWITCH-2", "SWITCH-30", "SWITCH-31", "SWITCH-32", "SWITCH-33", "SWITCH-34", "SWITCH-35", "SWITCH-36", "SWITCH-3", "SWITCH-4", "SWITCH-5", "SWITCH-6", "SWITCH-7", "SWITCH-8", "SWITCH-9", "SYMBOLIC", "SYMBOL", "SYNCHRONISED", "SYNCHRONIZED", "SYNC", "SYSERR", "SYSIN", "SYSIPT", "SYSLIST", "SYSLST", "SYSOUT", "SYSTEM", "SYSTEM-DEFAULT", "SYSTEM-OFFSET",
"TABLE", "TAB-TO-ADD", "TAB-TO-DELETE", "TAB", "TALLYING", "TALLY", "TAN", "TAPE", "TEMPORARY", "TERMINATE", "TERMINATION-VALUE", "TEST-DATE-YYYYMMDD", "TEST-DAY-YYYYDDD", "TEST-FORMATTED-DATETIME", "TEST-NUMVAL-C", "TEST-NUMVAL-F", "TEST-NUMVAL", "TEXT", "THAN", "THEN", "THREADS", "THREAD", "THROUGH", "THRU", "THUMB-POSITION", "TILED-HEADINGS", "TIMEOUT", "TIME-OUT", "TIMES", "TIME", "TITLE-POSITION", "TITLE", "TOP", "TOWARD-GREATER", "TOWARD-LESSER", "TO", "TRADITIONAL-FONT", "TRAILING-SHIFT", "TRAILING-SIGN", "TRAILING", "TRANSFORM", "TRANSPARENT", "TREE-VIEW", "TRIM", "TRUE", "TRUNCATION", "TYPEDEF", "TYPE",
"U", "UCS-4", "UNBOUNDED", "UNDERLINE", "UNFRAMED", "UNIT", "UNIVERSAL", "UNLOCK", "UNSIGNED-INT", "UNSIGNED-LONG", "UNSIGNED-SHORT", "UNSIGNED", "UNSORTED", "UNSTRING", "UNTIL", "UPDATE", "UPON", "UPPER-CASE", "UPPER", "UP", "USAGE", "USE-ALT", "USER-DEFAULT", "USE-RETURN", "USER", "USE-TAB", "USE", "USING", "UTF-16", "UTF-8",
"V", "VALIDATE-STATUS", "VALIDATE", "VALID", "VAL-STATUS", "VALUE-FORMAT", "VALUES", "VALUE", "VARIABLE", "VARIANCE", "VARIANT", "VARYING", "VERTICAL", "VERY-HEAVY", "VIRTUAL-WIDTH", "VPADDING", "VSCROLL-BAR", "VSCROLL-POS", "VSCROLL", "VTOP",
"WAIT", "WEB-BROWSER", "WHEN-COMPILED", "WHEN", "WIDTH-IN-CELLS", "WIDTH", "WINDOW", "WITH", "WORDS", "WORKING-STORAGE", "WRAP", "WRITE",
"X", "X\"91\"", "X\"E4\"", "X\"E5\"", "X\"F4\"", "X\"F5",
"Y", "YEAR-TO-YYYY", "YYYYDDD", "YYYYMMDD",
"ZEROES", "ZERO-FILL", "ZEROS", "ZERO",
};
int st_cobol_color(int prev_state, int *state, const char *text, int length) {
if (prev_state == st_cobol_line_comment) {
if (text[0] == '\n') {
*state = st_cobol_default;
return st_color_default;
}
return st_color_comment;
}
if (prev_state == st_cobol_string) {
if (text[0] == '"') {
*state = st_cobol_default;
}
return st_color_string;
}
if (prev_state == st_cobol_char) {
if (text[0] == '\'') {
*state = st_cobol_default;
}
return st_color_string;
}
if (prev_state == st_cobol_default) {
if (text[0] == '*') {
*state = st_cobol_line_comment;
return st_color_comment;
} else if (isdigit(text[0])) {
*state = st_cobol_number;
return st_color_number;
} else if (is_ident(text[0])) {
int is_keyword = 0;
int ident_length = 1;
for (int i = 1; i < length; i++) {
if (!is_ident(text[i])) {
break;
}
ident_length++;
}
char buffer[ident_length + 1];
memcpy(buffer, text, ident_length);
buffer[ident_length] = '\0';
for (int i = 0; i < (int)(sizeof(keywords) / sizeof(const char *)); i++) {
if ((int)(strlen(keywords[i])) == ident_length)
if (!strncmp(keywords[i], buffer, ident_length)) {
is_keyword = 1;
break;
}
}
*state = st_cobol_ident;
if (is_keyword) {
return st_color_keyword;
} else {
return st_color_default;
}
}
}
if (strchr("+*/%=&|^!?:.,;><\\~", text[0])) {
*state = st_cobol_default;
return st_color_symbol;
}
if (isspace(text[0]) || strchr("()[]{}\n", text[0])) {
*state = st_cobol_default;
return st_color_default;
}
if (text[0] == '"') {
*state = st_cobol_string;
return st_color_string;
}
if (text[0] == '\'') {
*state = st_cobol_char;
return st_color_string;
}
return st_color_none;
}