adding zephyr-im master branch
This commit is contained in:
193
zwgc/new_string.c
Normal file
193
zwgc/new_string.c
Normal file
@ -0,0 +1,193 @@
|
||||
/* 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);
|
||||
}
|
Reference in New Issue
Block a user