# This function finds the elements of a vector `v' which match the
# pattern `expr' (a character scalar).  The pattern is an extended
# regular expression which is given to egrep(1) to do the searching.

# The character strings in `v' must not contain a newline.

# Here are some examples:
#
#     > grep( "a"; "ab", "ac", "bc" )
#         ( 1, 2 )
#
#     > grep( "9$"; 1:40 )
#         ( 9, 19, 29, 39 )
#
#     > m = magic( 3 )
#         [ 8  1  6 ]
#         [ 3  5  7 ]
#         [ 4  9  2 ]
#     > m.rid = "top", "middle", "bottom";
#     > m[ grep( "top|bottom"; m.rid ); ]
#         [ 8  1  6 ]
#         [ 4  9  2 ]

# NOTE:  This is a terribly inefficient implementation (maybe someday
#        Algae will have builtin regular expressions), but maybe you'll
#        find it useful.

grep = function( expr; v )
{
    local( fin; fout; s );

    # make sure args are what we expect

    expr = scalar( expr );
    v = vector( v );

    if ( v.ne < 1 ) { return vector(); }

    # write the vector out to a temporary file

    fout = tmp_file();
    for ( s in v ) { fprintf( fout; "%s\n"; s ); }
    close( fout );

    # read it, using egrep and cut filters

    fin = sprintf( "!egrep -n '%s' %s | cut -f1 -d':'"; expr; fout );
    v = integer( readnum( v.ne; fin ) );
    close( fin );

    # discard trailing zeros

    if ( v ) { v = v[1:last(v)]; else v = vector(); }

    # remove the temporary file

    system( "/bin/rm -f " + fout );

    return v;
};


syntax highlighted by Code2HTML, v. 0.9.1