Remove obsolete class Fl_String
Note: it's still in branch-1.4 and in git history for reference
This commit is contained in:
parent
82b2001735
commit
facda9a087
@ -97,7 +97,6 @@ set(CPPFILES
|
||||
Fl_Single_Window.cxx
|
||||
Fl_Slider.cxx
|
||||
Fl_Spinner.cxx
|
||||
Fl_String.cxx
|
||||
Fl_Sys_Menu_Bar.cxx
|
||||
Fl_System_Driver.cxx
|
||||
Fl_Table.cxx
|
||||
|
||||
159
src/Fl_String.H
159
src/Fl_String.H
@ -1,159 +0,0 @@
|
||||
//
|
||||
// Basic Fl_String header for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
// Copyright 2021-2023 by Bill Spitzak and others.
|
||||
//
|
||||
// This library is free software. Distribution and use rights are outlined in
|
||||
// the file "COPYING" which should have been included with this file. If this
|
||||
// file is missing or damaged, see the license at:
|
||||
//
|
||||
// https://www.fltk.org/COPYING.php
|
||||
//
|
||||
// Please see the following page on how to report bugs and issues:
|
||||
//
|
||||
// https://www.fltk.org/bugs.php
|
||||
//
|
||||
|
||||
#ifndef _FL_Fl_String_H_
|
||||
#define _FL_Fl_String_H_
|
||||
|
||||
/**
|
||||
\cond DriverDev
|
||||
\addtogroup DriverDeveloper
|
||||
\{
|
||||
*/
|
||||
|
||||
/** \file src/Fl_String.H
|
||||
Basic Fl_String class for FLTK.
|
||||
*/
|
||||
|
||||
#include <FL/Fl_Export.H>
|
||||
|
||||
#include <string>
|
||||
|
||||
#if 1
|
||||
|
||||
// Since fltk 1.5.0, Fl_String is no longer needed and now maps to std::string.
|
||||
// Fl_String is not part of the public API. All occurrences of Fl_String in the
|
||||
// core library and in Fluid should be replaced with std::string. When done,
|
||||
// src/Fl_String.H and src/Fl_String.cxx can be deleted.
|
||||
using Fl_String = std::string;
|
||||
|
||||
#else
|
||||
|
||||
// See: https://en.cppreference.com/w/cpp/string/basic_string/basic_string
|
||||
|
||||
/**
|
||||
Fl_String is the basic string class for FLTK.
|
||||
|
||||
In this version Fl_String can be used to store strings, copy strings,
|
||||
move strings, and do basic string manipulation. Fl_String implements a
|
||||
subset of std::string with a couple of extensions. std::string should be
|
||||
a drop-in if we ever decide to allow templates and the std library.
|
||||
|
||||
Fl_String always maintains a trailing \e nul byte, but can also contain
|
||||
\e nul bytes inside the string if the constructor
|
||||
Fl_String(const char *str, int size) is used.
|
||||
|
||||
Assignment and copy constructors \b copy the string value such that the
|
||||
source string can be freed immediately after the assignment.
|
||||
|
||||
c_str() and data() can be an empty string \c "", but never be \c NULL.
|
||||
|
||||
The method size() returns the full string size, whether the string contains
|
||||
embedded \c nul bytes or not. The special method Fl_String::strlen() returns
|
||||
the length of the string up to the first \e nul.
|
||||
|
||||
All methods of Fl_String work on a byte level. They are not UTF-8 aware,
|
||||
but may hold and manipulate UTF-8 strings if done with care.
|
||||
|
||||
\since 1.4.0
|
||||
*/
|
||||
class FL_EXPORT Fl_String {
|
||||
|
||||
private:
|
||||
/*
|
||||
FLTK does no small string optimization.
|
||||
If the string is empty and capacity is not set, buffer_ will be NULL.
|
||||
*/
|
||||
char *buffer_;
|
||||
int size_;
|
||||
int capacity_;
|
||||
|
||||
void init_();
|
||||
void grow_(int n);
|
||||
void shrink_(int n);
|
||||
Fl_String &replace_(int at, int n_del, const char *src, int n_ins);
|
||||
|
||||
protected:
|
||||
static const char NUL;
|
||||
|
||||
public:
|
||||
static const int npos;
|
||||
|
||||
// ---- Assignment
|
||||
Fl_String();
|
||||
Fl_String(const Fl_String &str);
|
||||
Fl_String(const char *cstr);
|
||||
Fl_String(const char *str, int size);
|
||||
~Fl_String();
|
||||
Fl_String& operator=(const Fl_String &str);
|
||||
Fl_String& operator=(const char *cstr);
|
||||
Fl_String &assign(const Fl_String &str);
|
||||
Fl_String &assign(const char *cstr);
|
||||
Fl_String &assign(const char *str, int size);
|
||||
|
||||
// ---- Element Access
|
||||
char at(int pos) const;
|
||||
char operator[](int n) const;
|
||||
char &operator[](int n);
|
||||
const char *data() const;
|
||||
char *data();
|
||||
const char *c_str() const;
|
||||
|
||||
// ---- Capacity
|
||||
bool empty() const;
|
||||
int size() const;
|
||||
void reserve(int n);
|
||||
int capacity() const;
|
||||
void shrink_to_fit();
|
||||
|
||||
// --- Operations
|
||||
void clear();
|
||||
Fl_String &insert(int at, const char *src, int n_ins=npos);
|
||||
Fl_String &insert(int at, const Fl_String &src);
|
||||
Fl_String &erase(int at, int n_del);
|
||||
void push_back(char c);
|
||||
void pop_back();
|
||||
Fl_String &append(const char *src, int n_ins=npos);
|
||||
Fl_String &append(const Fl_String &src);
|
||||
Fl_String &append(char c);
|
||||
Fl_String &operator+=(const char *src);
|
||||
Fl_String &operator+=(const Fl_String &src);
|
||||
Fl_String &operator+=(char c);
|
||||
int find(const Fl_String &needle, int start_pos=0) const;
|
||||
Fl_String &replace(int at, int n_del, const char *src, int n_ins=npos);
|
||||
Fl_String &replace(int at, int n_del, const Fl_String &src);
|
||||
Fl_String substr(int pos=0, int n=npos) const;
|
||||
void resize(int n);
|
||||
|
||||
// --- Non Standard
|
||||
int strlen() const;
|
||||
void debug(const char *info = 0) const;
|
||||
void hexdump(const char *info = 0) const;
|
||||
}; // class Fl_String
|
||||
|
||||
// ---- Non-member functions
|
||||
FL_EXPORT Fl_String operator+(const Fl_String& lhs, const Fl_String& rhs);
|
||||
FL_EXPORT Fl_String operator+(const Fl_String& lhs, const char* rhs);
|
||||
FL_EXPORT bool operator==(const Fl_String & lhs, const Fl_String & rhs);
|
||||
FL_EXPORT bool operator!=(const Fl_String & lhs, const Fl_String & rhs);
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
\}
|
||||
\endcond
|
||||
*/
|
||||
|
||||
#endif // _FL_Fl_String_H_
|
||||
@ -1,668 +0,0 @@
|
||||
//
|
||||
// Basic Fl_String class for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
// Copyright 2021-2023 by Bill Spitzak and others.
|
||||
//
|
||||
// This library is free software. Distribution and use rights are outlined in
|
||||
// the file "COPYING" which should have been included with this file. If this
|
||||
// file is missing or damaged, see the license at:
|
||||
//
|
||||
// https://www.fltk.org/COPYING.php
|
||||
//
|
||||
// Please see the following page on how to report bugs and issues:
|
||||
//
|
||||
// https://www.fltk.org/bugs.php
|
||||
//
|
||||
|
||||
#if 0
|
||||
|
||||
/**
|
||||
\cond DriverDev
|
||||
\addtogroup DriverDeveloper
|
||||
\{
|
||||
*/
|
||||
|
||||
#include "Fl_String.H"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
/** \file src/Fl_String.cxx
|
||||
Basic Fl_String class for FLTK.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
If buffer_ is NULL, c_str() and buffer() will point here.
|
||||
*/
|
||||
const char Fl_String::NUL = 0;
|
||||
|
||||
/**
|
||||
Indicate a maximum value or error.
|
||||
This value is generally used as end of string indicator or as the error
|
||||
indicator by the functions that return a string index.
|
||||
*/
|
||||
const int Fl_String::npos = INT_MAX;
|
||||
|
||||
/**
|
||||
Initialise the class instance.
|
||||
*/
|
||||
void Fl_String::init_() {
|
||||
buffer_ = NULL;
|
||||
size_ = 0;
|
||||
capacity_ = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Grow the buffer to a capacity of at least n bytes.
|
||||
|
||||
This method will always grow the buffer size, or keep it as is, but never
|
||||
shrink it. Use shrink_to_fit() to shrink the buffer as much as possible.
|
||||
|
||||
\param[in] n number of bytes needed, not counting the trailing NUL
|
||||
*/
|
||||
void Fl_String::grow_(int n) {
|
||||
if (n <= capacity_)
|
||||
return;
|
||||
int alloc_size_ = n + 1; // trailing NUL
|
||||
// round n up so we can grow in chunks
|
||||
if (alloc_size_ <= 24) { // allocate at least 24 bytes
|
||||
alloc_size_ = 24;
|
||||
} else if (alloc_size_ < 1024 + 8) {
|
||||
alloc_size_ = ((alloc_size_+128-8) & ~127) + 8; // allocate in 128 byte chunks
|
||||
} else {
|
||||
alloc_size_ = ((alloc_size_+2048-8) & ~2047) + 8; // allocate in 2k chunks
|
||||
// adding 8 keeps the buffer 64-bit aligned while generating a space for
|
||||
// the trailing NUL without jumping to the next chunk size for common
|
||||
// allocations like 1024 or 2048 (FL_PATH_MAX).
|
||||
}
|
||||
// allocate now
|
||||
char *new_buffer = (char*)::malloc(alloc_size_);
|
||||
if (buffer_ && (size_ > 0)) {
|
||||
memcpy(new_buffer, buffer_, size_);
|
||||
::free(buffer_);
|
||||
}
|
||||
if (size_ >= 0)
|
||||
new_buffer[size_] = 0; // trailing NUL
|
||||
buffer_ = new_buffer;
|
||||
capacity_ = alloc_size_-1; // trailing NUL
|
||||
}
|
||||
|
||||
/**
|
||||
Shrink the buffer to n bytes, or size, if size > n.
|
||||
|
||||
Shrink the buffer as much as possible. If \p n is 0 and the string is empty,
|
||||
the buffer will be released.
|
||||
|
||||
\param[in] n shrink buffer to n bytes, not counting the trailing NUL
|
||||
*/
|
||||
void Fl_String::shrink_(int n) {
|
||||
if (n < size_)
|
||||
n = size_;
|
||||
if (n == capacity_)
|
||||
return;
|
||||
if (n == 0) {
|
||||
if (buffer_)
|
||||
::free(buffer_);
|
||||
buffer_ = NULL;
|
||||
} else {
|
||||
buffer_ = (char*)::realloc(buffer_, n+1); // NUL
|
||||
buffer_[size_] = 0; // trailing NUL
|
||||
}
|
||||
capacity_ = n;
|
||||
}
|
||||
|
||||
/**
|
||||
Remove \p n_del bytes at \p at and insert \p n_ins bytes from \p src.
|
||||
|
||||
String will remain NUL terminated. Data in \p ins may contain NULs.
|
||||
|
||||
\param[in] at remove and insert bytes at this index
|
||||
\param[in] n_del number of bytes to remove
|
||||
\param[in] ins insert bytes from here, can be NULL if \p n_ins is also 0
|
||||
\param[in] n_ins number of bytes to insert
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::replace_(int at, int n_del, const char *ins, int n_ins) {
|
||||
if (at > size_) at = size_;
|
||||
if (n_del > size_ - at) n_del = size_ - at;
|
||||
int diff = n_ins - n_del, new_size = size_ + diff;
|
||||
if (diff) {
|
||||
int src = at + n_del, dst = at + n_ins, n = size_ - src;
|
||||
grow_(new_size);
|
||||
if (n > 0) ::memmove(buffer_+dst, buffer_+src, n);
|
||||
}
|
||||
if (n_ins > 0) {
|
||||
::memmove(buffer_+at, ins, n_ins);
|
||||
}
|
||||
size_ = new_size;
|
||||
if (buffer_)
|
||||
buffer_[size_] = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// ---- Assignment ----------------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Allocate an empty string.
|
||||
*/
|
||||
Fl_String::Fl_String() {
|
||||
init_();
|
||||
}
|
||||
|
||||
/**
|
||||
Copy constructor.
|
||||
\param[in] str copy from another Fl_String
|
||||
*/
|
||||
Fl_String::Fl_String(const Fl_String &str) {
|
||||
init_();
|
||||
assign(str);
|
||||
}
|
||||
|
||||
/**
|
||||
Constructor from a C-style string.
|
||||
\param[in] cstr a NUL terminated C-style string
|
||||
*/
|
||||
Fl_String::Fl_String(const char *cstr) {
|
||||
init_();
|
||||
assign(cstr);
|
||||
}
|
||||
|
||||
/**
|
||||
Constructor from data of \p size bytes.
|
||||
\param[in] str a block of data that may contain NUL characters
|
||||
\param[in] size number of bytes to copy
|
||||
*/
|
||||
Fl_String::Fl_String(const char *str, int size) {
|
||||
init_();
|
||||
assign(str, size);
|
||||
}
|
||||
|
||||
/**
|
||||
Destructor.
|
||||
*/
|
||||
Fl_String::~Fl_String() {
|
||||
if (buffer_)
|
||||
::free(buffer_);
|
||||
}
|
||||
|
||||
/**
|
||||
Copy assignment operator
|
||||
\param[in] str copy from another Fl_String
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::operator=(const Fl_String &str) {
|
||||
return assign(str);
|
||||
}
|
||||
|
||||
/**
|
||||
Assign a C-style string.
|
||||
\param[in] cstr a NUL terminated C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::operator=(const char *cstr) {
|
||||
return assign(cstr);
|
||||
}
|
||||
|
||||
/**
|
||||
Copy another string.
|
||||
\param[in] str copy from another Fl_String
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::assign(const Fl_String &str) {
|
||||
if (&str == this) return *this;
|
||||
return assign(str.data(), str.size());
|
||||
}
|
||||
|
||||
/**
|
||||
Assign a C-style string.
|
||||
\param[in] cstr a NUL terminated C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::assign(const char *cstr) {
|
||||
if (cstr && *cstr) {
|
||||
int len = (int)::strlen(cstr);
|
||||
return assign(cstr, len);
|
||||
} else {
|
||||
resize(0);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
Assign a data block of \p size bytes.
|
||||
\param[in] str a block of data that may contain NUL characters
|
||||
\param[in] size number of bytes to copy
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::assign(const char *str, int size) {
|
||||
if (size > 0) {
|
||||
grow_(size);
|
||||
memcpy(buffer_, str, size);
|
||||
buffer_[size] = 0;
|
||||
size_ = size;
|
||||
} else {
|
||||
resize(0);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// ---- Element Access ------------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Returns the character at specified bounds checked location.
|
||||
\param[in] n index of character
|
||||
\return character at that index, or NUL if out of bounds
|
||||
*/
|
||||
char Fl_String::at(int n) const {
|
||||
if ((n < 0) || (n >= size_))
|
||||
return 0;
|
||||
return operator[](n);
|
||||
}
|
||||
|
||||
/**
|
||||
Returns the character at specified location.
|
||||
\param[in] n index of character
|
||||
\return character at that index
|
||||
*/
|
||||
char Fl_String::operator[](int n) const {
|
||||
if (buffer_)
|
||||
return buffer_[n];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Returns a reference to the character at specified location.
|
||||
\param[in] n index of character
|
||||
\return reference to that character, so it can be used as lvalue
|
||||
*/
|
||||
char &Fl_String::operator[](int n) {
|
||||
if (!buffer_)
|
||||
reserve(1);
|
||||
return buffer_[n];
|
||||
}
|
||||
|
||||
/**
|
||||
Return a pointer to the NUL terminated string.
|
||||
\return reference to non-mutable string
|
||||
*/
|
||||
const char *Fl_String::data() const {
|
||||
if (buffer_)
|
||||
return buffer_;
|
||||
else
|
||||
return &NUL;
|
||||
}
|
||||
|
||||
/**
|
||||
Return a pointer to the writable NUL terminated string.
|
||||
\return reference to mutable string
|
||||
*/
|
||||
char *Fl_String::data() {
|
||||
if (!buffer_)
|
||||
reserve(1);
|
||||
return buffer_;
|
||||
}
|
||||
|
||||
/**
|
||||
Return a pointer to the NUL terminated string.
|
||||
|
||||
\return reference to non-mutable string
|
||||
|
||||
\note same as Fl_String::data() const
|
||||
*/
|
||||
const char *Fl_String::c_str() const {
|
||||
return data();
|
||||
}
|
||||
|
||||
// ---- Capacity ------------------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Checks if the string is empty.
|
||||
\return true if string contains no data
|
||||
*/
|
||||
bool Fl_String::empty() const {
|
||||
return (size_ == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Returns the number of bytes in the string.
|
||||
\return number of bytes in string, not counting trailing NUL
|
||||
*/
|
||||
int Fl_String::size() const {
|
||||
return size_;
|
||||
}
|
||||
|
||||
/**
|
||||
Reserve n bytes for storage.
|
||||
If n is less or equal than size, the capacity is set to size.
|
||||
\param[in] n requested minimum size, not counting trailing NUL
|
||||
*/
|
||||
void Fl_String::reserve(int n) {
|
||||
grow_(n);
|
||||
}
|
||||
|
||||
/**
|
||||
Return the number of chars that are allocated for storage.
|
||||
\return string capacity, not counting trailing NUL
|
||||
*/
|
||||
int Fl_String::capacity() const {
|
||||
return capacity_;
|
||||
}
|
||||
|
||||
/**
|
||||
Shrink the capacity to fit the current size.
|
||||
*/
|
||||
void Fl_String::shrink_to_fit() {
|
||||
shrink_(size_);
|
||||
}
|
||||
|
||||
// ---- Operations ----------------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Set an empty string.
|
||||
*/
|
||||
void Fl_String::clear() {
|
||||
resize(0);
|
||||
}
|
||||
|
||||
/**
|
||||
Insert a C-style string or data.
|
||||
\param[in] at insert at this index
|
||||
\param[in] src copy bytes from here
|
||||
\param[in] n_ins optional number of bytes to copy - if not set, copy C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::insert(int at, const char *src, int n_ins) {
|
||||
if (n_ins == npos) n_ins = src ? (int)::strlen(src) : 0;
|
||||
return replace_(at, 0, src, n_ins);
|
||||
}
|
||||
|
||||
/**
|
||||
Insert another string.
|
||||
\param[in] at insert at this index
|
||||
\param[in] src copy string from here
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::insert(int at, const Fl_String &src) {
|
||||
return replace_(at, 0, src.buffer_, src.size_);
|
||||
}
|
||||
|
||||
/**
|
||||
Erase some bytes within a string.
|
||||
\param[in] at erase at this index
|
||||
\param[in] n_del number of bytes to erase
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::erase(int at, int n_del) {
|
||||
return replace_(at, n_del, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Append a single character.
|
||||
\param[in] c append this byte
|
||||
*/
|
||||
void Fl_String::push_back(char c) {
|
||||
replace_(size_, 0, &c, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
Remove the last character.
|
||||
*/
|
||||
void Fl_String::pop_back() {
|
||||
replace_(size_-1, 1, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Append a C-style string or data.
|
||||
\param[in] src copy bytes from here
|
||||
\param[in] n_ins optional number of bytes to copy - if not set, copy C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::append(const char *src, int n_ins) {
|
||||
if (n_ins == npos) n_ins = src ? (int)::strlen(src) : 0;
|
||||
return replace_(size_, 0, src, n_ins);
|
||||
}
|
||||
|
||||
/**
|
||||
Append another string.
|
||||
\param[in] src copy string from here
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::append(const Fl_String &src) {
|
||||
return replace_(size_, 0, src.buffer_, src.size_);
|
||||
}
|
||||
|
||||
/**
|
||||
Append a single byte.
|
||||
\param[in] c single byte character
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::append(char c) {
|
||||
push_back(c);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
Append a C-style string or data.
|
||||
\param[in] src copy C-style string from here
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::operator+=(const char *src) {
|
||||
return append(src);
|
||||
}
|
||||
|
||||
/**
|
||||
Append another string.
|
||||
\param[in] src copy string from here
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::operator+=(const Fl_String &src) {
|
||||
return append(src);
|
||||
}
|
||||
|
||||
/**
|
||||
Append a single byte.
|
||||
\param[in] c single byte character
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::operator+=(char c) {
|
||||
return append(c);
|
||||
}
|
||||
|
||||
/**
|
||||
Find a string inside this string.
|
||||
\param[in] needle find this string
|
||||
\param[in] start_pos start looking at this position
|
||||
\return the offset of the text inside this string, if it was found
|
||||
\return Fl_String::npos if the needle was not found
|
||||
*/
|
||||
int Fl_String::find(const Fl_String &needle, int start_pos) const {
|
||||
if ((start_pos < 0) || (start_pos >= size_)) return npos;
|
||||
const char *haystack = data() + start_pos;
|
||||
const char *found = strstr(haystack, needle.c_str());
|
||||
if (!found) return npos;
|
||||
return (int)(found - data());
|
||||
}
|
||||
|
||||
/**
|
||||
Replace part of the string with a C-style string or data.
|
||||
\param[in] at erase and insert at this index
|
||||
\param[in] n_del number of bytes to erase
|
||||
\param[in] src copy bytes from here
|
||||
\param[in] n_ins optional number of bytes to copy - if not set, copy C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::replace(int at, int n_del, const char *src, int n_ins) {
|
||||
if (n_ins == npos) n_ins = src ? (int)::strlen(src) : 0;
|
||||
return replace_(at, n_del, src, n_ins);
|
||||
}
|
||||
|
||||
/**
|
||||
Replace part of the string with another string.
|
||||
\param[in] at erase and insert at this index
|
||||
\param[in] n_del number of bytes to erase
|
||||
\param[in] src copy string from here
|
||||
\return self
|
||||
*/
|
||||
Fl_String &Fl_String::replace(int at, int n_del, const Fl_String &src) {
|
||||
return replace_(at, n_del, src.buffer_, src.size_);
|
||||
}
|
||||
|
||||
/**
|
||||
Return a substring from a string.
|
||||
\param[in] pos copy string from here - if omitted, copy from start
|
||||
\param[in] n number of bytes - if omitted, copy all bytes
|
||||
\return a new string
|
||||
*/
|
||||
Fl_String Fl_String::substr(int pos, int n) const {
|
||||
if (n > size_) n = size_;
|
||||
int first = pos, last = pos + n;
|
||||
if ((first < 0) || (first > size_) || (last <= first))
|
||||
return Fl_String();
|
||||
if (last > size_) last = size_;
|
||||
return Fl_String(buffer_+first, last-first);
|
||||
}
|
||||
|
||||
/**
|
||||
Resizes the string to n characters.
|
||||
|
||||
If \p n is less than the current size, the string will be cropped. If \p n
|
||||
is more than the current size, the new space will be filled with
|
||||
NUL characters.
|
||||
|
||||
\param[in] n new size of string
|
||||
*/
|
||||
void Fl_String::resize(int n) {
|
||||
if (n == size_)
|
||||
return;
|
||||
if (n < size_) {
|
||||
size_ = n;
|
||||
if (buffer_) buffer_[size_] = 0;
|
||||
} else {
|
||||
grow_(n);
|
||||
if (buffer_) ::memset(buffer_+size_, 0, n-size_+1);
|
||||
}
|
||||
size_ = n;
|
||||
}
|
||||
|
||||
// --- Non Standard ---------------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Returns the number of bytes until the first NUL byte.
|
||||
\return number of bytes in C-style string
|
||||
*/
|
||||
int Fl_String::strlen() const {
|
||||
if (!buffer_) return 0;
|
||||
return (int)::strlen(buffer_);
|
||||
}
|
||||
|
||||
/**
|
||||
Write some details about the string to stdout.
|
||||
|
||||
Nothing at all is written if \p info is NULL, otherwise the short info
|
||||
string and details are written to stdout.
|
||||
|
||||
The \p info string should not be longer than 20 characters to align the
|
||||
debug output of several strings.
|
||||
|
||||
\param[in] info short info string or NULL
|
||||
*/
|
||||
void Fl_String::debug(const char *info) const {
|
||||
if (info) {
|
||||
printf("Fl_String '%-20s': %p, value = %p (%d/%d):\n%s\n",
|
||||
info, this, buffer_, size_, capacity_, buffer_ ? buffer_ : "<NULL>");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Write some details about the string to stdout, followed by a hex dump of
|
||||
the string.
|
||||
|
||||
The first part is the same as written by Fl_String::debug(). The following
|
||||
part is a hexadecimal dump of all bytes of the string. Embedded \p nul bytes
|
||||
are possible and will be dumped as well.
|
||||
|
||||
\param[in] info short info string or NULL
|
||||
|
||||
\see Fl_String::debug(const char *info) const
|
||||
*/
|
||||
void Fl_String::hexdump(const char *info) const {
|
||||
debug(info);
|
||||
if (size_ == 0)
|
||||
return;
|
||||
for (int i = 0; i < size_; i++) {
|
||||
if ((i & 15) == 0) {
|
||||
if (i > 0)
|
||||
printf("\n");
|
||||
printf(" [%04x %4d] ", i, i); // position
|
||||
} else if ((i & 3) == 0) { // separator after 4 bytes
|
||||
printf(" ");
|
||||
}
|
||||
printf(" %02x", (unsigned char)buffer_[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
// ---- Non-member functions ------------------------------------------- MARK: -
|
||||
|
||||
/**
|
||||
Concatenate two strings.
|
||||
\param[in] lhs first string
|
||||
\param[in] rhs second string
|
||||
\return self
|
||||
*/
|
||||
Fl_String operator+(const Fl_String &lhs, const Fl_String &rhs) {
|
||||
Fl_String ret = lhs;
|
||||
return ret += rhs;
|
||||
}
|
||||
|
||||
/**
|
||||
Concatenate two strings.
|
||||
\param[in] lhs first string
|
||||
\param[in] rhs second C-style string
|
||||
\return self
|
||||
*/
|
||||
Fl_String operator+(const Fl_String &lhs, const char *rhs) {
|
||||
Fl_String ret = lhs;
|
||||
return ret += rhs;
|
||||
}
|
||||
|
||||
/**
|
||||
Compare two strings.
|
||||
\param[in] lhs first string
|
||||
\param[in] rhs second string
|
||||
\return true if strings are the same size and have the same content
|
||||
*/
|
||||
bool operator==(const Fl_String &lhs, const Fl_String &rhs) {
|
||||
if (lhs.size() == rhs.size()) {
|
||||
int sz = lhs.size();
|
||||
if (sz == 0) return true;
|
||||
if (memcmp(lhs.data(), rhs.data(), sz) == 0) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
Compare two strings for inequality.
|
||||
\param[in] lhs first string
|
||||
\param[in] rhs second string
|
||||
\return true if strings differ in size or content
|
||||
*/
|
||||
bool operator!=(const Fl_String &lhs, const Fl_String &rhs) {
|
||||
if (lhs.size() != rhs.size()) return true;
|
||||
int sz = lhs.size(); // same size for both
|
||||
if (memcmp(lhs.data(), rhs.data(), sz) != 0) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
\}
|
||||
\endcond
|
||||
*/
|
||||
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user