aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/kernel/string.h
blob: b6802d3075d6faf822eb5591913dbc19c2aa1203 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// -----------------------------------------------------------------------------
// This file is part of Broken Sword 2.5
// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsd�rfer
//
// Broken Sword 2.5 is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Broken Sword 2.5 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Broken Sword 2.5; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// -----------------------------------------------------------------------------

#ifndef BS_STRING
#define BS_STRING

#include "memlog_off.h"
#include <string>
#include "memlog_on.h"

namespace BS_String
{
  inline unsigned int GetHash(const std::string & Str)
  {
    unsigned int Result = 0;

    for (unsigned int i = 0; i < Str.size(); i++)
      Result = ((Result << 5) - Result) + Str[i];

    return Result;
  }

  inline bool ToInt(const std::string & Str, int & Result)
  {
    std::string::const_iterator Iter = Str.begin();

    // Whitespace �berspringen
    while (*Iter && (*Iter == ' ' || *Iter == '\t')) { ++Iter; }
    if (Iter == Str.end()) return false;

    // Vorzeichen auslesen, wenn vorhanden
    bool IsNegative = false;
    if (*Iter == '-')
    {
      IsNegative = true;
      ++Iter;
    }
    else if (*Iter == '+')
      ++Iter;

    // Whitespace �berspringen
    while (*Iter && (*Iter == ' ' || *Iter == '\t')) { ++Iter; }
    if (Iter ==Str.end()) return false;

    // String in Ganzzahl umwandeln
    Result = 0;
    while (Iter != Str.end())
    {
      if (*Iter < '0' || *Iter > '9')
      {
        while (*Iter && (*Iter == ' ' || *Iter == '\t')) { ++Iter; }
        if (Iter != Str.end()) return false;
        break;
      }
      Result = (Result * 10) + (*Iter - '0');
      ++Iter;
    }

    if (IsNegative) Result = -Result;

    return true;
  }

  inline bool ToBool(const std::string & Str, bool & Result)
  {
    if (Str == "true" ||
      Str == "TRUE")
    {
      Result = true;
      return true;
    }
    else if (Str == "false" ||
      Str == "FALSE")
    {
      Result = false;
      return true;
    }

    return false;
  }

  inline void ToLower(std::string & Str)
  {
    static const unsigned char LowerCaseMap[256] =
    {
      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,
      96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
      128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
      160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
      192,193,194,195,228,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,246,215,216,217,218,219,252,221,222,223,
      224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
    };

    for (unsigned int i = 0; i < Str.size(); ++i)
      Str[i] = LowerCaseMap[Str[i]];
  }
}

#endif