ratatoskr-messenger/zwgc/new_string.c

194 lines
4.6 KiB
C

/* This file is part of the Project Athena Zephyr Notification System.
* It is one of the source files comprising zwgc, the Zephyr WindowGram
* client.
*
* Created by: Marc Horowitz <marc@athena.mit.edu>
*
* $Id$
*
* Copyright (c) 1989 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include "new_string.h"
#if (!defined(lint) && !defined(SABER))
static const char rcsid_new_string_c[] = "$Id$";
#endif
/*
* string - a module providing operations on C strings. (i.e., char *'s)
*
* Overview:
*
* A string is a standard C string. I.e., a char pointer to a
* null-terminated sequence of characters. 0 is NOT considered a valid
* string! Various operations are available. See the string_spec file
* for details.
*
* Note: This module assumes that malloc NEVER returns 0 for reasonable
* requests. It is the users responsibility to either ensure that
* this happens or supply a version of malloc with error
* handling.
*
* Some strings are mutable.
*/
#ifdef DEBUG
#define assert(x) if (!(x)) abort()
#else
#define assert(x)
#endif
#include "new_memory.h"
/*
* string string_CreateFromData(char *data, int length):
* Requires: data[0], data[1], ..., data[length-1] != 0
* Effects: Takes the first length characters at data and
* creates a string containing them. The returned string
* is on the heap & must be freed eventually.
* I.e., if passed "foobar" and 3, it would return
* string_Copy("foo").
*/
string string__CreateFromData(char *data, int length)
{
string result;
assert(length>=0);
result = (string)malloc(length+1);
assert(result);
(void) memcpy(result, data, length);
result[length] = 0;
return(result);
}
/*
* string string_Copy(string s):
* Effects: Returns a copy of s on the heap. The copy must be
* freed eventually.
*/
string
string__Copy(string s)
{
int length;
string result;
assert(s);
length = string_Length(s)+1;
result = (string)malloc(length);
assert(result);
(void) memcpy(result, s, length);
return(result);
}
/*
* string string_Concat(string a, b):
* Effects: Returns a string equal to a concatenated to b.
* The returned string is on the heap and must be
* freed eventually. I.e., given "abc" and "def",
* returns string_Copy("abcdef").
*/
string
string__Concat(string a,
string b)
{
string result;
int a_length, b_size, result_size;
a_length = string_Length(a);
b_size = string_Length(b)+1;
result_size = a_length+b_size;
result = (string)malloc(result_size);
assert(result);
(void) memcpy(result, a, a_length);
(void) memcpy(result+a_length, b, b_size);
return(result);
}
/*
* string string_Concat2(string a, b):
* Modifies: a
* Requires: a is on the heap, b does not point into a.
* Effects: Equivalent to:
* string temp;
* temp = string_Concat(a,b);
* free(a);
* return(temp);
* only faster. I.e., uses realloc instead of malloc+memcpy.
*/
string
string__Concat2(string a,
string b)
{
int a_length = string_Length(a);
int b_size = string_Length(b)+1;
#ifdef DEBUG_MEMORY
assert(memory__on_heap_p(a));
#endif
a = (string)realloc(a, a_length+b_size);
assert(a);
(void) memcpy(a+a_length, b, b_size);
return(a);
}
/*
* string string_Downcase(string s):
* Modifies: s
* Effects: Modifies s by changing every uppercase character in s
* to the corresponding lowercase character. Nothing else
* is changed. I.e., "FoObAr19." is changed to "foobar19.".
* S is returned as a convenience.
*/
string
string_Downcase(string s)
{
char *ptr;
for (ptr=s; *ptr; ptr++) {
if (isupper(*ptr))
*ptr = tolower(*ptr);
}
return(s);
}
/*
* string string_Upcase(string s):
* Modifies: s
* Effects: Modifies s by changing every lowercase character in s
* to the corresponding uppercase character. Nothing else
* is changed. I.e., "FoObAr19." is changed to "FOOBAR19.".
* S is returned as a convenience.
*/
string
string_Upcase(string s)
{
char *ptr;
for (ptr=s; *ptr; ptr++) {
if (islower(*ptr))
*ptr = toupper(*ptr);
}
return(s);
}