Exemplo n.º 1
0
bool 
FileUtils::mkdirs( 
    const String &path )
{
    bool res = false;
    ASSERT_D( path.length() > 0 );

#if defined(_WINDOWS) || defined(WIN32)

    TCHAR abspath[_MAX_PATH];
    TCHAR drive[_MAX_DRIVE];
    TCHAR dir[_MAX_DIR];
    TCHAR fname[_MAX_FNAME];
    TCHAR ext[_MAX_EXT];

    _tsplitpath_s( _tfullpath( abspath, path.c_str(), _MAX_PATH ), drive, dir, fname, ext );

    // remember the current drive
    int curDrive = _getdrive();

    // set the current drive
    _chdrive( toupper(drive[0]) - 'A' + 1 );

    // now start parsing out the path and create all directoried in the 
    // heirarchy
    String createPath;
    String dirStr(dir);
    dirStr += fname;
    StringUtils::trimBoth( FileUtils::PATH_SEP_PAT, dirStr );
    StringTokenizer tok(dirStr, FileUtils::PATH_SEP_PAT);
    while( tok.hasMoreTokens() )
    {
        createPath += FileUtils::PATH_SEP;
        createPath += tok.getNextToken();
        res = FileUtils::mkdir( createPath );
        if ( !res )
        {
            break;
        }
    }

    _chdrive( curDrive );

#else

    // the first step is to figure out where the path
    // starts. If the path contains a .. or . prefix, then
    // we have to calculate the start of the creation path
    // if it does not contain such prefix, then we'll just create
    // the directories relative to the current working directory

    String rootPath;
    String parsePath;

    String::size_type startPos = path.find_first_not_of( NTEXT("/.") );
    if ( startPos != 0 ) 
    {
        // there was at least one of these delimiters as a prefix
        String prefixStr( path, 0, startPos );

        rootPath = FileUtils::resolve( prefixStr );
        if ( rootPath.length() > 0 )
        {
            if ( rootPath[ rootPath.length() - 1 ] != NTEXT('/') )
            {
                rootPath += FileUtils::PATH_SEP;
            }
        }

        parsePath = path.substr( startPos );
    }
    else
    {
        // no delimiters, so just parse the path
        parsePath = path;
    }

    StringTokenizer tok( parsePath, FileUtils::PATH_SEP_PAT );
    while( tok.hasMoreTokens() )
    {
        rootPath += tok.getNextToken();
        rootPath += FileUtils::PATH_SEP;
        res = FileUtils::mkdir( rootPath );
        if ( !res )
        {
            break;
        }
    }
#endif

    return res;
}
  bool ParameterList::applyParameters(uint32_t argc, const char** argv, uint32_t &a, const char* paramPrefix /*= nullptr*/, const char* defaultFilePath /*= nullptr*/) const
  {
    std::string prefixStr(paramPrefix ? paramPrefix : "");
    std::string defaultPathStr(defaultFilePath ? defaultFilePath : "");

    for (uint32_t p = 0; p < uint32_t(m_parameters.size()); p++) {
      const Parameter& param = m_parameters[p];
      std::string combined = prefixStr + param.name;
      bool searchFileEnding = (param.type == TYPE_FILENAME) && (param.readLength == 0);
      bool matched = searchFileEnding ? endsWith(argv[a], param.name) : (strcmp(argv[a], combined.c_str()) == 0);

      if (matched && a + param.readLength < argc) {
        switch (param.type) {
        case TYPE_FLOAT:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.f32[i] = std::min(std::max(float(atof(argv[a + i + 1])), param.minmax[0].f32), param.minmax[1].f32);
          }
        }
        break;
        case TYPE_UINT:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.u32[i] = std::min(std::max(uint32_t(atoi(argv[a + i + 1])), param.minmax[0].u32), param.minmax[1].u32);
          }
        }
        break;
        case TYPE_INT:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.s32[i] = std::min(std::max(int32_t(atoi(argv[a + i + 1])), param.minmax[0].s32), param.minmax[1].s32);
          }
        }
        break;
        case TYPE_BOOL:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.b[i] = atoi(argv[a + i + 1]) != 0;
          }
        }
        break;
        case TYPE_BOOL_VALUE:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.b[i] = param.minmax[0].b;
          }
        }
        break;
        case TYPE_STRING:
        {
          for (uint32_t i = 0; i < param.writeLength; i++) {
            param.destination.str[i] = std::string(argv[a + i + 1]);
          }
        }
        break;
        case TYPE_FILENAME:
        {
          std::string filename(argv[a + param.readLength]);

          if (
#ifdef _WIN32
            filename.find(':') != std::string::npos
#else
            !filename.empty() && filename[0] == '/'
#endif
            )
          {
            param.destination.str[0] = filename;
          }
          else {
            param.destination.str[0] = defaultPathStr + "/" + filename;
          }
        }
        break;
        case TYPE_TRIGGER:
        {

        }
        }

        if (param.callback) {
          param.callback(p);
        }

        if (searchFileEnding)
        {
          LOGI("  %s \"%s\"\n", param.name.c_str(), argv[a]);
        }
        else
        {
          LOGI(" ");
          for (uint32_t i = 0; i < param.readLength + 1; i++) {
            bool isString = i > 0 && (param.type == TYPE_FILENAME || param.type == TYPE_STRING);
            if (isString) {
              LOGI(" \"%s\"", argv[a + i]);
            }
            else {
              LOGI(" %s", argv[a + i]);
            }
          }
          LOGI("\n");
        }

        a += param.readLength;
        return true;
      }
    }
    return false;
  }