102 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  * Qap is a quick parser/matcher for string or buffer patterns.
 | |
|  * It is optimized for using with pattern strings/buffers <= 255 bytes.
 | |
|  * Better results are achieved with sparse and long patterns in the data to be parsed.
 | |
|  * It is an implementation of QuickSearch algorithm :
 | |
|  * http://www-igm.univ-mlv.fr/~lecroq/string/node19.html#SECTION00190.
 | |
|  *
 | |
|  * Copyright(c) 2015 Guglielmo Ferri <44gatti@gmail.com>
 | |
|  * MIT Licensed
 | |
|  */
 | |
| 
 | |
| exports.version = require( '../package' ).version;
 | |
| exports.Qap = ( function () {
 | |
|     var isArray = Array.isArray
 | |
|         , isBuffer = Buffer.isBuffer
 | |
|         // shifting table
 | |
|         , lookupTable = function ( p ) {
 | |
|             var m = p.length
 | |
|                 , t = m > 255 ? [] : new Buffer( 256 )
 | |
|                 , i = 255
 | |
|                 , j = 0
 | |
|                 ;
 | |
|             for ( ; i >= 0 ; t[ i ] = 0, i-- );
 | |
|             for ( ; m > 0; t[ p[ j++ ] ] = m-- );
 | |
|             return t;
 | |
|         }
 | |
|         , convert = function ( data ) {
 | |
|             if ( ! isBuffer( data ) ) {
 | |
|                 // obviously, string conversion is slow
 | |
|                 if ( typeof data  === 'string' ) return new Buffer( data );
 | |
|                 else throw new TypeError( 'the argument type should be Buffer or String' );
 | |
|             }
 | |
|             return data;
 | |
|         }
 | |
|         , set = function ( pattern ) {
 | |
|             var me = this
 | |
|                 ;
 | |
|             me.p = convert( pattern );
 | |
|             me.plkb = lookupTable( me.p );
 | |
|             return me.p;
 | |
|         }
 | |
|         // Quick Parser
 | |
|         , Qap = function ( pattern ) {
 | |
|             var me = this
 | |
|                 , is = me instanceof Qap
 | |
|                 ;
 | |
|             if ( ! is ) return new Qap( pattern );
 | |
|             set.call( me, pattern );
 | |
|         }
 | |
|         , qproto = Qap.prototype
 | |
|         ;
 | |
| 
 | |
|     qproto.set = set;
 | |
| 
 | |
|     qproto.parse = function ( data, start, rlimit, array ) {
 | |
|         var me = this
 | |
|             , d = convert( data )
 | |
|             , plkb = me.plkb
 | |
|             , p = me.p
 | |
|             , m = p.length
 | |
|             , n = d.length
 | |
|             , ixs = isArray( array ) ? array : []
 | |
|             , j = start || 0
 | |
|             , ok = 1
 | |
|             , z = 0
 | |
|             , x = p[ 0 ]
 | |
|             , pos = 0 + j
 | |
|             , y = d[ pos ]
 | |
|             , i = m + j
 | |
|             , c = d[ i ]
 | |
|             , offset = n - m
 | |
|             , l = rlimit || Infinity
 | |
|             ;
 | |
|         for ( ; j <= offset;
 | |
|                 i = j + m,
 | |
|                 c = d[ i ],
 | |
|                 z = 0,
 | |
|                 ok = 1,
 | |
|                 pos = j,
 | |
|                 x = p[ 0 ],
 | |
|                 y = d[ pos ] ) {
 | |
|             for ( ; z < m ;
 | |
|                     z++,
 | |
|                     pos++,
 | |
|                     x = p[ z ],
 | |
|                     y = d[ pos ] ) {
 | |
| 
 | |
|                 if ( x === y ) continue;
 | |
|                 else {
 | |
|                     ok = 0;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             // if ( ok && ( ixs.push( j, pos ) >= l ) ) {
 | |
|             if ( ok && ( ixs.push( j ) >= l ) ) break;
 | |
|             j += plkb[ c ] || m + 1;
 | |
|         }
 | |
|         return ixs;
 | |
|     };
 | |
| 
 | |
|     return Qap;
 | |
| } )(); |