Ignore:
Timestamp:
Mar 2, 2008, 3:03:36 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Add licensing terms to most C / C++ files (Ref #5).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/imlib/wildargv.cpp

    r2 r56  
    11/*
    2 
    32 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    4 
    53 *%       Copyright (C) 1989, by WATCOM Systems Inc. All rights     %
    6 
    74 *%       reserved. No part of this software may be reproduced      %
    8 
    95 *%       in any form or by any means - graphic, electronic or      %
    10 
    116 *%       mechanical, including photocopying, recording, taping     %
    12 
    137 *%       or information storage and retrieval systems - except     %
    14 
    158 *%       with the written permission of WATCOM Systems Inc.        %
    16 
    179 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    18 
    1910  WILDARGV - split DOS command line into individual arguments expanding
    20 
    2111             those that contain ? or *.
    22 
    2312  This module is a substitute for the "initargv" module contained in the
    24 
    2513  library.
    2614
    27 
    28 
    2915  Modified:     By:             Reason:
    30 
    3116  ---------     ---             -------
    32 
    3317  23-aug-89     John Dahms      was ignoring files with Archive or
    34 
    3518                                read only attributes turned on. (Bug fix)
    36 
    3719  15-sep-91     F.W.Crigger     Use _LpCmdLine, _LpPgmName, _argc, _argv,
    38 
    3920                                ___Argc, ___Argv
    40 
    4121  02-nov-93     A.F.Scian       updated so that source will compile as C++
    42 
    4322*/
    44 
    4523#include <stdio.h>
    46 
    4724#include <stdlib.h>
    48 
    4925#include <string.h>
    50 
    5126#include <io.h>
    52 
    5327#include <direct.h>
    54 
    5528#include <malloc.h>
    5629
     30#ifdef __cplusplus
     31extern "C" {
     32#endif
    5733
     34extern  void    _Not_Enough_Memory();
     35extern  char    *_LpCmdLine;
     36extern  char    *_LpPgmName;
     37extern  int     _argc;                  /* argument count  */
     38extern  char  **_argv;                  /* argument vector */
     39extern  int     ___Argc;                /* argument count */
     40extern  char  **___Argv;                /* argument vector */
    5841
    5942#ifdef __cplusplus
    60 
    61 extern "C" {
    62 
     43};
    6344#endif
    6445
     46static void *_allocate( unsigned amount )
     47{
     48    void *p;
    6549
     50#if defined(__386__)
     51    p = malloc( amount );
     52#else
     53    p = _nmalloc( amount );
     54#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
     55    if( (void near *) p == NULL )  p = malloc( amount );
     56#endif
     57#endif
     58    if( p == NULL )  _Not_Enough_Memory();
     59    return( p );
     60}
    6661
    67 extern  void    _Not_Enough_Memory();
     62static int _make_argv( char *p, char ***argv )
     63{
     64    int                 argc;
     65    char                *start;
     66    char                *new_arg;
     67    char                wildcard;
     68    char                lastchar;
     69    DIR *               dir;
     70    struct dirent       *dirent;
     71    char                drive[_MAX_DRIVE];
     72    char                directory[_MAX_DIR];
     73    char                name[_MAX_FNAME];
     74    char                extin[_MAX_EXT];
     75    char                pathin[_MAX_PATH];
    6876
    69 extern  char    *_LpCmdLine;
    70 
    71 extern  char    *_LpPgmName;
    72 
    73 extern  int     _argc;                  /* argument count  */
    74 
    75 extern  char  **_argv;                  /* argument vector */
    76 
    77 extern  int     ___Argc;                /* argument count */
    78 
    79 extern  char  **___Argv;                /* argument vector */
    80 
    81 
     77    argc = 1;
     78    for(;;) {
     79        while( *p == ' ' ) ++p; /* skip over blanks */
     80        if( *p == '\0' ) break;
     81        /* we are at the start of a parm */
     82        wildcard = 0;
     83        if( *p == '\"' ) {
     84            p++;
     85            new_arg = start = p;
     86            for(;;) {
     87                /* end of parm: NULLCHAR or quote */
     88                if( *p == '\"' ) break;
     89                if( *p == '\0' ) break;
     90                if( *p == '\\' ) {
     91                    if( p[1] == '\"'  ||  p[1] == '\\' )  ++p;
     92                }
     93                *new_arg++ = *p++;
     94            }
     95        } else {
     96            new_arg = start = p;
     97            for(;;) {
     98                /* end of parm: NULLCHAR or blank */
     99                if( *p == '\0' ) break;
     100                if( *p == ' ' ) break;
     101                if(( *p == '\\' )&&( p[1] == '\"' )) {
     102                    ++p;
     103                } else if( *p == '?'  ||  *p == '*' ) {
     104                    wildcard = 1;
     105                }
     106                *new_arg++ = *p++;
     107            }
     108        }
     109        *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
     110        if( *argv == NULL )  _Not_Enough_Memory();
     111        (*argv)[ argc ] = start;
     112        ++argc;
     113        lastchar = *p;
     114        *new_arg = '\0';
     115        ++p;
     116        if( wildcard ) {
     117            /* expand file names */
     118            dir = opendir( start );
     119            if( dir != NULL ) {
     120                --argc;
     121                _splitpath( start, drive, directory, name, extin );
     122                for(;;) {
     123                    dirent = readdir( dir );
     124                    if( dirent == NULL ) break;
     125                    if( dirent->d_attr &
     126                      (_A_HIDDEN+_A_SYSTEM+_A_VOLID+_A_SUBDIR) ) continue;
     127                    _splitpath( dirent->d_name, NULL, NULL, name, extin );
     128                    _makepath( pathin, drive, directory, name, extin );
     129                    *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
     130                    if( *argv == NULL )  _Not_Enough_Memory();
     131                    new_arg = (char *) _allocate( strlen( pathin ) + 1 );
     132                    strcpy( new_arg, pathin );
     133                    (*argv)[argc++] = new_arg;
     134                }
     135                closedir( dir );
     136            }
     137        }
     138        if( lastchar == '\0' ) break;
     139    }
     140    return( argc );
     141}
    82142
    83143#ifdef __cplusplus
    84 
    85 };
    86 
     144extern "C"
    87145#endif
    88 
    89 
    90 
    91 static void *_allocate( unsigned amount )
    92 
    93 {
    94 
    95     void *p;
    96 
    97 
    98 
    99 #if defined(__386__)
    100 
    101     p = malloc( amount );
    102 
    103 #else
    104 
    105     p = _nmalloc( amount );
    106 
    107 #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
    108 
    109     if( (void near *) p == NULL )  p = malloc( amount );
    110 
    111 #endif
    112 
    113 #endif
    114 
    115     if( p == NULL )  _Not_Enough_Memory();
    116 
    117     return( p );
    118 
    119 }
    120 
    121 
    122 
    123 static int _make_argv( char *p, char ***argv )
    124 
    125 {
    126 
    127     int                 argc;
    128 
    129     char                *start;
    130 
    131     char                *new_arg;
    132 
    133     char                wildcard;
    134 
    135     char                lastchar;
    136 
    137     DIR *               dir;
    138 
    139     struct dirent       *dirent;
    140 
    141     char                drive[_MAX_DRIVE];
    142 
    143     char                directory[_MAX_DIR];
    144 
    145     char                name[_MAX_FNAME];
    146 
    147     char                extin[_MAX_EXT];
    148 
    149     char                pathin[_MAX_PATH];
    150 
    151 
    152 
    153     argc = 1;
    154 
    155     for(;;) {
    156 
    157         while( *p == ' ' ) ++p; /* skip over blanks */
    158 
    159         if( *p == '\0' ) break;
    160 
    161         /* we are at the start of a parm */
    162 
    163         wildcard = 0;
    164 
    165         if( *p == '\"' ) {
    166 
    167             p++;
    168 
    169             new_arg = start = p;
    170 
    171             for(;;) {
    172 
    173                 /* end of parm: NULLCHAR or quote */
    174 
    175                 if( *p == '\"' ) break;
    176 
    177                 if( *p == '\0' ) break;
    178 
    179                 if( *p == '\\' ) {
    180 
    181                     if( p[1] == '\"'  ||  p[1] == '\\' )  ++p;
    182 
    183                 }
    184 
    185                 *new_arg++ = *p++;
    186 
    187             }
    188 
    189         } else {
    190 
    191             new_arg = start = p;
    192 
    193             for(;;) {
    194 
    195                 /* end of parm: NULLCHAR or blank */
    196 
    197                 if( *p == '\0' ) break;
    198 
    199                 if( *p == ' ' ) break;
    200 
    201                 if(( *p == '\\' )&&( p[1] == '\"' )) {
    202 
    203                     ++p;
    204 
    205                 } else if( *p == '?'  ||  *p == '*' ) {
    206 
    207                     wildcard = 1;
    208 
    209                 }
    210 
    211                 *new_arg++ = *p++;
    212 
    213             }
    214 
    215         }
    216 
    217         *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
    218 
    219         if( *argv == NULL )  _Not_Enough_Memory();
    220 
    221         (*argv)[ argc ] = start;
    222 
    223         ++argc;
    224 
    225         lastchar = *p;
    226 
    227         *new_arg = '\0';
    228 
    229         ++p;
    230 
    231         if( wildcard ) {
    232 
    233             /* expand file names */
    234 
    235             dir = opendir( start );
    236 
    237             if( dir != NULL ) {
    238 
    239                 --argc;
    240 
    241                 _splitpath( start, drive, directory, name, extin );
    242 
    243                 for(;;) {
    244 
    245                     dirent = readdir( dir );
    246 
    247                     if( dirent == NULL ) break;
    248 
    249                     if( dirent->d_attr &
    250 
    251                       (_A_HIDDEN+_A_SYSTEM+_A_VOLID+_A_SUBDIR) ) continue;
    252 
    253                     _splitpath( dirent->d_name, NULL, NULL, name, extin );
    254 
    255                     _makepath( pathin, drive, directory, name, extin );
    256 
    257                     *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
    258 
    259                     if( *argv == NULL )  _Not_Enough_Memory();
    260 
    261                     new_arg = (char *) _allocate( strlen( pathin ) + 1 );
    262 
    263                     strcpy( new_arg, pathin );
    264 
    265                     (*argv)[argc++] = new_arg;
    266 
    267                 }
    268 
    269                 closedir( dir );
    270 
    271             }
    272 
    273         }
    274 
    275         if( lastchar == '\0' ) break;
    276 
     146void __Init_Argv()
     147    {
     148        _argv = (char **) _allocate( 2 * sizeof( char * ) );
     149        _argv[0] = _LpPgmName;  /* fill in program name */
     150        _argc = _make_argv( _LpCmdLine, &_argv );
     151        _argv[_argc] = NULL;
     152        ___Argc = _argc;
     153        ___Argv = _argv;
    277154    }
    278 
    279     return( argc );
    280 
    281 }
    282 
    283 
    284 
    285 #ifdef __cplusplus
    286 
    287 extern "C"
    288 
    289 #endif
    290 
    291 void __Init_Argv()
    292 
    293     {
    294 
    295         _argv = (char **) _allocate( 2 * sizeof( char * ) );
    296 
    297         _argv[0] = _LpPgmName;  /* fill in program name */
    298 
    299         _argc = _make_argv( _LpCmdLine, &_argv );
    300 
    301         _argv[_argc] = NULL;
    302 
    303         ___Argc = _argc;
    304 
    305         ___Argv = _argv;
    306 
    307     }
    308 
Note: See TracChangeset for help on using the changeset viewer.