⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.cc

📁 早期freebsd实现
💻 CC
字号:
// -*- C++ -*-/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.     Written by James Clark (jjc@jclark.com)This file is part of groff.groff is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.groff is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public License alongwith groff; see the file COPYING.  If not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdio.h>#include "stringclass.h"#include "lib.h"static char *salloc(int len, int *sizep);static void sfree(char *ptr, int size);static char *sfree_alloc(char *ptr, int size, int len, int *sizep);static char *srealloc(char *ptr, int size, int oldlen, int newlen, int *sizep);static char *salloc(int len, int *sizep){  if (len == 0) {    *sizep = 0;    return 0;  }  else    return new char[*sizep = len*2];}static void sfree(char *ptr, int){  a_delete ptr;}static char *sfree_alloc(char *ptr, int oldsz, int len, int *sizep){  if (oldsz >= len) {    *sizep = oldsz;    return ptr;  }  a_delete ptr;  if (len == 0) {    *sizep = 0;    return 0;  }  else    return new char[*sizep = len*2];}static char *srealloc(char *ptr, int oldsz, int oldlen, int newlen, int *sizep){  if (oldsz >= newlen) {    *sizep = oldsz;    return ptr;  }  if (newlen == 0) {    a_delete ptr;    *sizep = 0;    return 0;  }  else {    char *p = new char[*sizep = newlen*2];    if (oldlen < newlen && oldlen != 0)      memcpy(p, ptr, oldlen);    a_delete ptr;    return p;  }}string::string() : len(0), ptr(0), sz(0){}string::string(const char *p, int n) : len(n){  assert(n >= 0);  ptr = salloc(n, &sz);  if (n != 0)    memcpy(ptr, p, n);}string::string(const char *p){  if (p == 0) {    len = 0;    ptr = 0;    sz = 0;  }  else {    len = strlen(p);    ptr = salloc(len, &sz);    memcpy(ptr, p, len);  }}string::string(char c) : len(1){  ptr = salloc(1, &sz);  *ptr = c;}string::string(const string &s) : len(s.len){  ptr = salloc(len, &sz);  if (len != 0)    memcpy(ptr, s.ptr, len);}  string::~string(){  sfree(ptr, sz);}string &string::operator=(const string &s){  ptr = sfree_alloc(ptr, sz, s.len, &sz);  len = s.len;  if (len != 0)    memcpy(ptr, s.ptr, len);  return *this;}string &string::operator=(const char *p){  if (p == 0) {    sfree(ptr, len);    len = 0;    ptr = 0;    sz = 0;  }  else {    int slen = strlen(p);    ptr = sfree_alloc(ptr, sz, slen, &sz);    len = slen;    memcpy(ptr, p, len);  }  return *this;}string &string::operator=(char c){  ptr = sfree_alloc(ptr, sz, 1, &sz);  len = 1;  *ptr = c;  return *this;}void string::move(string &s){  sfree(ptr, sz);  ptr = s.ptr;  len = s.len;  sz = s.sz;  s.ptr = 0;  s.len = 0;  s.sz = 0;}void string::grow1(){  ptr = srealloc(ptr, sz, len, len + 1, &sz);}string &string::operator+=(const char *p){  if (p != 0) {    int n = strlen(p);    int newlen = len + n;    if (newlen > sz)      ptr = srealloc(ptr, sz, len, newlen, &sz);    memcpy(ptr + len, p, n);    len = newlen;  }  return *this;}string &string::operator+=(const string &s){  if (s.len != 0) {    int newlen = len + s.len;    if (newlen > sz)      ptr = srealloc(ptr, sz, len, newlen, &sz);    memcpy(ptr + len, s.ptr, s.len);    len = newlen;  }  return *this;}void string::append(const char *p, int n){  if (n > 0) {    int newlen = len + n;    if (newlen > sz)      ptr = srealloc(ptr, sz, len, newlen, &sz);    memcpy(ptr + len, p, n);    len = newlen;  }}string::string(const char *s1, int n1, const char *s2, int n2){  assert(n1 >= 0 && n2 >= 0);  len = n1 + n2;  if (len == 0) {    sz = 0;    ptr = 0;  }  else {    ptr = salloc(len, &sz);    if (n1 == 0)      memcpy(ptr, s2, n2);    else {      memcpy(ptr, s1, n1);      if (n2 != 0)	memcpy(ptr + n1, s2, n2);    }  }}int operator<=(const string &s1, const string &s2){  return (s1.len <= s2.len	  ? s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) <= 0	  : s2.len != 0 && memcmp(s1.ptr, s2.ptr, s2.len) < 0);}int operator<(const string &s1, const string &s2){  return (s1.len < s2.len	  ? s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) <= 0	  : s2.len != 0 && memcmp(s1.ptr, s2.ptr, s2.len) < 0);}int operator>=(const string &s1, const string &s2){  return (s1.len >= s2.len	  ? s2.len == 0 || memcmp(s1.ptr, s2.ptr, s2.len) >= 0	  : s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) > 0);}int operator>(const string &s1, const string &s2){  return (s1.len > s2.len	  ? s2.len == 0 || memcmp(s1.ptr, s2.ptr, s2.len) >= 0	  : s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) > 0);}void string::set_length(int i){  assert(i >= 0);  if (i > sz)    ptr = srealloc(ptr, sz, len, i, &sz);  len = i;}void string::clear(){  len = 0;}int string::search(char c) const{  char *p = (char *)memchr(ptr, c, len);  return p ? p - ptr : -1;}// we silently strip nulschar *string::extract() const{  char *p = ptr;  int n = len;  int nnuls = 0;  for (int i = 0; i < n; i++)    if (p[i] == '\0')      nnuls++;  char *q = new char[n + 1 - nnuls];  char *r = q;  for (i = 0; i < n; i++)    if (p[i] != '\0')      *r++ = p[i];  q[n] = '\0';  return q;}void put_string(const string &s, FILE *fp){  int len = s.length();  const char *ptr = s.contents();  for (int i = 0; i < len; i++)    putc(ptr[i], fp);}string as_string(int i){  static char buf[INT_DIGITS + 2];  sprintf(buf, "%d", i);  return string(buf);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -