This file is indexed.

/usr/share/highlight/langDefs/purebasic.lang is in highlight-common 3.41-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
--[[******************************************************************************
    *                                                                            *
    *                       PureBASIC Language Definition                        *
    *                                                                            *
    *                            v1.7.1 - 2017/11/18                             *
    *                                                                            *
    ******************************************************************************
    PureBASIC v5.00-5.61 -- The goal of this language definition is to emulate the
    way PureBASIC's native IDE highlights its code, including inline Assembly
    syntax coloring. When used with the "edit-purebasic" theme, PureBASIC code
    will be highlighted just like in its native IDE.

    Keywords from all PureBASIC versions (from 5.00 up to current) are added to
    the list (deprecated keywords are preserved) to ensure that any code written 
    for PureBASIC >=5.00 will be parsed and highlighted correctly.

    Comments in color definitions refer to PureBASIC native IDE's default palette.
    ------------------------------------------------------------------------------
    This language definition is maintained at the PureBASIC Archives project:
        https://github.com/tajmone/purebasic-archives/tree/master/syntax-highlighting/highlight
    
    (visit the above link for more info and resources on this lang definition)
    ------------------------------------------------------------------------------
    Written by Tristano Ajmone:
        <tajmone@gmail.com>
        https://github.com/tajmone
    Released into the public domain according to the Unlicense terms:
        http://unlicense.org/
    ------------------------------------------------------------------------------
  ]]

Description="PureBASIC"

IgnoreCase=false

Comments={  -- PB IDE color: #00AAAA (Persian Green/Tradewind)
   { Block=false,
     Nested=false,
     Delimiter = { [[ ; ]] }
   }
}

