mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ragel
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ragel
		
	
	
	
	
	
=begin
 | 
						|
%%{
 | 
						|
  machine simple_scanner;
 | 
						|
 | 
						|
  action Emit {
 | 
						|
    emit data[(ts+8)..(te-7)].pack('c*')
 | 
						|
  }
 | 
						|
 | 
						|
  foo = 'STARTFOO' any+ :>> 'ENDFOO';
 | 
						|
  
 | 
						|
  main := |*
 | 
						|
    foo => Emit;
 | 
						|
    any;
 | 
						|
  *|;
 | 
						|
}%%
 | 
						|
=end
 | 
						|
 | 
						|
 | 
						|
# Scans a file for "STARTFOO[...]ENDFOO" blocks and outputs their contents.
 | 
						|
#
 | 
						|
# ENV['CHUNK_SIZE'] determines how much of the file to read in at a time, allowing you to control memory usage.
 | 
						|
#
 | 
						|
# Uses ragel's scanner functionality even though it's not strictly necessary.
 | 
						|
class SimpleScanner
 | 
						|
  attr_reader :path
 | 
						|
 | 
						|
  def initialize(path)
 | 
						|
    @path = path
 | 
						|
    %% write data;
 | 
						|
    # % (this fixes syntax highlighting)
 | 
						|
  end
 | 
						|
 | 
						|
  def emit(foo)
 | 
						|
    $stdout.puts foo
 | 
						|
  end
 | 
						|
  
 | 
						|
  def perform
 | 
						|
    # So that ragel doesn't try to get it from data.length
 | 
						|
    pe = :ignored
 | 
						|
    eof = :ignored
 | 
						|
 | 
						|
    %% write init;
 | 
						|
    # % (this fixes syntax highlighting)
 | 
						|
 | 
						|
    leftover = []
 | 
						|
    
 | 
						|
    File.open(path) do |f|
 | 
						|
      while chunk = f.read(ENV['CHUNK_SIZE'].to_i)
 | 
						|
        data = leftover + chunk.unpack('c*')
 | 
						|
        p ||= 0
 | 
						|
        pe = data.length
 | 
						|
 | 
						|
        %% write exec;
 | 
						|
        # % (this fixes syntax highlighting)
 | 
						|
        if ts
 | 
						|
          leftover = data[ts..pe]
 | 
						|
          p = p - ts
 | 
						|
          ts = 0
 | 
						|
        else
 | 
						|
          leftover = []
 | 
						|
          p = 0
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
s = SimpleScanner.new ARGV[0]
 | 
						|
s.perform |