Support shell and autoconf highlighting
Makefile.am
| 11 | 11 | gitile/handler.scm \ | |
| 12 | 12 | gitile/pages.scm \ | |
| 13 | 13 | gitile/repo.scm \ | |
| 14 | - | gitile/highlight/utils.scm \ | |
| 15 | - | gitile/highlight/gitignore.scm | |
| 14 | + | gitile/highlight/gitignore.scm \ | |
| 15 | + | gitile/highlight/shell.scm \ | |
| 16 | + | gitile/highlight/utils.scm | |
| 16 | 17 | ||
| 17 | 18 | clean-go: | |
| 18 | 19 | find . -name '*.go' -delete |
assets/css/highlight.css
| 21 | 21 | color: var(--string); | |
| 22 | 22 | } | |
| 23 | 23 | ||
| 24 | - | .syntax-keyword { | |
| 24 | + | .syntax-keyword, .syntax-builtin { | |
| 25 | 25 | color: var(--keyword2); | |
| 26 | 26 | font-weight: bold; | |
| 27 | 27 | } | |
| 28 | 28 | ||
| 29 | + | .syntax-variable { | |
| 30 | + | color: var(--keyword); | |
| 31 | + | } | |
| 32 | + | ||
| 29 | 33 | /* language-specific */ | |
| 30 | 34 | ||
| 31 | 35 | /*** |
gitile/code.scm
| 21 | 21 | #:use-module (syntax-highlight) | |
| 22 | 22 | #:use-module (syntax-highlight scheme) | |
| 23 | 23 | #:use-module (gitile highlight gitignore) | |
| 24 | + | #:use-module (gitile highlight shell) | |
| 24 | 25 | #:use-module ((gitile highlight utils) #:prefix gitile:) | |
| 25 | 26 | #:export (display-code | |
| 26 | 27 | display-formatted-code)) | |
… | |||
| 30 | 31 | (language (match extension | |
| 31 | 32 | ("scm" "scheme") | |
| 32 | 33 | ("gitignore" "gitignore") | |
| 33 | - | (_ "unknown")))) | |
| 34 | + | ("sh" "shell") | |
| 35 | + | ("bash" "shell") | |
| 36 | + | ("m4" "m4") | |
| 37 | + | ("ac" "ac") | |
| 38 | + | (_ (match (basename path) | |
| 39 | + | ("bootstrap" "shell") | |
| 40 | + | (_ "unknown")))))) | |
| 34 | 41 | `(table (@ (class ,(string-append "file-content language-" language))) | |
| 35 | 42 | ,@(split-tr (gitile:highlights->sxml (highlight-code content language)))))) | |
| 36 | 43 | ||
… | |||
| 39 | 46 | ||
| 40 | 47 | (define (highlight-code content language) | |
| 41 | 48 | (match language | |
| 42 | - | ("scheme" (highlight lex-scheme content)) | |
| 49 | + | ("scheme" (highlight (lambda (tokens cursor) (lex-scheme tokens cursor)) content)) | |
| 50 | + | ("shell" (highlight lex-shell content)) | |
| 43 | 51 | ("gitignore" (highlight lex-gitignore content)) | |
| 52 | + | ("m4" (highlight lex-m4 content)) | |
| 53 | + | ("ac" (highlight lex-autoconf content)) | |
| 44 | 54 | (_ (list content)))) | |
| 45 | 55 | ||
| 46 | 56 | (define (split-lines content) | |
gitile/highlight/shell.scm unknown status 1
| 1 | + | ;;;; Copyright (C) 2021 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | ;;;; | |
| 3 | + | ;;;; SPDX-License-Identifier: AGPL-3.0-or-later | |
| 4 | + | ;;;; | |
| 5 | + | ;;;; This program is free software: you can redistribute it and/or modify | |
| 6 | + | ;;;; it under the terms of the GNU Affero General Public License as published by | |
| 7 | + | ;;;; the Free Software Foundation, either version 3 of the License, or | |
| 8 | + | ;;;; (at your option) any later version. | |
| 9 | + | ;;;; | |
| 10 | + | ;;;; This program is distributed in the hope that it will be useful, | |
| 11 | + | ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 | + | ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 13 | + | ;;;; GNU Affero General Public License for more details. | |
| 14 | + | ;;;; | |
| 15 | + | ;;;; You should have received a copy of the GNU Affero General Public License | |
| 16 | + | ;;;; along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 17 | + | ;;;; | |
| 18 | + | ||
| 19 | + | (define-module (gitile highlight shell) | |
| 20 | + | #:use-module (ice-9 match) | |
| 21 | + | #:use-module (srfi srfi-1) | |
| 22 | + | #:use-module (srfi srfi-11) | |
| 23 | + | #:use-module (srfi srfi-26) | |
| 24 | + | #:use-module (syntax-highlight lexers) | |
| 25 | + | #:use-module (gitile highlight utils) | |
| 26 | + | #:export (%shell-builtins | |
| 27 | + | %shell-keywords | |
| 28 | + | make-shell-lexer | |
| 29 | + | lex-shell | |
| 30 | + | make-m4-lexer | |
| 31 | + | lex-m4 | |
| 32 | + | lex-autoconf)) | |
| 33 | + | ||
| 34 | + | (define %variable-char-set char-set:letter+digit) | |
| 35 | + | ||
| 36 | + | (define %shell-builtins | |
| 37 | + | '("alias" "bg" "bind" "break" "builtin" "caller" "cd" "command" "compgen" | |
| 38 | + | "complete" "declare" "dirs" "disown" "echo" "enable" "eval" "exec" "exit" | |
| 39 | + | "export" "false" "fc" "fg" "getopts" "hash" "help" "history" "jobs" "kill" | |
| 40 | + | "let" "local" "logout" "popd" "printf" "pushd" "pwd" "read" "readonly" "set" | |
| 41 | + | "shift" "shopt" "source" "suspend" "test" "time" "times" "trap" "true" | |
| 42 | + | "type" "typeset" "ulimit" "umask" "unalias" "unset" "wait")) | |
| 43 | + | (define %shell-keywords | |
| 44 | + | '("if" "fi" "else" "while" "in" "do" "done" "for" "then" "return" "function" | |
| 45 | + | "case" "select" "continue" "until" "esac" "elif")) | |
| 46 | + | ||
| 47 | + | (define (make-shell-lexer builtins keywords) | |
| 48 | + | (define lex-shell-math | |
| 49 | + | (lex-any | |
| 50 | + | (lex-tag 'operator | |
| 51 | + | (apply lex-any (map lex-string | |
| 52 | + | '("-" "+" "*" "/" "%" "^" "|" "&" "||" "**")))) | |
| 53 | + | (lex-tag 'number (lex-all | |
| 54 | + | (lex-char-set char-set:digit) | |
| 55 | + | (lex-string "#") | |
| 56 | + | (lex-char-set char-set:digit))) | |
| 57 | + | (lex-tag 'number (lex-char-set char-set:digit)) | |
| 58 | + | shell-root-lexer)) | |
| 59 | + | (define (shell-math-lexer tokens cursor) | |
| 60 | + | (lex-shell-math tokens cursor)) | |
| 61 | + | ||
| 62 | + | (define lex-shell-curly | |
| 63 | + | (lex-any | |
| 64 | + | (lex-tag 'keyword (lex-string ":-")) | |
| 65 | + | (lex-tag 'variable (lex-char-set %variable-char-set)) | |
| 66 | + | (lex-char-set (char-set-complement (char-set #\} #\: #\" #\' #\` #\" #\\))) | |
| 67 | + | (lex-string ":") | |
| 68 | + | shell-root-lexer)) | |
| 69 | + | (define (shell-curly-lexer tokens cursor) | |
| 70 | + | (lex-shell-curly tokens cursor)) | |
| 71 | + | ||
| 72 | + | (define lex-shell-interp | |
| 73 | + | (lex-any | |
| 74 | + | (lex-all (lex-tag 'keyword (lex-string "$((")) | |
| 75 | + | (lex-consume-until | |
| 76 | + | (lex-tag 'keyword (lex-string "))")) | |
| 77 | + | shell-math-lexer)) | |
| 78 | + | (lex-all (lex-tag 'keyword (lex-string "$(")) | |
| 79 | + | (lex-consume-until | |
| 80 | + | (lex-tag 'keyword (lex-string ")")) | |
| 81 | + | shell-root-lexer)) | |
| 82 | + | (lex-all (lex-tag 'keyword (lex-string "${")) | |
| 83 | + | (lex-maybe (lex-tag 'keyword (lex-string "#"))) | |
| 84 | + | (lex-consume-until | |
| 85 | + | (lex-tag 'keyword (lex-string "}")) | |
| 86 | + | shell-curly-lexer)) | |
| 87 | + | (lex-tag 'variable (lex-all (lex-string "$") (lex-char-set %variable-char-set))) | |
| 88 | + | (lex-tag 'builtin | |
| 89 | + | (apply lex-any | |
| 90 | + | (map lex-string '("$#" "$$" "$?" "$!" "$_" "$*" "$@" | |
| 91 | + | "$-" "$0" "$1" "$2" "$3" "$4" "$5" | |
| 92 | + | "$6" "$7" "$8" "$9")))) | |
| 93 | + | (lex-string "$"))) | |
| 94 | + | (define (shell-interp-lexer tokens cursor) | |
| 95 | + | (lex-shell-interp tokens cursor)) | |
| 96 | + | ||
| 97 | + | (define lex-shell-string | |
| 98 | + | (lex-any | |
| 99 | + | (apply lex-any (map lex-string '("\\" "\\." "\\$"))) | |
| 100 | + | (lex-all (lex-string "\\") (lex-char-set (char-set #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7))) | |
| 101 | + | (lex-char-set (char-set-complement (char-set #\" #\\ #\$))) | |
| 102 | + | shell-interp-lexer)) | |
| 103 | + | (define (shell-string-lexer tokens cursor) | |
| 104 | + | (lex-shell-string tokens cursor)) | |
| 105 | + | ||
| 106 | + | (define (shell-heredoc-lexer tokens cursor) | |
| 107 | + | (define (get-delimiter str start) | |
| 108 | + | (let ((len (string-length str))) | |
| 109 | + | (let loop ((index start)) | |
| 110 | + | (cond | |
| 111 | + | ((>= index len) (substring str start len)) | |
| 112 | + | ((char-set-contains? (char-set-union %variable-char-set (char-set #\$)) | |
| 113 | + | (string-ref str index)) | |
| 114 | + | (loop (1+ index))) | |
| 115 | + | (else (substring str start index)))))) | |
| 116 | + | ||
| 117 | + | (let*-values (((result remainder) | |
| 118 | + | ((lex-all (lex-tag 'operator (lex-string "<<")) | |
| 119 | + | (lex-maybe (lex-tag 'operator (lex-string "-"))) | |
| 120 | + | (lex-maybe lex-whitespace) | |
| 121 | + | (lex-maybe (lex-string "\\"))) | |
| 122 | + | tokens cursor))) | |
| 123 | + | (if result | |
| 124 | + | (let* ((delimiter (get-delimiter (cursor-text remainder) | |
| 125 | + | (cursor-position remainder))) | |
| 126 | + | (result (token-add tokens delimiter)) | |
| 127 | + | (remainder (move-cursor-by cursor (string-length delimiter)))) | |
| 128 | + | (if (equal? delimiter "") | |
| 129 | + | (fail) | |
| 130 | + | ((lex-consume-until | |
| 131 | + | (lex-string delimiter) | |
| 132 | + | shell-string-lexer | |
| 133 | + | #:tag 'string) result remainder))) | |
| 134 | + | (values result remainder)))) | |
| 135 | + | ||
| 136 | + | (define lex-root | |
| 137 | + | (lex-any | |
| 138 | + | (lex-char-set char-set:whitespace) | |
| 139 | + | (lex-tag 'builtin (lex-filter | |
| 140 | + | (lambda (str) | |
| 141 | + | (any (cut string=? <> str) builtins)) | |
| 142 | + | (lex-char-set %variable-char-set))) | |
| 143 | + | (lex-tag 'keyword (lex-filter | |
| 144 | + | (lambda (str) | |
| 145 | + | (any (cut string=? <> str) keywords)) | |
| 146 | + | (lex-char-set %variable-char-set))) | |
| 147 | + | (lex-tag 'comment (lex-delimited "#" #:until "\n")) | |
| 148 | + | (lex-all (lex-tag 'variable (lex-char-set %variable-char-set)) | |
| 149 | + | (lex-char-set char-set:whitespace) | |
| 150 | + | (lex-maybe (lex-string "+")) | |
| 151 | + | (lex-string "=")) | |
| 152 | + | (lex-tag 'keyword (lex-string "`")) | |
| 153 | + | (lex-tag 'string (lex-delimited "'" #:escape #f)) | |
| 154 | + | (lex-tag 'string (lex-delimited "$'" #:until "'" #:escape #f)) | |
| 155 | + | (lex-all (lex-tag 'string (lex-any (lex-string "\"") (lex-string "$\""))) | |
| 156 | + | (lex-consume-until | |
| 157 | + | (lex-string "\"") | |
| 158 | + | shell-string-lexer | |
| 159 | + | #:tag 'string)) | |
| 160 | + | (lex-tag 'operator | |
| 161 | + | (apply lex-any (map lex-string '("[" "]" "{" "}" "(" ")" "=")))) | |
| 162 | + | (lex-tag 'operator (lex-string "<<<")) | |
| 163 | + | shell-heredoc-lexer | |
| 164 | + | (lex-tag 'operator (lex-string "&&")) | |
| 165 | + | (lex-tag 'operator (lex-string "||")) | |
| 166 | + | (lex-string ";") | |
| 167 | + | (lex-string "&") | |
| 168 | + | (lex-string "|") | |
| 169 | + | (lex-char-set char-set:digit) | |
| 170 | + | (lex-string "\\\n") | |
| 171 | + | (lex-char-set | |
| 172 | + | (char-set-complement | |
| 173 | + | (char-set #\= #\[ #\] #\{ #\} #\( #\) #\$ #\" #\' #\` #\\ #\< #\& #\| #\; #\newline))) | |
| 174 | + | (lex-string "<") | |
| 175 | + | shell-interp-lexer)) | |
| 176 | + | (define (shell-root-lexer tokens cursor) | |
| 177 | + | (lex-root tokens cursor)) | |
| 178 | + | ||
| 179 | + | shell-root-lexer) | |
| 180 | + | ||
| 181 | + | (define (lex-shell tokens cursor) | |
| 182 | + | ((lex-consume | |
| 183 | + | (make-shell-lexer %shell-builtins %shell-keywords)) | |
| 184 | + | tokens cursor)) | |
| 185 | + | ||
| 186 | + | (define %macro-char-set (char-set-union char-set:letter+digit (char-set #\_))) | |
| 187 | + | ||
| 188 | + | (define %m4-builtin-macros | |
| 189 | + | '("define" "undefine" "defn" "pushdef" "popdef" "ifdef" "shift" | |
| 190 | + | "changequote" "changecom" "divert" "undivert" "ifelse" | |
| 191 | + | "incr" "decr" "eval" "len" "dlen" "index" "index" "substr" "translit" | |
| 192 | + | "include" "sinclude" "syscmd" "maketemp" "m4exit" "m4wrap" "errprint" | |
| 193 | + | "dumpdef" "traceon" "traceoff" "divnum" "sysval")) | |
| 194 | + | ||
| 195 | + | ;; @defmacro in doc/autoconf.texi (autoconf sources) | |
| 196 | + | (define %autoconf-builtin-macros | |
| 197 | + | '("AC_INIT" "AC_PACKAGE_NAME" "PACKAGE_NAME" "AC_PACKAGE_TARNAME" | |
| 198 | + | "PACKAGE_TARNAME" "AC_PACKAGE_VERSION" "PACKAGE_VERSION" | |
| 199 | + | "AC_PACKAGE_STRING" "PACKAGE_STRING" "AC_PACKAGE_BUGREPORT" | |
| 200 | + | "PACKAGE_BUGREPORT" "AC_PACKAGE_URL" "PACKAGE_URL" | |
| 201 | + | "AC_PREREQ" "AC_AUTOCONF_VERSION" "AC_COPYRIGHT" "AC_REVISION" "AC_CONFIG_SRCDIR" | |
| 202 | + | "AC_CONFIG_MACRO_DIRS" "AC_CONFIG_MACRO_DIR" "AC_CONFIG_AUX_DIR" "AC_REQUIRE_AUX_FILE" | |
| 203 | + | "AC_OUTPUT" "AC_PROG_MAKE_SET" "AC_CONFIG_FILES" "AC_CONFIG_HEADERS" "AH_HEADER" | |
| 204 | + | "AH_TEMPLATE" "AH_VERBATIM" "AH_TOP" "AH_BOTTOM" "AC_CONFIG_COMMANDS" | |
| 205 | + | "AC_CONFIG_COMMANDS_PRE" "AC_CONFIG_COMMANDS_POST" "AC_CONFIG_LINKS" | |
| 206 | + | "AC_CONFIG_SUBDIRS" "AC_PREFIX_DEFAULT" "AC_PREFIX_PROGRAM" "AC_INCLUDES_DEFAULT" | |
| 207 | + | "AC_CHECK_INCLUDES_DEFAULT" "AC_PROG_AWK" "AC_PROG_GREP" "AC_PROG_EGREP" | |
| 208 | + | "AC_PROG_FGREP" "AC_PROG_INSTALL" "AC_PROG_MKDIR_P" "AC_PROG_LEX" "AC_PROG_LN_S" | |
| 209 | + | "AC_PROG_RANLIB" "AC_PROG_SED" "AC_PROG_YACC" "AC_CHECK_PROG" "AC_CHECK_PROGS" | |
| 210 | + | "AC_CHECK_TARGET_TOOL" "AC_CHECK_TOOL" "AC_CHECK_TARGET_TOOLS" "AC_CHECK_TOOLS" | |
| 211 | + | "AC_PATH_PROG" "AC_PATH_PROGS" "AC_PATH_PROGS_FEATURE_CHECK" "AC_PATH_TARGET_TOOL" | |
| 212 | + | "AC_PATH_TOOL" "AC_CHECK_FILE" "AC_CHECK_FILES" "AC_CHECK_LIB" "AC_SEARCH_LIBS" | |
| 213 | + | "AC_FUNC_ALLOCA" "AC_FUNC_CHOWN" "AC_FUNC_CLOSEDIR_VOID" "AC_FUNC_ERROR_AT_LINE" | |
| 214 | + | "AC_FUNC_FNMATCH" "AC_FUNC_FNMATCH_GNU" "AC_FUNC_FORK" "AC_FUNC_FSEEKO" | |
| 215 | + | "AC_FUNC_GETGROUPS" "AC_FUNC_GETLOADAVG" "AC_FUNC_GETMNTENT" "AC_FUNC_GETPGRP" | |
| 216 | + | "AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK" "AC_FUNC_MALLOC" "AC_FUNC_MBRTOWC" | |
| 217 | + | "AC_FUNC_MEMCMP" "AC_FUNC_MKTIME" "AC_FUNC_MMAP" "AC_FUNC_OBSTACK" | |
| 218 | + | "AC_FUNC_REALLOC" "AC_FUNC_SELECT_ARGTYPES" "AC_FUNC_SETPGRP" "AC_FUNC_STAT" | |
| 219 | + | "AC_FUNC_LSTAT" "AC_FUNC_STRCOLL" "AC_FUNC_STRERROR_R" "AC_FUNC_STRFTIME" | |
| 220 | + | "AC_FUNC_STRTOD" "AC_FUNC_STRTOLD" "AC_FUNC_STRNLEN" "AC_FUNC_UTIME_NULL" | |
| 221 | + | "AC_FUNC_VPRINTF" "AC_REPLACE_FNMATCH" "AC_CHECK_FUNC" "AC_CHECK_FUNCS" | |
| 222 | + | "AC_CHECK_FUNCS_ONCE" "AC_LIBOBJ" "AC_LIBSOURCE" "AC_LIBSOURCES" | |
| 223 | + | "AC_CONFIG_LIBOBJ_DIR" "AC_REPLACE_FUNCS" "AC_CHECK_HEADER_STDBOOL" | |
| 224 | + | "AC_HEADER_ASSERT" "AC_HEADER_DIRENT" "AC_HEADER_MAJOR" "AC_HEADER_RESOLV" | |
| 225 | + | "AC_HEADER_STAT" "AC_HEADER_STDBOOL" "AC_HEADER_STDC" "AC_HEADER_SYS_WAIT" | |
| 226 | + | "AC_HEADER_TIOCGWINSZ" "AC_CHECK_HEADER" "AC_CHECK_HEADERS" "AC_CHECK_HEADERS_ONCE" | |
| 227 | + | "AC_CHECK_DECL" "AC_CHECK_DECLS" "AC_CHECK_DECLS_ONCE" "AC_STRUCT_DIRENT_D_INO" | |
| 228 | + | "AC_STRUCT_DIRENT_D_TYPE" "AC_STRUCT_ST_BLOCKS" "AC_STRUCT_TM" "AC_STRUCT_TIMEZONE" | |
| 229 | + | "AC_CHECK_MEMBER" "AC_CHECK_MEMBERS" "AC_TYPE_GETGROUPS" "AC_TYPE_INT8_T" | |
| 230 | + | "AC_TYPE_INT16_T" "AC_TYPE_INT32_T" "AC_TYPE_INT64_T" "AC_TYPE_INTMAX_T" | |
| 231 | + | "AC_TYPE_INTPTR_T" "AC_TYPE_LONG_DOUBLE" "AC_TYPE_LONG_DOUBLE_WIDER" | |
| 232 | + | "AC_TYPE_LONG_LONG_INT" "AC_TYPE_MBSTATE_T" "AC_TYPE_MODE_T" "AC_TYPE_OFF_T" | |
| 233 | + | "AC_TYPE_PID_T" "AC_TYPE_SIZE_T" "AC_TYPE_SSIZE_T" "AC_TYPE_UID_T" | |
| 234 | + | "AC_TYPE_UINT8_T" "AC_TYPE_UINT16_T" "AC_TYPE_UINT32_T" "AC_TYPE_UINT64_T" | |
| 235 | + | "AC_TYPE_UINTMAX_T" "AC_TYPE_UINTPTR_T" "AC_TYPE_UNSIGNED_LONG_LONG_INT" | |
| 236 | + | "AC_CHECK_TYPE" "AC_CHECK_TYPES" "AC_CHECK_SIZEOF" "AC_CHECK_ALIGNOF" | |
| 237 | + | "AC_COMPUTE_INT" "AC_LANG_WERROR" "AC_OPENMP" "AC_PROG_CC" "AC_PROG_CC_C_O" | |
| 238 | + | "AC_PROG_CPP" "AC_PROG_CPP_WERROR" "AC_C_BACKSLASH_A" "AC_C_BIGENDIAN" | |
| 239 | + | "AC_C_CONST" "AC_C__GENERIC" "AC_C_RESTRICT" "AC_C_VOLATILE" "AC_C_INLINE" | |
| 240 | + | "AC_C_CHAR_UNSIGNED" "AC_C_STRINGIZE" "AC_C_FLEXIBLE_ARRAY_MEMBER" | |
| 241 | + | "AC_C_VARARRAYS" "AC_C_TYPEOF" "AC_C_PROTOTYPES" "AC_PROG_GCC_TRADITIONAL" | |
| 242 | + | "AC_PROG_CXX" "AC_PROG_CXXCPP" "AC_PROG_CXX_C_O" "AC_PROG_OBJC" "AC_PROG_OBJCPP" | |
| 243 | + | "AC_PROG_OBJCXX" "AC_PROG_OBJCXXCPP" "AC_ERLANG_PATH_ERLC" "AC_ERLANG_NEED_ERLC" | |
| 244 | + | "AC_ERLANG_PATH_ERL" "AC_ERLANG_NEED_ERL" "AC_PROG_F77" "AC_PROG_FC" | |
| 245 | + | "AC_PROG_F77_C_O" "AC_PROG_FC_C_O" "AC_F77_LIBRARY_LDFLAGS" "AC_FC_LIBRARY_LDFLAGS" | |
| 246 | + | "AC_F77_DUMMY_MAIN" "AC_FC_DUMMY_MAIN" "AC_F77_MAIN" "AC_FC_MAIN" "AC_F77_WRAPPERS" | |
| 247 | + | "AC_FC_WRAPPERS" "AC_F77_FUNC" "AC_FC_FUNC" "AC_FC_SRCEXT" "AC_FC_PP_SRCEXT" | |
| 248 | + | "AC_FC_PP_DEFINE" "AC_FC_FREEFORM" "AC_FC_FIXEDFORM" "AC_FC_LINE_LENGTH" | |
| 249 | + | "AC_FC_CHECK_BOUNDS" "AC_F77_IMPLICIT_NONE" "AC_FC_IMPLICIT_NONE" | |
| 250 | + | "AC_FC_MODULE_EXTENSION" "AC_FC_MODULE_FLAG" "AC_FC_MODULE_OUTPUT_FLAG" | |
| 251 | + | "AC_PROG_GO" "AC_PATH_X" "AC_PATH_XTRA" "AC_SYS_INTERPRETER" "AC_SYS_LARGEFILE" | |
| 252 | + | "AC_SYS_LONG_FILE_NAMES" "AC_SYS_POSIX_TERMIOS" "AC_USE_SYSTEM_EXTENSIONS" | |
| 253 | + | "AC_ERLANG_SUBST_ERTS_VER" "AC_ERLANG_SUBST_ROOT_DIR" "AC_ERLANG_SUBST_LIB_DIR" | |
| 254 | + | "AC_ERLANG_CHECK_LIB" "AC_ERLANG_SUBST_INSTALL_LIB_DIR" | |
| 255 | + | "AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR" "AC_LANG" "AC_LANG_PUSH" "AC_LANG_POP" | |
| 256 | + | "AC_LANG_ASSERT" "AC_REQUIRE_CPP" "AC_LANG_CONFTEST" "AC_LANG_DEFINES_PROVIDED" | |
| 257 | + | "AC_LANG_SOURCE" "AC_LANG_PROGRAM" "AC_LANG_CALL" "AC_LANG_FUNC_LINK_TRY" | |
| 258 | + | "AC_PREPROC_IFELSE" "AC_EGREP_HEADER" "AC_EGREP_CPP" "AC_COMPILE_IFELSE" | |
| 259 | + | "AC_LINK_IFELSE" "AC_RUN_IFELSE" "AC_DEFINE" "AC_DEFINE" "AC_DEFINE_UNQUOTED" | |
| 260 | + | "AC_DEFINE_UNQUOTED" "AC_SUBST" "AC_SUBST_FILE" "AC_ARG_VAR" "AC_CACHE_VAL" | |
| 261 | + | "AC_CACHE_CHECK" "AC_CACHE_LOAD" "AC_CACHE_SAVE" "AC_MSG_CHECKING" | |
| 262 | + | "AC_MSG_RESULT" "AC_MSG_NOTICE" "AC_MSG_ERROR" "AC_MSG_FAILURE" "AC_MSG_WARN" | |
| 263 | + | "__file__" "__line__" "__oline__" "dnl" "m4_bpatsubst" "m4_bregexp" | |
| 264 | + | "m4_copy" "m4_copy_force" "m4_rename" "m4_rename_force" "m4_defn" | |
| 265 | + | "m4_divert" "m4_dumpdef" "m4_dumpdefs" "m4_esyscmd_s" "m4_exit" "m4_if" | |
| 266 | + | "m4_include" "m4_sinclude" "m4_mkstemp" "m4_maketemp" "m4_popdef" | |
| 267 | + | "m4_undefine" "m4_undivert" "m4_wrap" "m4_wrap_lifo" "m4_assert" "m4_errprintn" | |
| 268 | + | "m4_fatal" "m4_location" "m4_warn" "m4_cleardivert" "m4_divert_once" | |
| 269 | + | "m4_divert_pop" "m4_divert_push" "m4_divert_text" "m4_init" "m4_bmatch" | |
| 270 | + | "m4_bpatsubsts" "m4_case" "m4_cond" "m4_default" "m4_default_quoted" | |
| 271 | + | "m4_default_nblank" "m4_default_nblank_quoted" "m4_define_default" | |
| 272 | + | "m4_ifblank" "m4_ifnblank" "m4_ifndef" "m4_ifset" "m4_ifval" "m4_ifvaln" | |
| 273 | + | "m4_n" "m4_argn" "m4_car" "m4_cdr" "m4_for" "m4_foreach" "m4_foreach_w" | |
| 274 | + | "m4_map" "m4_mapall" "m4_map_sep" "m4_mapall_sep" "m4_map_args" | |
| 275 | + | "m4_map_args_pair" "m4_map_args_sep" "m4_map_args_w" "m4_shiftn" "m4_shift2" | |
| 276 | + | "m4_shift3" "m4_stack_foreach" "m4_stack_foreach_lifo" "m4_stack_foreach_sep" | |
| 277 | + | "m4_stack_foreach_sep_lifo" "m4_apply" "m4_count" "m4_curry" "m4_do" | |
| 278 | + | "m4_dquote" "m4_dquote_elt" "m4_echo" "m4_expand" "m4_ignore" "m4_make_list" | |
| 279 | + | "m4_quote" "m4_reverse" "m4_unquote" "m4_append" "m4_append_uniq" | |
| 280 | + | "m4_append_uniq_w" "m4_chomp" "m4_chomp_all" "m4_combine" "m4_escape" | |
| 281 | + | "m4_flatten" "m4_join" "m4_joinall" "m4_newline" "m4_normalize" "m4_re_escape" | |
| 282 | + | "m4_split" "m4_strip" "m4_text_box" "m4_text_wrap" "m4_tolower" "m4_toupper" | |
| 283 | + | "m4_cmp" "m4_list_cmp" "m4_max" "m4_min" "m4_sign" "m4_version_compare" | |
| 284 | + | "m4_version_prereq" "m4_set_add" "m4_set_add_all" "m4_set_contains" | |
| 285 | + | "m4_set_contents" "m4_set_dump" "m4_set_delete" "m4_set_difference" | |
| 286 | + | "m4_set_intersection" "m4_set_union" "m4_set_empty" "m4_set_foreach" | |
| 287 | + | "m4_set_list" "m4_set_listc" "m4_set_map" "m4_set_map_sep" "m4_set_remove" | |
| 288 | + | "m4_set_size" "m4_pattern_forbid" "m4_pattern_allow" "AS_BASENAME" | |
| 289 | + | "AS_BOX" "AS_CASE" "AS_DIRNAME" "AS_ECHO" "AS_ECHO_N" "AS_ESCAPE" | |
| 290 | + | "AS_EXECUTABLE_P" "AS_EXIT" "AS_IF" "AS_MKDIR_P" "AS_SET_STATUS" "AS_TR_CPP" | |
| 291 | + | "AS_TR_SH" "AS_SET_CATFILE" "AS_UNSET" "AS_VERSION_COMPARE" "AS_LITERAL_IF" | |
| 292 | + | "AS_LITERAL_WORD_IF" "AS_VAR_APPEND" "AS_VAR_ARITH" "AS_VAR_COPY" "AS_VAR_IF" | |
| 293 | + | "AS_VAR_PUSHDEF" "AS_VAR_POPDEF" "AS_VAR_SET" "AS_VAR_SET_IF" "AS_VAR_TEST_SET" | |
| 294 | + | "AS_BOURNE_COMPATIBLE" "AS_INIT" "AS_INIT_GENERATED" "AS_LINENO_PREPARE" | |
| 295 | + | "AS_ME_PREPARE" "AS_TMPDIR" "AS_SHELL_SANITIZE" "AS_MESSAGE_FD" "AS_MESSAGE_LOG_FD" | |
| 296 | + | "AS_ORIGINAL_STDIN_FD" "AC_DEFUN" "AC_REQUIRE" "AC_BEFORE" "AC_DEFUN_ONCE" | |
| 297 | + | "AU_DEFUN" "AU_ALIAS" "AC_CANONICAL_BUILD" "AC_CANONICAL_HOST" "AC_CANONICAL_TARGET" | |
| 298 | + | "AC_PRESERVE_HELP_ORDER" "AC_ARG_WITH" "AC_ARG_ENABLE" "AS_HELP_STRING" | |
| 299 | + | "AC_DISABLE_OPTION_CHECKING" "AC_ARG_PROGRAM" "AC_AIX" "AC_ALLOCA" "AC_ARG_ARRAY" | |
| 300 | + | "AC_C_CROSS" "AC_C_LONG_DOUBLE" "AC_CANONICAL_SYSTEM" "AC_CHAR_UNSIGNED" | |
| 301 | + | "AC_CHECK_TYPE" "AC_CHECKING" "AC_COMPILE_CHECK" "AC_CONST" "AC_CROSS_CHECK" | |
| 302 | + | "AC_CYGWIN" "AC_DECL_SYS_SIGLIST" "AC_DECL_YYTEXT" "AC_DIAGNOSE" "AC_DIR_HEADER" | |
| 303 | + | "AC_DYNIX_SEQ" "AC_EXEEXT" "AC_EMXOS2" "AC_ENABLE" "AC_ERROR" "AC_FATAL" | |
| 304 | + | "AC_FIND_X" "AC_FIND_XTRA" "AC_FOREACH" "AC_FUNC_CHECK" "AC_FUNC_SETVBUF_REVERSED" | |
| 305 | + | "AC_FUNC_WAIT3" "AC_GCC_TRADITIONAL" "AC_GETGROUPS_T" "AC_GETLOADAVG" "AC_GNU_SOURCE" | |
| 306 | + | "AC_HAVE_FUNCS" "AC_HAVE_HEADERS" "AC_HAVE_LIBRARY" "AC_HAVE_POUNDBANG" | |
| 307 | + | "AC_HEADER_CHECK" "AC_HEADER_EGREP" "AC_HEADER_TIME" "AC_HELP_STRING" | |
| 308 | + | "AC_INLINE" "AC_INT_16_BITS" "AC_IRIX_SUN" "AC_ISC_POSIX" "AC_LANG_C" | |
| 309 | + | "AC_LANG_CPLUSPLUS" "AC_LANG_FORTRAN77" "AC_LANG_RESTORE" "AC_LANG_SAVE" | |
| 310 | + | "AC_LINK_FILES" "AC_LN_S" "AC_LONG_64_BITS" "AC_LONG_DOUBLE" "AC_LONG_FILE_NAMES" | |
| 311 | + | "AC_MAJOR_HEADER" "AC_MEMORY_H" "AC_MINGW32" "AC_MINIX" "AC_MINUS_C_MINUS_O" | |
| 312 | + | "AC_MMAP" "AC_MODE_T" "AC_OBJEXT" "AC_OBSOLETE" "AC_OFF_T" "AC_OUTPUT" | |
| 313 | + | "AC_OUTPUT_COMMANDS" "AC_PID_T" "AC_PREFIX" "AC_PROG_CC_C89" "AC_PROG_CC_C99" | |
| 314 | + | "AC_PROG_CC_STDC" "AC_PROGRAMS_CHECK" "AC_PROGRAMS_PATH" "AC_PROGRAM_CHECK" | |
| 315 | + | "AC_PROGRAM_EGREP" "AC_PROGRAM_PATH" "AC_REMOTE_TAPE" "AC_RESTARTABLE_SYSCALLS" | |
| 316 | + | "AC_RETSIGTYPE" "AC_RSH" "AC_SCO_INTL" "AC_SETVBUF_REVERSED" "AC_SET_MAKE" | |
| 317 | + | "AC_SIZEOF_TYPE" "AC_SIZE_T" "AC_STAT_MACROS_BROKEN" "AC_STDC_HEADERS" | |
| 318 | + | "AC_STRCOLL" "AC_STRUCT_ST_BLKSIZE" "AC_STRUCT_ST_RDEV" "AC_ST_BLKSIZE" | |
| 319 | + | "AC_ST_BLOCKS" "AC_ST_RDEV" "AC_SYS_RESTARTABLE_SYSCALLS" "AC_SYS_SIGLIST_DECLARED" | |
| 320 | + | "AC_TEST_CPP" "AC_TEST_PROGRAM" "AC_TIMEZONE" "AC_TIME_WITH_SYS_TIME" | |
| 321 | + | "AC_TRY_COMPILE" "AC_TRY_CPP" "AC_TRY_LINK" "AC_TRY_LINK_FUNC" | |
| 322 | + | "AC_TRY_RUN" "AC_TYPE_SIGNAL" "AC_UID_T" "AC_UNISTD_H" "AC_USG" "AC_UTIME_NULL" | |
| 323 | + | "AC_VALIDATE_CACHED_SYSTEM_TUPLE" "AC_VERBOSE" "AC_VFORK" "AC_VPRINTF" | |
| 324 | + | "AC_WAIT3" "AC_WARN" "AC_WARNING" "AC_WITH" "AC_WORDS_BIGENDIAN" "AC_XENIX_DIR" | |
| 325 | + | "AC_YYTEXT_POINTER" "AT_INIT" "AT_COPYRIGHT" "AT_ARG_OPTION" "AT_ARG_OPTION_ARG" | |
| 326 | + | "AT_COLOR_TESTS" "AT_TESTED" "AT_PREPARE_TESTS" "AT_PREPARE_EACH_TEST" | |
| 327 | + | "AT_TEST_HELPER_FN" "AT_BANNER" "AT_SETUP" "AT_KEYWORDS" "AT_CAPTURE_FILE" | |
| 328 | + | "AT_FAIL_IF" "AT_SKIP_IF" "AT_XFAIL_IF" "AT_CLEANUP" "AT_DATA" "AT_DATA_UNQUOTED" | |
| 329 | + | "AT_CHECK" "AT_CHECK_UNQUOTED" "AT_CHECK_EUNIT" "AC_CONFIG_TESTDIR")) | |
| 330 | + | ||
| 331 | + | (define (make-m4-lexer base-lexer builtins quote-in quote-out) | |
| 332 | + | (define lex-macro-argument | |
| 333 | + | (lex-any | |
| 334 | + | (lex-tag 'comment (lex-delimited "#" #:until "\n")) | |
| 335 | + | (lex-tag 'comment (lex-delimited "dnl" #:until "\n")) | |
| 336 | + | (lex-tag 'comment (lex-delimited "DNL" #:until "\n")) | |
| 337 | + | (lex-string ",") | |
| 338 | + | lex-whitespace | |
| 339 | + | (lex-delimited quote-in #:until quote-out #:nested? #t) | |
| 340 | + | (lex-char-set (char-set-complement (char-set #\,))))) | |
| 341 | + | ||
| 342 | + | (define lex-macro | |
| 343 | + | (lex-all | |
| 344 | + | (lex-any | |
| 345 | + | (lex-tag 'builtin (lex-filter | |
| 346 | + | (lambda (str) | |
| 347 | + | (pk 'builtin? str) | |
| 348 | + | (any (cut string=? <> str) builtins)) | |
| 349 | + | (lex-char-set %macro-char-set))) | |
| 350 | + | (lex-tag 'variable (lex-char-set %macro-char-set))) | |
| 351 | + | (lex-maybe (lex-all | |
| 352 | + | (lex-tag 'open (lex-string "(")) | |
| 353 | + | (lex-consume-until | |
| 354 | + | (lex-tag 'close (lex-string ")")) | |
| 355 | + | lex-macro-argument))))) | |
| 356 | + | ||
| 357 | + | (lex-consume | |
| 358 | + | (lex-any | |
| 359 | + | (lex-tag 'comment (lex-delimited "#" #:until "\n")) | |
| 360 | + | (lex-tag 'comment (lex-delimited "dnl" #:until "\n")) | |
| 361 | + | (lex-tag 'comment (lex-delimited "DNL" #:until "\n")) | |
| 362 | + | lex-macro | |
| 363 | + | base-lexer))) | |
| 364 | + | ||
| 365 | + | (define (lex-m4 tokens cursor) | |
| 366 | + | ((make-m4-lexer lex-fail %m4-builtin-macros "`" "'") | |
| 367 | + | tokens cursor)) | |
| 368 | + | ||
| 369 | + | (define (lex-autoconf tokens cursor) | |
| 370 | + | ((make-m4-lexer (make-shell-lexer %shell-builtins %shell-keywords) | |
| 371 | + | (append %m4-builtin-macros %autoconf-builtin-macros) | |
| 372 | + | "[" "]") | |
| 373 | + | tokens cursor)) |