Strings={   -- PB IDE color: #0080FF (Azure Radiance)
  Delimiter=[[ " ]],
  Escape=[=[\\[abfnrtv"\\]]=], -- PB IDE color: same as String
}
--[[ STRINGS NOTE: There's more to PB strings than this delimiter definition.
        Escaped strings (~"") are handled via `Keyword Id=4` and custom code in
        the `OnStateChange()` function found below.
--]]

Operators=[[\&|<|>|\!|\||\=|\/|\*|\%|\+|\-|~]] -- PB IDE color: same as normal text (Black)

-- NUMBERS > PB IDE color: same as normal text (Black)
Digits=[[ (?x)
        # ============ HEX ============
        # Pascal style ($FF):

          \$[0-9a-fA-F]+\b

        # ============ BINARY ============
        | %[01]+\b


        # ============ FLOAT ============
        # With decimal point separator:

        | \b[-]?\d+\.\d+(?:[eE][\-\+]?\d+)?[a-zA-Z]*\b

        # Without decimal point separator:
        
        | \b[-]?\d+(?:[eE][\-\+]?\d+)[a-zA-Z]*\b


        # ============ DECIMAL ============
        | (?<!\$)\b\d+\b
 
       ]]
-- FLOATS NOTE: PureBASIC strips and ignores all suffixes from float numbers.
--    Therefore "1.575e+1" and "1.575e+1bananas" are both valid float values
--    in PureBASIC code (both yelding the smae value of 15.75).


Keywords={
  { Id=1,   -- PureBASIC Keywords > PB IDE color: #006666 (Blue Stone) + Bold
    List={
        -- Keywords list built by parsing the tokens inside PureBASIC SDK's
        -- "SyntaxHilighting.dll" (from each PureBASIC version)...
        "Align", "And", "Array", "As", "Break", "CallDebugger", "Case", "CompilerCase", "CompilerDefault",
        "CompilerElse", "CompilerElseIf", "CompilerEndIf", "CompilerEndSelect", "CompilerError",
        "CompilerIf", "CompilerSelect", "CompilerWarning", "Continue", "Data", "DataSection", "Debug",
        "DebugLevel", "Declare", "DeclareC", "DeclareCDLL", "DeclareDLL", "DeclareModule", "Default",
        "Define", "Dim", "DisableASM", "DisableDebugger", "DisableExplicit", "Else", "ElseIf", "EnableASM",
        "EnableDebugger", "EnableExplicit", "End", "EndDataSection", "EndDeclareModule", "EndEnumeration",
        "EndIf", "EndImport", "EndInterface", "EndMacro", "EndModule", "EndProcedure", "EndSelect",
        "EndStructure", "EndStructureUnion", "EndWith", "Enumeration", "EnumerationBinary", "Extends",
        "FakeReturn", "For", "ForEach", "ForEver", "Global", "Gosub", "Goto", "If", "Import", "ImportC",
        "IncludeBinary", "IncludeFile", "IncludePath", "Interface", "List", "Macro", "MacroExpandedCount",
        "Map", "Module", "NewList", "NewMap", "Next", "Not", "Or", "Procedure", "ProcedureC",
        "ProcedureCDLL", "ProcedureDLL", "ProcedureReturn", "Protected", "Prototype", "PrototypeC", "ReDim",
        "Read", "Repeat", "Restore", "Return", "Runtime", "Select", "Shared", "Static", "Step", "Structure",
        "StructureUnion", "Swap", "Threaded", "To", "UndefineMacro", "Until", "Until ", "UnuseModule",
        "UseModule", "Wend", "While", "With", "XIncludeFile", "XOr",        },
    },
  { Id=2,   -- Constants > PB IDE color: #924B72 (Cannon Pink)
    Regex=[[ (#[a-zA-Z_]\w*\$?) ]]
    },
  { Id=2,   -- Inline ASM > PB IDE color: #924B72 (Cannon Pink)
    Regex=[[ ^\s*(![^;]*) ]], Group=1
    },
  { Id=2,   -- ASM Keywords > PB IDE color: #924B72 (Cannon Pink)
    List={
        -- Keywords list built by parsing the tokens inside PureBASIC SDK's
        -- "SyntaxHilighting.dll" (from each PureBASIC version)...
        "AAA", "AAD", "AAM", "AAS", "ADC", "ADD", "AND", "ARPL", "BOUND", "BSF", "BSR", "BSWAP", "BT",
        "BTC", "BTR", "BTS", "CALL", "CBW", "CDQ", "CLC", "CLD", "CLI", "CLTS", "CMC", "CMOVA", "CMOVAE",
        "CMOVB", "CMOVBE", "CMOVC", "CMOVE", "CMOVG", "CMOVGE", "CMOVL", "CMOVLE", "CMOVNA", "CMOVNAE",
        "CMOVNB", "CMOVNBE", "CMOVNC", "CMOVNE", "CMOVNG", "CMOVNGE", "CMOVNL", "CMOVNLE", "CMOVNO",
        "CMOVNP", "CMOVNS", "CMOVNZ", "CMOVO", "CMOVP", "CMOVPE", "CMOVPO", "CMOVS", "CMOVZ", "CMP", "CMPS",
        "CMPSB", "CMPSD", "CMPSW", "CMPXCHG", "CMPXCHG8B", "CWD", "CWDE", "DAA", "DAS", "DB", "DD", "DEC",
        "DIV", "DW", "EMMS", "ENTER", "ESC", "F2XM1", "FABS", "FADD", "FADDP", "FBLD", "FBSTP", "FCHS",
        "FCLEX", "FCMOVB", "FCMOVBE", "FCMOVE", "FCMOVNB", "FCMOVNBE", "FCMOVNE", "FCMOVNU", "FCMOVU",
        "FCOM", "FCOMI", "FCOMIP", "FCOMP", "FCOMPP", "FCOS", "FDECSTP", "FDIV", "FDIVP", "FDIVR", "FDIVRP",
        "FFREE", "FIADD", "FICOM", "FICOMP", "FIDIV", "FIDIVR", "FILD", "FIMUL", "FINCSTP", "FINIT", "FIST",
        "FISTP", "FISUB", "FISUBR", "FLD", "FLD1", "FLDCW", "FLDENV", "FLDL2E", "FLDL2T", "FLDLG2",
        "FLDLN2", "FLDPI", "FLDZ", "FMUL", "FMULP", "FNCLEX", "FNINIT", "FNOP", "FNSAVE", "FNSTCW",
        "FNSTENV", "FNSTSW", "FPATAN", "FPREM", "FPREM1", "FPTAN", "FRNDINT", "FRSTOR", "FSAVE", "FSCALE",
        "FSETPM", "FSIN", "FSINCOS", "FSQRT", "FST", "FSTCW", "FSTENV", "FSTP", "FSTSW", "FSUB", "FSUBP",
        "FSUBR", "FSUBRP", "FTST", "FUCOM", "FUCOMI", "FUCOMIP", "FUCOMP", "FUCOMPP", "FWAIT", "FXAM",
        "FXCH", "FXTRACT", "FYL2X", "FYL2XP1", "HLT", "IDIV", "IMUL", "IN", "INC", "INS", "INSB", "INSD",
        "INSW", "INT", "INTO", "INVD", "INVLPG", "IRET", "IRETD", "JA", "JAE", "JB", "JBE", "JC", "JCXZ",
        "JE", "JECXZ", "JG", "JGE", "JL", "JLE", "JMP", "JNA", "JNAE", "JNB", "JNBE", "JNC", "JNE", "JNG",
        "JNGE", "JNL", "JNLE", "JNO", "JNP", "JNS", "JNZ", "JO", "JP", "JPE", "JPO", "JS", "JZ", "LAHF",
        "LAR", "LDS", "LEA", "LEAVE", "LES", "LFS", "LGDT", "LGS", "LIDT", "LLDT", "LMSW", "LOCK", "LODS",
        "LODSB", "LODSD", "LODSW", "LOOP", "LOOPE", "LOOPNE", "LOOPNZ", "LOOPZ", "LSL", "LSS", "LTR", "MOV",
        "MOVD", "MOVQ", "MOVS", "MOVSB", "MOVSD", "MOVSW", "MOVSX", "MOVZX", "MUL", "NEG", "NOP", "NOT",
        "OR", "OUT", "OUTS", "OUTSB", "OUTSD", "OUTSW", "PACKSSDW", "PACKSSWB", "PACKUSWB", "PADDB",
        "PADDD", "PADDSB", "PADDSW", "PADDUSB", "PADDUSW", "PADDW", "PAND", "PANDN", "PCMPEQB", "PCMPEQD",
        "PCMPEQW", "PCMPGTB", "PCMPGTD", "PCMPGTW", "PMADDWD", "PMULHW", "POP", "POPA", "POPAD", "POPF",
        "POPFD", "POR", "PSLLD", "PSLLQ", "PSLLW", "PSRAD", "PSRAW", "PSRLD", "PSRLQ", "PSRLW", "PSUBB",
        "PSUBD", "PSUBSB", "PSUBSW", "PSUBUSB", "PSUBUSW", "PSUBW", "PUNPCKHBW", "PUNPCKHDQ", "PUNPCKHWD",
        "PUNPCKLBW", "PUNPCKLDQ", "PUNPCKLWD", "PUSH", "PUSHA", "PUSHAD", "PUSHF", "PUSHFD", "PXOR", "RCL",
        "RCR", "RDMSR", "RDPMC", "RDTSC", "REP", "REPE", "REPNE", "REPNZ", "REPZ", "RET", "RETF", "ROL",
        "ROR", "RSM", "SAHF", "SAL", "SAR", "SBB", "SCAS", "SCASB", "SCASD", "SCASW", "SETA", "SETAE",
        "SETB", "SETBE", "SETC", "SETE", "SETG", "SETGE", "SETL", "SETLE", "SETNA", "SETNAE", "SETNB",
        "SETNBE", "SETNC", "SETNE", "SETNG", "SETNGE", "SETNL", "SETNLE", "SETNO", "SETNP", "SETNS",
        "SETNZ", "SETO", "SETP", "SETPE", "SETPO", "SETS", "SETZ", "SGDT", "SHL", "SHLD", "SHR", "SHRD",
        "SIDT", "SLDT", "SMSW", "STC", "STD", "STI", "STOS", "STOSB", "STOSD", "STOSW", "STR", "SUB",
        "TEST", "UD2", "VERR", "VERW", "WAIT", "WBINVD", "WRMSR", "XADD", "XCHG", "XLAT", "XLATB", "XOR" },
    },
  { Id=3,   -- Procedure calls > PB IDE color: #006666 (Blue Stone)
    Regex=[[ ([a-zA-Z_]\w*)(?:(?:\s*)\() ]],
    Group=1
    },
  { Id=4,   -- Escaped-String Prefix ("~") > PB IDE color: same as strings
    Regex=[[ ~" ]], -- NOTE: In the final doc, this Keyword is converted to become
                    --       part of the string [see OnStateChange() func below]
    },
}



function OnStateChange(oldState, newState, token, kwgroup)

--[[ Dismiss Escape-Sequences
     =========================
     Currently, I couldn't find a way to preserve escape sequences without causing
     stray behaviour in string. So, for the time being they are just dismissed. ]]
  if newState==HL_ESC_SEQ then
    if oldState==HL_STRING then
      -- ESCAPE SEQUENCE FOUND INSIDE A STRING:
      if escapedString~=true then
        -- String is Literal (no escaping allowed)...
        escapeSeq = false
        if token=='\\"' then
          -- rejecting a \" will cause the \ to become part of the curr. string
          -- but the " will be thrown again to the parser, which will mistake it
          -- for a new string start. We'll use the `forceStringEnd` var to
          -- prevent this...
          forceStringEnd = true
          return HL_REJECT
        else
          -- all other escape sequences can be suppresed by assimilating
          -- them to the current string... 
          forceStringEnd=false
          return HL_REJECT --HL_STRING
        end
      else
        -- String is Escapable...
        escapeSeq = true
        forceStringEnd=false
        return HL_ESC_SEQ
      end
    -- HANDLE TWO ESCAPRE SEQUENCES IN A ROW: 
    elseif oldState==HL_ESC_SEQ then
        escapeSeq = true
        escapedString = true
        forceStringEnd=false
        return HL_ESC_SEQ
    else
      -- ESCAPE SEQUENCE FOUND OUTSIDE A STRING
      escapeSeq = false
      forceStringEnd=false
        escapedString = false
     return HL_REJECT
    end

--[[ PB Escape Strings (~"...")
     ==========================
     Keyword 4 (~") is converted to string state, so the tilda becomes part of
     the actual string. The boolean var `escapedString` tracks this process. ]]
  elseif newState==HL_KEYWORD and kwgroup==4 then
    -- If ~" occurs inside a string, it's just a string with a tilda as last char...
    if oldState==HL_STRING then
      -- We use the `forceStringEnd` var trick here, like we did with
      -- rejected \" escape sequences above... 
      forceStringEnd=true
      return HL_REJECT -- HL_STRING -- HL_REJECT
    -- In all other cases it's an escaped string delimiter (opening)...
    else
      escapedString = true
      escapeSeq = false
      forceStringEnd=false
      return HL_STRING
    end

--[[ NEW STATE IS STRING: ]]
  elseif newState==HL_STRING then

--[[ Handle The " After A Rejcted  \" or ~" in Literal String
     =======================
     A rejected \" or ~" led to a spurious " being fed to the parser which can 
     be mistaken for a new string delimiter ]]
    if forceStringEnd==true then
      forceStringEnd=false
      return HL_STRING_END

--[[ Sanitize String Starts
     ======================
     Because Keyword 4 is converted to a string start, we must tell the parser to
     treat the next string delimiter as a string end! ]]
    elseif escapedString==true then
      escapedString = false
      return HL_STRING_END

--[[ Sanitize String After Escape Sequence
     =====================================
     Ensure that a " immediately following an escape sequence is treated as
     a string-end delimiter. ]]
    elseif token=='"' and escapeSeq==true then
      escapeSeq = false
      forceStringEnd=false
      escapedString = false
      return HL_STRING_END
    else
      escapeSeq = false
      forceStringEnd=false
      return HL_STRING
    end

--[[ FOR ALL OTHER SYNTAX ITEMS:]]
  elseif oldState~=HL_STRING and oldState~=HL_ESC_SEQ then
    -- Reset all Trackers' States: This is required to avoid some edge-cases
    -- of strings corruption in complex source code...
    escapeSeq = false
    escapedString = false
    forceStringEnd=false
    return newState

  end
end


--[[==========================================================================
                                      CHANGELOG                                   
==============================================================================
v1.7.1 - 2017/11/18 (PureBASIC v5.61)
       - Syntax checked against new PureBASIC v5.61 (no changes detected)
v1.7   - 2017/10/02 (PureBASIC v5.60) 
       - IMPROVEMENTS: Escape sequences are now corretcly parsed and highlighted.
v1.6   - 2017/09/30 (PureBASIC v5.60) 
       - IMPROVEMENTS: Added numbers definition (hex, binary, floats an decimals) 
       - BUG-FIX: String concatenations didn't always parse correctly; now this
         was fixed (at the expenses of escaped sequences).
       - ABROGATED: parsing of escape sequences is now disabled because it caused
         too many problems with strings.
v1.5   - 2017/09/28 (PureBASIC v5.60) 
       - IMPROVEMENTS:
         - Escaped-String Prefix (~) is no longer handled as a keyword (ID=4/kwd)
           but its recognized as a valid string delimiter.
         - Escape Sequences are further sanitized so that they can occur only
           inside strings with the ~" opening delimiter.
       - ABROGATED:
         - The lang definition no longer uses Keyword 4 (Escaped-String Prefix).
v1.4   - 2017/09/27 (PureBASIC v5.60) 
       - BUG-FIX: Added sanitize function to avoid false positive Escape Sequences
         in structured vars (eg: "\v" in "SomeStructure\var1").
         (Thanks to André Simon -- see Issue #23:)
         -- https://github.com/andre-simon/highlight/issues/23
v1.3   - 2017/05/20 (PureBASIC v5.60) 
       - fixed single line comment delimiter
v1.2   - 2017/05/11 (PureBASIC v5.60)
       - Added ASM keywords and support for inline ASM (via "!" syntax).
       - BUG-FIXES:
         - Repaired missing or mispelled PB Keywords (something went wrong in the
           keywords list of the v1.1 of this lang definition, some tokens were
           lost, other fused into a single token -- sorry about that).
v1.1   - 2017/04/30 (PureBASIC v5.60)
       - Keywords list now built by extracting them from the PureBASIC SDK's
         "SyntaxHilighting.dll" (from each PureBASIC version). Tokens from each
         version are added to the list, and renamed or removed tokens are kept
         for the sake of covering all versions of the language from PureBASIC
         v5.00 upward. (NOTE: currently, there are no renamed or deprecated
         tokens in the keywords list). For more info, see:
         -- http://www.purebasic.fr/english/viewtopic.php?&p=506269
         -- https://github.com/tajmone/purebasic-archives/tree/master/syntax-highlighting/guidelines
v1.0   - 2016/10/27 (PureBASIC v5.50)
       - First release. Keywords list taken and adapted from GuShH's PureBasic 
         language file for GeSHi:
         -- https://github.com/easybook/geshi/blob/master/geshi/purebasic.php
--]]