home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / system / source / cmdline.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2007-08-11  |  4.2 KB  |  179 lines

  1. //    VirtualDub - Video processing and capture application
  2. //    System library component
  3. //    Copyright (C) 1998-2005 Avery Lee, All Rights Reserved.
  4. //
  5. //    Beginning with 1.6.0, the VirtualDub system library is licensed
  6. //    differently than the remainder of VirtualDub.  This particular file is
  7. //    thus licensed as follows (the "zlib" license):
  8. //
  9. //    This software is provided 'as-is', without any express or implied
  10. //    warranty.  In no event will the authors be held liable for any
  11. //    damages arising from the use of this software.
  12. //
  13. //    Permission is granted to anyone to use this software for any purpose,
  14. //    including commercial applications, and to alter it and redistribute it
  15. //    freely, subject to the following restrictions:
  16. //
  17. //    1.    The origin of this software must not be misrepresented; you must
  18. //        not claim that you wrote the original software. If you use this
  19. //        software in a product, an acknowledgment in the product
  20. //        documentation would be appreciated but is not required.
  21. //    2.    Altered source versions must be plainly marked as such, and must
  22. //        not be misrepresented as being the original software.
  23. //    3.    This notice may not be removed or altered from any source
  24. //        distribution.
  25.  
  26. #include "stdafx.h"
  27. #include <vd2/system/cmdline.h>
  28.  
  29. VDCommandLine::VDCommandLine() {
  30. }
  31.  
  32. VDCommandLine::VDCommandLine(const wchar_t *s) {
  33.     Init(s);
  34. }
  35.  
  36. VDCommandLine::~VDCommandLine() {
  37. }
  38.  
  39. void VDCommandLine::Init(const wchar_t *s) {
  40.     for(;;) {
  41.         while(iswspace(*s))
  42.             ++s;
  43.  
  44.         if (!*s)
  45.             break;
  46.  
  47.         Token te = { (int)mLine.size(), *s == L'/', *s == L'"' };
  48.  
  49.         if (te.mbIsSwitch) {
  50.             mLine.push_back(L'/');
  51.             ++s;
  52.         }
  53.  
  54.         mTokens.push_back(te);
  55.  
  56.         // special case for /?
  57.         if (te.mbIsSwitch && *s == L'?') {
  58.             mLine.push_back(L'?');
  59.             ++s;
  60.         }
  61.  
  62.         while(*s && *s != L' ' && *s != L'/') {
  63.             if (te.mbIsSwitch) {
  64.                 if (!isalnum((unsigned char)*s))
  65.                     break;
  66.  
  67.                 mLine.push_back(*s++);
  68.             } else if (*s == L'"') {
  69.                 ++s;
  70.                 while(*s && *s != L'"')
  71.                     mLine.push_back(*s++);
  72.  
  73.                 if (*s) {
  74.                     ++s;
  75.  
  76.                     if (*s == ',') {
  77.                         ++s;
  78.                         break;
  79.                     }
  80.                 }
  81.             } else
  82.                 mLine.push_back(*s++);
  83.         }
  84.  
  85.         mLine.push_back(0);
  86.     }
  87. }
  88.  
  89. uint32 VDCommandLine::GetCount() const {
  90.     return mTokens.size();
  91. }
  92.  
  93. const wchar_t *VDCommandLine::operator[](int index) const {
  94.     return (uint32)index < mTokens.size() ? mLine.data() + mTokens[index].mTokenIndex : NULL;
  95. }
  96.  
  97. bool VDCommandLine::GetNextArgument(VDCommandLineIterator& it, const wchar_t *& token, bool& isSwitch) const {
  98.     int count = (int)mTokens.size();
  99.  
  100.     if (it.mIndex >= count)
  101.         return false;
  102.  
  103.     token = mLine.data() + mTokens[it.mIndex].mTokenIndex;
  104.     isSwitch = mTokens[it.mIndex].mbIsSwitch;
  105.  
  106.     ++it.mIndex;
  107.     return true;
  108. }
  109.  
  110. bool VDCommandLine::GetNextNonSwitchArgument(VDCommandLineIterator& it, const wchar_t *& token) const {
  111.     int count = (int)mTokens.size();
  112.  
  113.     if (it.mIndex >= count)
  114.         return false;
  115.  
  116.     if (mTokens[it.mIndex].mbIsSwitch)
  117.         return false;
  118.  
  119.     token = mLine.data() + mTokens[it.mIndex++].mTokenIndex;
  120.     return true;
  121. }
  122.  
  123. bool VDCommandLine::GetNextSwitchArgument(VDCommandLineIterator& it, const wchar_t *& token) const {
  124.     int count = (int)mTokens.size();
  125.  
  126.     if (it.mIndex >= count)
  127.         return false;
  128.  
  129.     if (!mTokens[it.mIndex].mbIsSwitch)
  130.         return false;
  131.  
  132.     token = mLine.data() + mTokens[it.mIndex++].mTokenIndex;
  133.     return true;
  134. }
  135.  
  136. bool VDCommandLine::FindAndRemoveSwitch(const wchar_t *name) {
  137.     int count = (int)mTokens.size();
  138.  
  139.     for(int i=1; i<count; ++i) {
  140.         if (mTokens[i].mbIsSwitch && !_wcsicmp(name, mLine.data() + mTokens[i].mTokenIndex + 1)) {
  141.             mTokens.erase(mTokens.begin() + i);
  142.             return true;
  143.         }
  144.     }
  145.  
  146.     return false;
  147. }
  148.  
  149. bool VDCommandLine::FindAndRemoveSwitch(const wchar_t *name, const wchar_t *& token) {
  150.     int count = (int)mTokens.size();
  151.     size_t namelen = wcslen(name);
  152.  
  153.     for(int i=1; i<count; ++i) {
  154.         if (!mTokens[i].mbIsSwitch)
  155.             continue;
  156.         
  157.         const wchar_t *s = mLine.data() + mTokens[i].mTokenIndex + 1;
  158.  
  159.         if (!_wcsnicmp(name, s, namelen)) {
  160.             token = s+namelen;
  161.  
  162.             switch(*token) {
  163.                 case L':':
  164.                     ++token;
  165.                     break;
  166.                 case 0:
  167.                     break;
  168.                 default:
  169.                     continue;
  170.             }
  171.  
  172.             mTokens.erase(mTokens.begin() + i);
  173.             return true;
  174.         }
  175.     }
  176.  
  177.     return false;
  178. }
  179.