mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge pull request #1779 from larsbrinkhoff/fr
Disambiguate .fr between Frege, Forth, and plain text files
This commit is contained in:
		@@ -156,5 +156,14 @@ module Linguist
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    disambiguate "Frege", "Forth", "text" do |data|
 | 
				
			||||||
 | 
					      if /^(: |also |new-device|previous )/.match(data)
 | 
				
			||||||
 | 
					        Language["Forth"]
 | 
				
			||||||
 | 
					      elsif /\s*(import|module|package|data|type) /.match(data)
 | 
				
			||||||
 | 
					        Language["Frege"]
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        Language["text"]
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -903,6 +903,7 @@ Forth:
 | 
				
			|||||||
  - .f
 | 
					  - .f
 | 
				
			||||||
  - .for
 | 
					  - .for
 | 
				
			||||||
  - .forth
 | 
					  - .forth
 | 
				
			||||||
 | 
					  - .fr
 | 
				
			||||||
  - .frt
 | 
					  - .frt
 | 
				
			||||||
  - .fs
 | 
					  - .fs
 | 
				
			||||||
  ace_mode: forth
 | 
					  ace_mode: forth
 | 
				
			||||||
@@ -3231,6 +3232,15 @@ reStructuredText:
 | 
				
			|||||||
  - .rest
 | 
					  - .rest
 | 
				
			||||||
  ace_mode: none
 | 
					  ace_mode: none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					text:
 | 
				
			||||||
 | 
					  type: prose
 | 
				
			||||||
 | 
					  wrap: true
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - .txt
 | 
				
			||||||
 | 
					  - .fr
 | 
				
			||||||
 | 
					  tm_scope: none
 | 
				
			||||||
 | 
					  ace_mode: none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wisp:
 | 
					wisp:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  ace_mode: clojure
 | 
					  ace_mode: clojure
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								samples/CMake/filenames/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/CMake/filenames/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					cmake_minimum_required(VERSION 2.8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project(Foo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(CMAKE_SKIP_RPATH TRUE)
 | 
				
			||||||
 | 
					set(CMAKE_INSTALL_PREFIX "/usr/local")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_subdirectory(bar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_executable(foo foo.c)
 | 
				
			||||||
 | 
					target_link_libraries(foo pthread)
 | 
				
			||||||
 | 
					install(TARGETS foo DESTINATION bin)
 | 
				
			||||||
							
								
								
									
										244
									
								
								samples/Forth/asm.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								samples/Forth/asm.fr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,244 @@
 | 
				
			|||||||
 | 
					\ Copyright 2013-2014 Lars Brinkhoff
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Assembler for x86.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE.
 | 
				
			||||||
 | 
					\ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Conventional prefix syntax: "<source> <destination> <opcode>,".
 | 
				
			||||||
 | 
					\ Addressing modes:
 | 
				
			||||||
 | 
					\ - immediate: "n #"
 | 
				
			||||||
 | 
					\ - direct: n
 | 
				
			||||||
 | 
					\ - register: <reg>
 | 
				
			||||||
 | 
					\ - indirect: "<reg> )"
 | 
				
			||||||
 | 
					\ - indirect with displacement: "n <reg> )#"
 | 
				
			||||||
 | 
					\ - indexed: not supported yet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require lib/common.fth
 | 
				
			||||||
 | 
					require search.fth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vocabulary assembler
 | 
				
			||||||
 | 
					also assembler definitions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Access to the target image.
 | 
				
			||||||
 | 
					' header,   defer header,  is header,
 | 
				
			||||||
 | 
					' cell   defer cell   is cell
 | 
				
			||||||
 | 
					' dp   defer dp   is dp
 | 
				
			||||||
 | 
					0 value delta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: aligned   cell + 1 - cell negate nand invert ;
 | 
				
			||||||
 | 
					: align   dp @ aligned dp ! ;
 | 
				
			||||||
 | 
					: allot   dp +! ;
 | 
				
			||||||
 | 
					: here   dp @ ;
 | 
				
			||||||
 | 
					: cells   cell * ;
 | 
				
			||||||
 | 
					: c!   delta + c! ;
 | 
				
			||||||
 | 
					: c,   here c!  1 allot ;
 | 
				
			||||||
 | 
					: h,   dup c,  8 rshift c, ;
 | 
				
			||||||
 | 
					: ,   dup h,  16 rshift h, ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					base @  hex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ This constant signals that an operand is not a direct address.
 | 
				
			||||||
 | 
					deadbeef constant -addr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Assembler state.
 | 
				
			||||||
 | 
					variable opcode
 | 
				
			||||||
 | 
					variable d
 | 
				
			||||||
 | 
					variable s
 | 
				
			||||||
 | 
					variable dir?
 | 
				
			||||||
 | 
					variable mrrm   defer ?mrrm,
 | 
				
			||||||
 | 
					variable sib    defer ?sib,
 | 
				
			||||||
 | 
					variable disp   defer ?disp,
 | 
				
			||||||
 | 
					variable imm    defer ?imm,
 | 
				
			||||||
 | 
					defer imm,
 | 
				
			||||||
 | 
					defer immediate-opcode
 | 
				
			||||||
 | 
					defer reg
 | 
				
			||||||
 | 
					defer ?opsize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set opcode.  And destination: register or memory.
 | 
				
			||||||
 | 
					: opcode!   3@ is immediate-opcode >r opcode ! ;
 | 
				
			||||||
 | 
					: !reg   dir? @ if 2 d ! then dir? off ;
 | 
				
			||||||
 | 
					: !mem   dir? off ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set bits in mod/reg/rm byte.
 | 
				
			||||||
 | 
					: -mrrm   ['] nop is ?mrrm, ;
 | 
				
			||||||
 | 
					: mod!   mrrm c0 !bits ;
 | 
				
			||||||
 | 
					: reg@   mrrm 38 @bits ;
 | 
				
			||||||
 | 
					: reg!   mrrm 38 !bits ;
 | 
				
			||||||
 | 
					: rm@   mrrm 7 @bits ;
 | 
				
			||||||
 | 
					: rm!   rm@ 3 lshift reg!  mrrm 7 !bits ;
 | 
				
			||||||
 | 
					: reg>opcode   rm@ opcode 07 !bits ;
 | 
				
			||||||
 | 
					: opcode>reg   opcode @ dup 3 rshift rm!  8 rshift opcode ! ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Write parts of instruction to memory.
 | 
				
			||||||
 | 
					: ds   d @ s @ + ;
 | 
				
			||||||
 | 
					: ?twobyte   dup FF > if dup 8 rshift c, then ;
 | 
				
			||||||
 | 
					: opcode,   opcode @ ?twobyte ds + c, ;
 | 
				
			||||||
 | 
					: mrrm,   mrrm @ c, ;
 | 
				
			||||||
 | 
					: sib,   sib @ c, ;
 | 
				
			||||||
 | 
					: imm8,   imm @ c, ;
 | 
				
			||||||
 | 
					: imm16,   imm @ h, ;
 | 
				
			||||||
 | 
					: imm32,   imm @ , ;
 | 
				
			||||||
 | 
					: disp8,   disp @ c, ;
 | 
				
			||||||
 | 
					: disp32,   disp @ , ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set operand size.
 | 
				
			||||||
 | 
					: -opsize   2drop r> drop ;
 | 
				
			||||||
 | 
					: opsize!   is imm,  s !  ['] -opsize is ?opsize ;
 | 
				
			||||||
 | 
					: !op8    0 ['] imm8, ?opsize ;
 | 
				
			||||||
 | 
					: !op32   1 ['] imm32, ?opsize ;
 | 
				
			||||||
 | 
					: !op16   1 ['] imm16, ?opsize 66 c, ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set SIB byte.
 | 
				
			||||||
 | 
					: !sib   ['] sib, is ?sib, ;
 | 
				
			||||||
 | 
					: sib!   3 lshift + sib !  !sib ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set displacement.
 | 
				
			||||||
 | 
					: byte?   -80 80 within ;
 | 
				
			||||||
 | 
					: disp!   is ?disp, disp ! ;
 | 
				
			||||||
 | 
					: !disp8   ['] disp8, disp! ;
 | 
				
			||||||
 | 
					: !disp32   ['] disp32, disp! ;
 | 
				
			||||||
 | 
					: !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ;
 | 
				
			||||||
 | 
					: -pc   here 5 + negate ;
 | 
				
			||||||
 | 
					: relative   -pc disp +! ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Set immediate operand.
 | 
				
			||||||
 | 
					: imm!   imm !  ['] imm, is ?imm, ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Implements addressing modes: register, indirect, indexed, and direct.
 | 
				
			||||||
 | 
					: reg1   rm! !reg ;
 | 
				
			||||||
 | 
					: reg2   3 lshift reg! ;
 | 
				
			||||||
 | 
					: !reg2   ['] reg2 is reg ;
 | 
				
			||||||
 | 
					: ind   dup mod! rm! !mem !reg2 ;
 | 
				
			||||||
 | 
					: ind#   swap !disp + ind ;
 | 
				
			||||||
 | 
					: idx   04 ind  sib! ;
 | 
				
			||||||
 | 
					: idx#   rot !disp 04 + ind  sib! ;
 | 
				
			||||||
 | 
					: addr   !disp32  05 ind ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Reset assembler state.
 | 
				
			||||||
 | 
					: 0opsize   ['] opsize! is ?opsize ;
 | 
				
			||||||
 | 
					: 0ds   d off  s off ;
 | 
				
			||||||
 | 
					: 0reg   ['] reg1 is reg ;
 | 
				
			||||||
 | 
					: 0mrrm   c0 mrrm !  ['] mrrm, is ?mrrm, ;
 | 
				
			||||||
 | 
					: 0sib   ['] nop is ?sib, ;
 | 
				
			||||||
 | 
					: 0disp   ['] nop is ?disp, ;
 | 
				
			||||||
 | 
					: 0imm   imm off  ['] nop is ?imm,  0 is imm, ;
 | 
				
			||||||
 | 
					: 0asm   0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize  dir? on ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Enter and exit assembler mode.
 | 
				
			||||||
 | 
					: start-code   also assembler 0asm ;
 | 
				
			||||||
 | 
					: end-code     align previous ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Implements addressing mode: immediate.
 | 
				
			||||||
 | 
					: imm8?   imm @ byte? ;
 | 
				
			||||||
 | 
					: ?sign-extend   d off  imm8? if 2 d !  ['] imm8, is ?imm, then ;
 | 
				
			||||||
 | 
					: alu#   opcode @ reg! 80 opcode ! ?sign-extend ;
 | 
				
			||||||
 | 
					: mov#   B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ;
 | 
				
			||||||
 | 
					: push#   imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ;
 | 
				
			||||||
 | 
					: test#   F6 opcode ! ;
 | 
				
			||||||
 | 
					: imm-op   imm! immediate-opcode ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Process one operand.  All operands except a direct address
 | 
				
			||||||
 | 
					\ have the stack picture ( n*x xt -addr ).
 | 
				
			||||||
 | 
					: addr?   dup -addr <> ;
 | 
				
			||||||
 | 
					: op   addr? if addr else drop execute then ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Define instruction formats.
 | 
				
			||||||
 | 
					: instruction,   opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ;
 | 
				
			||||||
 | 
					: mnemonic ( u a "name" -- ) create ['] nop 3,  does> instruction, ;
 | 
				
			||||||
 | 
					: format:   create ] !csp  does> mnemonic ;
 | 
				
			||||||
 | 
					: immediate:   ' latestxt >body ! ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Instruction formats.
 | 
				
			||||||
 | 
					format: 0op   -mrrm ;
 | 
				
			||||||
 | 
					format: 1reg   op reg>opcode 0ds -mrrm ;
 | 
				
			||||||
 | 
					format: 1op   opcode>reg op d off ;
 | 
				
			||||||
 | 
					format: 2op   op op ;
 | 
				
			||||||
 | 
					format: 2op-d   op op d off ;
 | 
				
			||||||
 | 
					format: 2op-ds   op op 0ds ;
 | 
				
			||||||
 | 
					format: 1addr   op relative -mrrm ;
 | 
				
			||||||
 | 
					format: 1imm8   !op8 op -mrrm ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Instruction mnemonics.
 | 
				
			||||||
 | 
					00 2op add,  immediate: alu#
 | 
				
			||||||
 | 
					08 2op or,   immediate: alu#
 | 
				
			||||||
 | 
					0F44 2op-ds cmove,  \ Todo: other condition codes.
 | 
				
			||||||
 | 
					0FB6 2op-ds movzx,
 | 
				
			||||||
 | 
					0FBE 2op-ds movsx,
 | 
				
			||||||
 | 
					10 2op adc,  immediate: alu#
 | 
				
			||||||
 | 
					18 2op sbb,  immediate: alu#
 | 
				
			||||||
 | 
					20 2op and,  immediate: alu#
 | 
				
			||||||
 | 
					26 0op es,
 | 
				
			||||||
 | 
					28 2op sub,  immediate: alu#
 | 
				
			||||||
 | 
					2E 0op cs,
 | 
				
			||||||
 | 
					30 2op xor,  immediate: alu#
 | 
				
			||||||
 | 
					36 0op ss,
 | 
				
			||||||
 | 
					38 2op cmp,  immediate: alu#
 | 
				
			||||||
 | 
					3E 0op ds,
 | 
				
			||||||
 | 
					50 1reg push,  immediate: push#
 | 
				
			||||||
 | 
					58 1reg pop,
 | 
				
			||||||
 | 
					64 0op fs,
 | 
				
			||||||
 | 
					65 0op gs,
 | 
				
			||||||
 | 
					\ 70 jcc
 | 
				
			||||||
 | 
					84 2op-d test,   immediate: test#
 | 
				
			||||||
 | 
					86 2op-d xchg,
 | 
				
			||||||
 | 
					88 2op mov,  immediate: mov#
 | 
				
			||||||
 | 
					8D 2op-ds lea,
 | 
				
			||||||
 | 
					\ 8F/0 pop, rm
 | 
				
			||||||
 | 
					90 0op nop,
 | 
				
			||||||
 | 
					C3 0op ret,
 | 
				
			||||||
 | 
					\ C6/0 immediate mov to r/m
 | 
				
			||||||
 | 
					\ C7/0 immediate mov to r/m
 | 
				
			||||||
 | 
					CD 1imm8 int,
 | 
				
			||||||
 | 
					E8 1addr call,
 | 
				
			||||||
 | 
					E9 1addr jmp,
 | 
				
			||||||
 | 
					\ EB jmp rel8
 | 
				
			||||||
 | 
					F0 0op lock,
 | 
				
			||||||
 | 
					F2 0op rep,
 | 
				
			||||||
 | 
					F3 0op repz,
 | 
				
			||||||
 | 
					F4 0op hlt,
 | 
				
			||||||
 | 
					F5 0op cmc,
 | 
				
			||||||
 | 
					F610 1op not,
 | 
				
			||||||
 | 
					F618 1op neg,
 | 
				
			||||||
 | 
					F8 0op clc,
 | 
				
			||||||
 | 
					F9 0op stc,
 | 
				
			||||||
 | 
					FA 0op cli,
 | 
				
			||||||
 | 
					FB 0op sti,
 | 
				
			||||||
 | 
					FC 0op cld,
 | 
				
			||||||
 | 
					FD 0op std,
 | 
				
			||||||
 | 
					\ FE 0 inc rm
 | 
				
			||||||
 | 
					\ FF 1 dec rm
 | 
				
			||||||
 | 
					\ FF 2 call rm
 | 
				
			||||||
 | 
					\ FF 4 jmp rm
 | 
				
			||||||
 | 
					\ FF 6 push rm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: sp?   dup 4 = ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Addressing mode syntax: immediate, indirect, and displaced indirect.
 | 
				
			||||||
 | 
					: #   ['] imm-op -addr ;
 | 
				
			||||||
 | 
					: )   2drop  sp? if 4 ['] idx else ['] ind then -addr  0reg 0opsize ;
 | 
				
			||||||
 | 
					: )#   2drop  sp? if 4 ['] idx# else ['] ind# then -addr  0reg 0opsize ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Define registers.
 | 
				
			||||||
 | 
					: reg8    create ,  does> @ ['] reg -addr !op8 ;
 | 
				
			||||||
 | 
					: reg16   create ,  does> @ ['] reg -addr !op16 ;
 | 
				
			||||||
 | 
					: reg32   create ,  does> @ ['] reg -addr !op32 ;
 | 
				
			||||||
 | 
					: reg:    dup reg8 dup reg16 dup reg32 1+ ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Register names.
 | 
				
			||||||
 | 
					0
 | 
				
			||||||
 | 
					reg: al ax eax   reg: cl cx ecx   reg: dl dx edx   reg: bl bx ebx
 | 
				
			||||||
 | 
					reg: ah sp esp   reg: ch bp ebp   reg: dh si esi   reg: bh di edi
 | 
				
			||||||
 | 
					drop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Runtime for ;CODE.  CODE! is defined elsewhere.
 | 
				
			||||||
 | 
					: (;code)   r> code! ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					base !  only forth definitions  also assembler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Standard assembler entry points.
 | 
				
			||||||
 | 
					: code    parse-name header, ?code, start-code  ;
 | 
				
			||||||
 | 
					: ;code   postpone (;code) reveal postpone [ ?csp start-code ; immediate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0asm
 | 
				
			||||||
 | 
					previous
 | 
				
			||||||
							
								
								
									
										1
									
								
								samples/text/messages.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/text/messages.fr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					the green potato=la pomme de terre verte
 | 
				
			||||||
							
								
								
									
										1
									
								
								samples/text/readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/text/readme.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					Read me now!
 | 
				
			||||||
@@ -118,6 +118,14 @@ class TestHeuristcs < Test::Unit::TestCase
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_fr_by_heuristics
 | 
				
			||||||
 | 
					    assert_heuristics({
 | 
				
			||||||
 | 
					      "Frege" => all_fixtures("Frege"),
 | 
				
			||||||
 | 
					      "Forth" => all_fixtures("Forth"),
 | 
				
			||||||
 | 
					      "text" => all_fixtures("text")
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def assert_heuristics(hash)
 | 
					  def assert_heuristics(hash)
 | 
				
			||||||
    candidates = hash.keys.map { |l| Language[l] }
 | 
					    candidates = hash.keys.map { |l| Language[l] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user