home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 March / Gamestar_82_2006-03_dvd.iso / DVDStar / Editace / quake4_sdkv10.exe / source / idlib / CmdArgs.cpp < prev    next >
C/C++ Source or Header  |  2005-11-14  |  3KB  |  171 lines

  1.  
  2. #include "../idlib/precompiled.h"
  3. #pragma hdrstop
  4.  
  5. /*
  6. ============
  7. idCmdArgs::operator=
  8. ============
  9. */
  10. void idCmdArgs::operator=( const idCmdArgs &args ) {
  11.     int i;
  12.  
  13.     argc = args.argc;
  14.     memcpy( tokenized, args.tokenized, MAX_COMMAND_STRING );
  15.     for ( i = 0; i < argc; i++ ) {
  16.         argv[ i ] = tokenized + ( args.argv[ i ] - args.tokenized );
  17.     }
  18. }
  19.  
  20. /*
  21. ============
  22. idCmdArgs::Args
  23. ============
  24. */
  25. const char *idCmdArgs::Args(  int start, int end, bool escapeArgs ) const {
  26.     static char cmd_args[MAX_COMMAND_STRING];
  27.     int        i;
  28.  
  29.     if ( end < 0 ) {
  30.         end = argc - 1;
  31.     } else if ( end >= argc ) {
  32.         end = argc - 1;
  33.     }
  34.     cmd_args[0] = '\0';
  35.     if ( escapeArgs ) {
  36.         strcat( cmd_args, "\"" );
  37.     }
  38.     for ( i = start; i <= end; i++ ) {
  39.         if ( i > start ) {
  40.             if ( escapeArgs ) {
  41.                 strcat( cmd_args, "\" \"" );
  42.             } else {
  43.                 strcat( cmd_args, " " );
  44.             }
  45.         }
  46.         if ( escapeArgs && strchr( argv[i], '\\' ) ) {
  47.             char *p = argv[i];
  48.             while ( *p != '\0' ) {
  49.                 if ( *p == '\\' ) {
  50.                     strcat( cmd_args, "\\\\" );
  51.                 } else {
  52.                     int l = strlen( cmd_args );
  53.                     cmd_args[ l ] = *p;
  54.                     cmd_args[ l+1 ] = '\0';
  55.                 }
  56.                 p++;
  57.             }
  58.         } else {
  59.             strcat( cmd_args, argv[i] );
  60.         }
  61.     }
  62.     if ( escapeArgs ) {
  63.         strcat( cmd_args, "\"" );
  64.     }
  65.  
  66.     return cmd_args;
  67. }
  68.  
  69. /*
  70. ============
  71. idCmdArgs::TokenizeString
  72.  
  73. Parses the given string into command line tokens.
  74. The text is copied to a separate buffer and 0 characters
  75. are inserted in the appropriate place. The argv array
  76. will point into this temporary buffer.
  77. ============
  78. */
  79. void idCmdArgs::TokenizeString( const char *text, bool keepAsStrings ) {
  80.     idLexer        lex;
  81.     idToken        token, number;
  82.     int            len, totalLen;
  83.  
  84.     // clear previous args
  85.     argc = 0;
  86.  
  87.     if ( !text ) {
  88.         return;
  89.     }
  90.  
  91.     lex.LoadMemory( text, strlen( text ), "idCmdSystemLocal::TokenizeString" );
  92.     lex.SetFlags( LEXFL_NOERRORS
  93.                 | LEXFL_NOWARNINGS
  94.                 | LEXFL_NOSTRINGCONCAT
  95.                 | LEXFL_ALLOWPATHNAMES
  96.                 | LEXFL_NOSTRINGESCAPECHARS
  97.                 | LEXFL_ALLOWIPADDRESSES | ( keepAsStrings ? LEXFL_ONLYSTRINGS : 0 ) );
  98.  
  99.     totalLen = 0;
  100.  
  101.     while ( 1 ) {
  102.         if ( argc == MAX_COMMAND_ARGS ) {
  103.             return;            // this is usually something malicious
  104.         }
  105.  
  106.         if ( !lex.ReadToken( &token ) ) {
  107.             return;
  108.         }
  109.  
  110.         // check for negative numbers
  111.         if ( !keepAsStrings && ( token == "-" ) ) {
  112.             if ( lex.CheckTokenType( TT_NUMBER, 0, &number ) ) {
  113.                 token = "-" + number;
  114.             }
  115.         }
  116.  
  117.         // check for cvar expansion
  118.         if ( token == "$" ) {
  119.             if ( !lex.ReadToken( &token ) ) {
  120.                 return;
  121.             }
  122.             if ( idLib::cvarSystem ) {
  123.                 token = idLib::cvarSystem->GetCVarString( token.c_str() );
  124.             } else {
  125.                 token = "<unknown>";
  126.             }
  127.         }
  128.  
  129.         len = token.Length();
  130.  
  131.         if ( totalLen + len + 1 > sizeof( tokenized ) ) {
  132.             return;            // this is usually something malicious
  133.         }
  134.  
  135.         // regular token
  136.         argv[argc] = tokenized + totalLen;
  137.         argc++;
  138.  
  139.         idStr::Copynz( tokenized + totalLen, token.c_str(), sizeof( tokenized ) - totalLen );
  140.  
  141.         totalLen += len + 1;
  142.     }
  143. }
  144. /*
  145. ============
  146. idCmdArgs::AppendArg
  147. ============
  148. */
  149. void idCmdArgs::AppendArg( const char *text ) {
  150.     if ( !argc ) {
  151.         argc = 1;
  152.         argv[ 0 ] = tokenized;
  153.         idStr::Copynz( tokenized, text, sizeof( tokenized ) );
  154.     } else {
  155.         argv[ argc ] = argv[ argc-1 ] + strlen( argv[ argc-1 ] ) + 1;
  156.         idStr::Copynz( argv[ argc ], text, sizeof( tokenized ) - ( argv[ argc ] - tokenized ) );
  157.         argc++;
  158.     }
  159. }
  160.  
  161. /*
  162. ============
  163. idCmdArgs::GetArgs
  164. ============
  165. */
  166. const char **idCmdArgs::GetArgs( int *_argc ) {
  167.     *_argc = argc;
  168.     return (const char **)&argv[0];
  169. }
  170.  
  171.