Annotation of sbbs/sbbs2/smb/smbutil/wildargv.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !             3:  *%      Copyright (C) 1989, by WATCOM Systems Inc. All rights     %
        !             4:  *%      reserved. No part of this software may be reproduced      %
        !             5:  *%      in any form or by any means - graphic, electronic or      %
        !             6:  *%      mechanical, including photocopying, recording, taping     %
        !             7:  *%      or information storage and retrieval systems - except     %
        !             8:  *%      with the written permission of WATCOM Systems Inc.        %
        !             9:  *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !            10:   WILDARGV - split DOS command line into individual arguments expanding
        !            11:             those that contain ? or *.
        !            12:   This module is a substitute for the "initargv" module contained in the
        !            13:   library.
        !            14: 
        !            15:   Modified:    By:             Reason:
        !            16:   ---------    ---             -------
        !            17:   23-aug-89    John Dahms      was ignoring files with Archive or
        !            18:                                read only attributes turned on. (Bug fix)
        !            19:   15-sep-91    F.W.Crigger     Use _LpCmdLine, _LpPgmName, _argc, _argv,
        !            20:                                ___Argc, ___Argv
        !            21:   13-jul-92    John Dahms      add (void near *) cast in _allocate
        !            22:   02-nov-93    A.F.Scian       fixed so that it compiles as C++
        !            23: */
        !            24: #include <stdio.h>
        !            25: #include <stdlib.h>
        !            26: #include <string.h>
        !            27: #include <io.h>
        !            28: #include <direct.h>
        !            29: #include <malloc.h>
        !            30: 
        !            31: #ifdef __cplusplus
        !            32: extern "C" {
        !            33: #endif
        !            34: 
        !            35: extern void    _Not_Enough_Memory();
        !            36: extern char    *_LpCmdLine;
        !            37: extern char    *_LpPgmName;
        !            38: extern int     _argc;                  /* argument count  */
        !            39: extern char  **_argv;                  /* argument vector */
        !            40: extern int     ___Argc;                /* argument count */
        !            41: extern char  **___Argv;                /* argument vector */
        !            42: 
        !            43: #ifdef __cplusplus
        !            44: };
        !            45: #endif
        !            46: 
        !            47: 
        !            48: static void *_allocate( unsigned amount )
        !            49:     {
        !            50:        void *p;
        !            51: 
        !            52: #if defined(__386__)
        !            53:        p = malloc( amount );
        !            54: #else
        !            55:        p = _nmalloc( amount );
        !            56:     #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
        !            57:        if( (void near *) p == NULL )  p = malloc( amount );
        !            58:     #endif
        !            59: #endif
        !            60:        if( p == NULL )  _Not_Enough_Memory();
        !            61:        return( p );
        !            62:     }
        !            63: 
        !            64: 
        !            65: static int _make_argv( char *p, char ***argv )
        !            66:     {
        !            67:        int             argc;
        !            68:        char            *start;
        !            69:        char            *new_arg;
        !            70:        char            wildcard;
        !            71:        char            lastchar;
        !            72:        DIR *           dir;
        !            73:        struct dirent * dirent;
        !            74:        char            drive[_MAX_DRIVE];
        !            75:        char            directory[_MAX_DIR];
        !            76:        char            name[_MAX_FNAME];
        !            77:        char            extin[_MAX_EXT];
        !            78:        char            pathin[_MAX_PATH];
        !            79: 
        !            80:        argc = 1;
        !            81:        for(;;) {
        !            82:            while( *p == ' ' ) ++p;     /* skip over blanks */
        !            83:            if( *p == '\0' ) break;
        !            84:            /* we are at the start of a parm */
        !            85:            wildcard = 0;
        !            86:            if( *p == '\"' ) {
        !            87:                p++;
        !            88:                new_arg = start = p;
        !            89:                for(;;) {
        !            90:                    /* end of parm: NULLCHAR or quote */
        !            91:                    if( *p == '\"' ) break;
        !            92:                    if( *p == '\0' ) break;
        !            93:                    if( *p == '\\' ) {
        !            94:                        if( p[1] == '\"'  ||  p[1] == '\\' )  ++p;
        !            95:                    }
        !            96:                    *new_arg++ = *p++;
        !            97:                }
        !            98:            } else {
        !            99:                new_arg = start = p;
        !           100:                for(;;) {
        !           101:                    /* end of parm: NULLCHAR or blank */
        !           102:                    if( *p == '\0' ) break;
        !           103:                    if( *p == ' ' ) break;
        !           104:                    if(( *p == '\\' )&&( p[1] == '\"' )) {
        !           105:                        ++p;
        !           106:                    } else if( *p == '?'  ||  *p == '*' ) {
        !           107:                        wildcard = 1;
        !           108:                    }
        !           109:                    *new_arg++ = *p++;
        !           110:                }
        !           111:            }
        !           112:            *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
        !           113:            if( *argv == NULL )  _Not_Enough_Memory();
        !           114:            (*argv)[ argc ] = start;
        !           115:            ++argc;
        !           116:            lastchar = *p;
        !           117:            *new_arg = '\0';
        !           118:            ++p;
        !           119:            if( wildcard ) {
        !           120:                /* expand file names */
        !           121:                dir = opendir( start );
        !           122:                if( dir != NULL ) {
        !           123:                    --argc;
        !           124:                    _splitpath( start, drive, directory, name, extin );
        !           125:                    for(;;) {
        !           126:                        dirent = readdir( dir );
        !           127:                        if( dirent == NULL ) break;
        !           128:                        if( dirent->d_attr &
        !           129:                          (_A_HIDDEN+_A_SYSTEM+_A_VOLID+_A_SUBDIR) ) continue;
        !           130:                        _splitpath( dirent->d_name, NULL, NULL, name, extin );
        !           131:                        _makepath( pathin, drive, directory, name, extin );
        !           132:                        *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
        !           133:                        if( *argv == NULL )  _Not_Enough_Memory();
        !           134:                        new_arg = (char *) _allocate( strlen( pathin ) + 1 );
        !           135:                        strcpy( new_arg, pathin );
        !           136:                        (*argv)[argc++] = new_arg;
        !           137:                    }
        !           138:                    closedir( dir );
        !           139:                }
        !           140:            }
        !           141:            if( lastchar == '\0' ) break;
        !           142:        }
        !           143:        return( argc );
        !           144:     }
        !           145: 
        !           146: 
        !           147: #ifdef __cplusplus
        !           148: extern "C"
        !           149: #endif
        !           150: void __Init_Argv()
        !           151:     {
        !           152:        _argv = (char **) _allocate( 2 * sizeof( char * ) );
        !           153:        _argv[0] = _LpPgmName;  /* fill in program name */
        !           154:        _argc = _make_argv( _LpCmdLine, &_argv );
        !           155:        _argv[_argc] = NULL;
        !           156:        ___Argc = _argc;
        !           157:        ___Argv = _argv;
        !           158:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.