Wolfgang Thallergcc16 merge934c3885 months agoHistory
594 lines · 11.5 KB · C++
RawDownload
/* Copyright (C) 2021-2026 Free Software Foundation, Inc.   Contributed by Oracle.    This file is part of GNU Binutils.    This program 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 3, or (at your option)   any later version.    This program 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 this program; if not, write to the Free Software   Foundation, 51 Franklin Street - Fifth Floor, Boston,   MA 02110-1301, USA.  */ #include "config.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <values.h>#include <stdarg.h>#include <unistd.h> #include "libiberty.h"#include "gp-defs.h"#include "StringBuilder.h"#include "i18n.h" StringBuilder::StringBuilder (){  count = 0;  maxCapacity = 16;  value = (char *) xmalloc (maxCapacity);  memset (value, 0, maxCapacity);} StringBuilder::StringBuilder (int capacity){  count = 0;  maxCapacity = capacity;  value = (char *) xmalloc (maxCapacity);  memset (value, 0, maxCapacity);} StringBuilder::~StringBuilder (){  free (value);} voidStringBuilder::ensureCapacity (int minimumCapacity){  if (minimumCapacity > maxCapacity)    expandCapacity (minimumCapacity);} voidStringBuilder::expandCapacity (int minimumCapacity){  int newCapacity = (maxCapacity + 1) * 2;  if (newCapacity < 0)    newCapacity = MAXINT;  else if (minimumCapacity > newCapacity)    newCapacity = minimumCapacity;  char *newValue = (char *) xmalloc (newCapacity);  maxCapacity = newCapacity;  memcpy (newValue, value, count);  memset (newValue + count, 0, maxCapacity - count);  free (value);  value = newValue;} voidStringBuilder::trimToSize (){  if (count < maxCapacity)    {      char *newValue = (char *) xmalloc (count);      maxCapacity = count;      memcpy (newValue, value, count);      free (value);      value = newValue;    }} voidStringBuilder::trim (){  while (count > 0)    {      if (value[count - 1] != ' ')	break;      count--;    }} voidStringBuilder::setLength (int newLength){  if (newLength < 0)    return;  if (newLength > maxCapacity)    expandCapacity (newLength);  if (count < newLength)    {      for (; count < newLength; count++)	value[count] = '\0';    }  else    count = newLength;} charStringBuilder::charAt (int index){  if (index < 0 || index >= count)    return 0;  return value[index];} voidStringBuilder::getChars (int srcBegin, int srcEnd, char dst[], int dstBegin){  if (srcBegin < 0)    return;  if (srcEnd < 0 || srcEnd > count)    return;  if (srcBegin > srcEnd)    return;  memcpy (dst + dstBegin, value + srcBegin, srcEnd - srcBegin);} voidStringBuilder::setCharAt (int index, char ch){  if (index < 0 || index >= count)    return;  value[index] = ch;} StringBuilder *StringBuilder::append (StringBuilder *sb){  if (sb == NULL)    return append (NTXT ("null"));  int len = sb->count;  int newcount = count + len;  if (newcount > maxCapacity)    expandCapacity (newcount);  sb->getChars (0, len, value, count);  count = newcount;  return this;} StringBuilder *StringBuilder::append (const char str[]){  int len = (int) strlen (str);  int newCount = count + len;  if (newCount > maxCapacity)    expandCapacity (newCount);  memcpy (value + count, str, len);  count = newCount;  return this;} StringBuilder *StringBuilder::append (const char str[], int offset, int len){  int newCount = count + len;  if (newCount > maxCapacity)    expandCapacity (newCount);  memcpy (value + count, str + offset, len);  count = newCount;  return this;} StringBuilder *StringBuilder::append (bool b){  if (b)    append (NTXT ("true"));  else    append (NTXT ("false"));  return this;} StringBuilder *StringBuilder::append (char c){  int newCount = count + 1;  if (newCount > maxCapacity)    {      expandCapacity (newCount);    }  value[count++] = c;  return this;} StringBuilder *StringBuilder::append (int i){  char buf[16];  snprintf (buf, sizeof (buf), NTXT ("%d"), i);  append (buf);  return this;} StringBuilder *StringBuilder::append (unsigned int i){  char buf[16];  snprintf (buf, sizeof (buf), NTXT ("%u"), i);  append (buf);  return this;} StringBuilder *StringBuilder::append (long lng){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%ld"), lng);  append (buf);  return this;} StringBuilder *StringBuilder::append (unsigned long lng){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%lu"), lng);  append (buf);  return this;} StringBuilder *StringBuilder::append (long long lng){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%lld"), lng);  append (buf);  return this;} StringBuilder *StringBuilder::append (unsigned long long lng){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%llu"), lng);  append (buf);  return this;} StringBuilder *StringBuilder::append (float f){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%f"), (double) f);  append (buf);  return this;} StringBuilder *StringBuilder::append (double d){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%f"), d);  append (buf);  return this;} StringBuilder *StringBuilder::_delete (int start, int end){  if (start < 0)    return this;  if (end > count)    end = count;  if (start > end)    return this;  int len = end - start;  if (len > 0)    {      memcpy (value + start, value + start + len, count - end);      count -= len;    }  return this;} StringBuilder *StringBuilder::deleteCharAt (int index){  if (index < 0 || index >= count)    return this;  memcpy (value + index, value + index + 1, count - index - 1);  count--;  return this;} boolStringBuilder::endsWith (const char str[]){  if (str == NULL)    {      if (count == 0)	return true;      return false;    }  int len = (int) strlen (str);  if (len == 0)    return true;  int start = count - len;  if (start < 0)    return false;  int res = strncmp ((const char *) (value + start), str, len);  if (res != 0)    return false;  return true;} StringBuilder *StringBuilder::insert (int index, const char str[], int offset, int len){  if (index < 0 || index > count)    return this;  if (offset < 0 || len < 0 || offset > ((int) strlen (str)) - len)    return this;  int newCount = count + len;  if (newCount > maxCapacity)    expandCapacity (newCount);  memcpy (value + index + len, value + index, count - index);  memcpy (value + index, str + offset, len);  count = newCount;  return this;} StringBuilder *StringBuilder::insert (int offset, const char str[]){  if (offset < 0 || offset > count)    return this;  int len = (int) strlen (str);  int newCount = count + len;  if (newCount > maxCapacity)    expandCapacity (newCount);  memcpy (value + offset + len, value + offset, count - offset);  memcpy (value + offset, str, len);  count = newCount;  return this;} StringBuilder *StringBuilder::insert (int offset, bool b){  return insert (offset, b ? NTXT ("true") : NTXT ("false"));} StringBuilder *StringBuilder::insert (int offset, char c){  int newCount = count + 1;  if (newCount > maxCapacity)    expandCapacity (newCount);  memcpy (value + offset + 1, value + offset, count - offset);  value[offset] = c;  count = newCount;  return this;} StringBuilder *StringBuilder::insert (int offset, int i){  char buf[16];  snprintf (buf, sizeof (buf), NTXT ("%d"), i);  insert (offset, buf);  return this;} StringBuilder *StringBuilder::insert (int offset, long l){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%ld"), l);  insert (offset, buf);  return this;} StringBuilder *StringBuilder::insert (int offset, float f){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%f"), (double) f);  insert (offset, buf);  return this;} StringBuilder *StringBuilder::insert (int offset, double d){  char buf[32];  snprintf (buf, sizeof (buf), NTXT ("%f"), d);  insert (offset, buf);  return this;} StringBuilder *StringBuilder::reverse (){  int n = count - 1;  for (int j = (n - 1) >> 1; j >= 0; --j)    {      char temp = value[j];      char temp2 = value[n - j];      value[j] = temp2;      value[n - j] = temp;    }  return this;} //String *StringBuilder::toString();char *StringBuilder::toString (){  char *str = (char *) xmalloc (count + 1);  memcpy (str, value, count);  str[count] = '\0';  return str;} voidStringBuilder::toFile (FILE *fp){  append ('\0');  count--;  fprintf (fp, NTXT ("%s"), value);} voidStringBuilder::toFileLn (FILE *fp){  trim ();  append ('\0');  count--;  fprintf (fp, NTXT ("%s\n"), value);} voidStringBuilder::write (int fd){  if (count > 0)    ::write (fd, value, count);} StringBuilder *StringBuilder::sprintf (const char *fmt, ...){  int cnt;  setLength (0);   va_list vp;  va_start (vp, fmt);  cnt = vsnprintf (value, maxCapacity, fmt, vp);  va_end (vp);  if (cnt < maxCapacity)    {      count = cnt;      return this;    }   // Have to count the trailing zero  ensureCapacity (cnt + 1);  va_start (vp, fmt);  count = vsnprintf (value, maxCapacity, fmt, vp);  va_end (vp);  return this;} StringBuilder *StringBuilder::appendf (const char *fmt, ...){  va_list vp;  va_start (vp, fmt);  int cnt = vsnprintf (value + count, maxCapacity - count, fmt, vp);  va_end (vp);  if (cnt + count < maxCapacity)    {      count += cnt;      return this;    }   // Have to count the trailing zero  ensureCapacity (count + cnt + 1);  va_start (vp, fmt);  count += vsnprintf (value + count, maxCapacity - count, fmt, vp);  va_end (vp);

Lines 1–500 of 594.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t