Ignore:
Timestamp:
Feb 17, 2016, 12:52:48 PM (8 years ago)
Author:
sommeria
Message:

xmltree updated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/@xmltree/private/xml_findstr.c

    r820 r925  
    22
    33/*
    4     Differences with matlab built-in findstr:
     4 * $Id: xml_findstr.c 6480 2015-06-13 01:08:30Z guillaume $
     5 * Guillaume Flandin <guillaume@artefact.tk>
     6 */
     7
     8/*
     9    Differences with built-in findstr:
    510        - allows to search only the n first occurences of a pattern
    611        - allows to search only in a substring (given an index of the beginning)
    712   
    8     Matlab hack:
     13    MATLAB hack:
    914        - doesn't use mxGetString to prevent a copy of the string.
    10         - assumes Matlab stores strings as unsigned short (Unicode 16 bits)
     15        - assumes MATLAB stores strings as unsigned short (Unicode 16 bits)
    1116          matrix.h: typedef uint16_T mxChar;
    12           (that's the case for Matlab 5.* and 6.* but Matlab 4.* stores strings
    13            as double)
     17          (that's the case for MATLAB 5.*, 6.* and 7.* but MATLAB 4.* stores
     18           strings as double and GNU Octave as char, see src/mxarray.h)
    1419*/
    1520
    1621/* Comment the following line to use standard mxGetString (slower) */
     22#if !defined (HAVE_OCTAVE)
    1723#define __HACK_MXCHAR__
     24#endif
    1825
    1926void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
     
    2835    mxArray *out = NULL;
    2936   
    30         /* Check for proper number of arguments. */
     37    /* Check for proper number of arguments. */
    3138    if ((nrhs == 0) || (nrhs == 1))
    32             mexErrMsgTxt("Not enough input arguments.");
     39        mexErrMsgTxt("Not enough input arguments.");
    3340    else if (nrhs > 4)
    34             mexErrMsgTxt("Too many input arguments.");
     41        mexErrMsgTxt("Too many input arguments.");
    3542    else if (nlhs > 1)
    3643        mexErrMsgTxt("Too many output arguments.");
    3744   
    3845    /* The input TEXT must be a string */
    39         if (!mxIsChar(prhs[0]))
    40             mexErrMsgTxt("Inputs must be character arrays.");
    41         stext = mxGetM(prhs[0]) * mxGetN(prhs[0]);
     46    if (!mxIsChar(prhs[0]))
     47        mexErrMsgTxt("Inputs must be character arrays.");
     48    stext = mxGetM(prhs[0]) * mxGetN(prhs[0]);
    4249#ifdef __HACK_MXCHAR__
    43         text = mxGetData(prhs[0]);
     50    text = mxGetData(prhs[0]);
    4451#else
    4552    text = mxCalloc(stext+1, sizeof(char));
     
    4855       
    4956    /* The input PATTERN must be a string */
    50         if (!mxIsChar(prhs[1]))
    51                 mexErrMsgTxt("Inputs must be character arrays.");
     57    if (!mxIsChar(prhs[1]))
     58        mexErrMsgTxt("Inputs must be character arrays.");
    5259    spattern = mxGetM(prhs[1]) * mxGetN(prhs[1]);
    5360#ifdef __HACK_MXCHAR__
    54         pattern = mxGetData(prhs[1]);
     61    pattern = mxGetData(prhs[1]);
    5562#else
    5663    pattern = mxCalloc(spattern+1, sizeof(char));
    57         mxGetString(prhs[1], pattern, spattern+1);
     64    mxGetString(prhs[1], pattern, spattern+1);
    5865#endif
    5966
    60         /* The input INDEX must be an integer */
    61         if (nrhs > 2) {
    62             if ((!mxIsNumeric(prhs[2]) || (mxGetM(prhs[2]) * mxGetN(prhs[2]) !=  1)))
    63                 mexErrMsgTxt("Index input must be an integer.");
    64             ind = (unsigned int)mxGetScalar(prhs[2]);
    65             if (ind < 1)
    66                 mexErrMsgTxt("Index must be greater than 1.");
    67         }
    68        
    69         /* The input OCCUR must be an integer */
    70         if (nrhs == 4) {
    71             if ((!mxIsNumeric(prhs[3]) || (mxGetM(prhs[3]) * mxGetN(prhs[3]) !=  1)))
    72                 mexErrMsgTxt("Index input must be an integer.");
    73             nboccur = (unsigned int)mxGetScalar(prhs[3]);
    74         }
    75        
    76         /* Find pattern in text */
     67    /* The input INDEX must be an integer */
     68    if (nrhs > 2) {
     69        if ((!mxIsNumeric(prhs[2]) || (mxGetM(prhs[2]) * mxGetN(prhs[2]) !=  1)))
     70            mexErrMsgTxt("Index input must be an integer.");
     71        ind = (unsigned int)mxGetScalar(prhs[2]);
     72        if (ind < 1)
     73            mexErrMsgTxt("Index must be greater than 1.");
     74    }
     75   
     76    /* The input OCCUR must be an integer */
     77    if (nrhs == 4) {
     78        if ((!mxIsNumeric(prhs[3]) || (mxGetM(prhs[3]) * mxGetN(prhs[3]) !=  1)))
     79            mexErrMsgTxt("Index input must be an integer.");
     80        nboccur = (unsigned int)mxGetScalar(prhs[3]);
     81    }
     82   
     83    /* Find pattern in text */
    7784    for (i=ind-1;i<stext;i++) {
    7885        for (j=0;j<spattern && i+j<stext;j++) {
Note: See TracChangeset for help on using the changeset viewer.