Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/util/substring.cc @ 5182

Last change on this file since 5182 was 5150, checked in by bensch, 20 years ago

orxonox/trunk: SubString is now Safe also for NULL and 1 parameters

File size: 2.5 KB
RevLine 
[4597]1/*
[3941]2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Christian Meyer
[4597]13   co-programmer: Benjamin Grauer
14
15   2005-06-10: some naming conventions
[4220]16*/
17
18
[3941]19/**
[4836]20 *  breaks a string into parts that were initially seperated by comma
21 * @param string the string to break into substrings
[4220]22*/
[3941]23
[4220]24#include "substring.h"
25
[4833]26#include "debug.h"
[4220]27#include <string.h>
28#include <assert.h>
29
[4734]30SubString::SubString( const char* string, char splitter)
[4220]31{
[4830]32  this->splittersCount = 0;
[5150]33  if (string == NULL)
34  {
35    this->strings = NULL;
36    return;
37  }
[4597]38
[5150]39  for( int i = 0; i < strlen(string); i++)
40    if( string[i] == splitter)
41      this->splittersCount++;
[4597]42
[4830]43  this->splittersCount += 1;
[4597]44
[4830]45  this->strings = new char*[this->splittersCount];
[4220]46  assert (strings != NULL);
[4597]47
[4220]48  int i = 0;
49  int l = 0;
[4597]50
[5150]51  if( this->splittersCount > 1)
52  {
53    const char* offset = string;
54    char* end = strchr( string, splitter);
55    while( end != NULL)
[4220]56    {
[4830]57      assert( i < this->splittersCount);
[4220]58      l = end - offset;
[4830]59      this->strings[i] = new char[l + 1];
[4220]60      assert( strings[i] != NULL);
61      strncpy( strings[i], offset, l);
62      strings[i][l] = 0;
63      i++;
64      end++;
65      offset = end;
[4734]66      end = strchr( offset, splitter);
[4220]67    }
[4597]68
[5150]69    strings[i] = new char[l + 1];
70    l = strlen( offset);
71    strncpy( strings[i], offset, l);
72    strings[i][l] = '\0';
73  }
74  else
75  {
76    this->strings[0] = new char[strlen(string)];
77    strcpy(this->strings[0], string);
78  }
[4220]79}
80
[3941]81/**
[4836]82 *  removes the object from memory
[3941]83*/
[4220]84SubString::~SubString()
85{
[5150]86  if (this->strings)
87  {
88    for( int i = 0; i < this->splittersCount; i++)
89      delete[] this->strings[i];
90    delete[] this->strings;
91  }
[4220]92}
[3941]93
94/**
[4836]95 *  get a particular substring
96 * @param i the ID of the substring to return
97 * @returns the designated substring or NULL if an invalid ID was given
[4220]98*/
[5150]99const char* SubString::getString(unsigned int i)
[4220]100{
[4830]101  if( i < this->splittersCount && i >= 0)
102    return this->strings[i];
103  else
104    return NULL;
[4220]105}
[4833]106
107
108
109/**
110 * Some nice debug information about this SubString
111 */
112void SubString::debug() const
113{
114  PRINT(0)("Substring-information::count=%d ::", this->splittersCount);
115  for (int i = 0; i < this->splittersCount; i++)
116    PRINT(0)("s%d:%s::", i, this->strings[i]);
117  PRINT(0)("\n");
118}
Note: See TracBrowser for help on using the repository browser.