summaryrefslogtreecommitdiff
path: root/libtecla-1.4.1/stringrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtecla-1.4.1/stringrp.c')
-rw-r--r--libtecla-1.4.1/stringrp.c285
1 files changed, 0 insertions, 285 deletions
diff --git a/libtecla-1.4.1/stringrp.c b/libtecla-1.4.1/stringrp.c
deleted file mode 100644
index fe7d875..0000000
--- a/libtecla-1.4.1/stringrp.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2000, 2001 by Martin C. Shepherd.
- *
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons
- * to whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
- * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
- * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * of the copyright holder.
- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "freelist.h"
-#include "stringrp.h"
-
-/*
- * StringSegment objects store lots of small strings in larger
- * character arrays. Since the total length of all of the strings can't
- * be known in advance, an extensible list of large character arrays,
- * called string-segments are used.
- */
-typedef struct StringSegment StringSegment;
-struct StringSegment {
- StringSegment *next; /* A pointer to the next segment in the list */
- char *block; /* An array of characters to be shared between strings */
- int unused; /* The amount of unused space at the end of block[] */
-};
-
-/*
- * StringGroup is typedef'd in stringrp.h.
- */
-struct StringGroup {
- FreeList *node_mem; /* The StringSegment free-list */
- int block_size; /* The dimension of each character array block */
- StringSegment *head; /* The list of character arrays */
-};
-
-/*
- * Specify how many StringSegment's to allocate at a time.
- */
-#define STR_SEG_BLK 20
-
-/*.......................................................................
- * Create a new StringGroup object.
- *
- * Input:
- * segment_size int The length of each of the large character
- * arrays in which multiple strings will be
- * stored. This sets the length of longest
- * string that can be stored, and for efficiency
- * should be at least 10 times as large as
- * the average string that will be stored.
- * Output:
- * return StringGroup * The new object, or NULL on error.
- */
-StringGroup *_new_StringGroup(int segment_size)
-{
- StringGroup *sg; /* The object to be returned */
-/*
- * Check the arguments.
- */
- if(segment_size < 1) {
- fprintf(stderr, "_new_StringGroup: Invalid segment_size argument.\n");
- return NULL;
- };
-/*
- * Allocate the container.
- */
- sg = (StringGroup *) malloc(sizeof(StringGroup));
- if(!sg) {
- fprintf(stderr, "_new_StringGroup: Insufficient memory.\n");
- return NULL;
- };
-/*
- * Before attempting any operation that might fail, initialize the
- * container at least up to the point at which it can safely be passed
- * to _del_StringGroup().
- */
- sg->node_mem = NULL;
- sg->head = NULL;
- sg->block_size = segment_size;
-/*
- * Allocate the free list that is used to allocate list nodes.
- */
- sg->node_mem = _new_FreeList("_new_StringGroup", sizeof(StringSegment),
- STR_SEG_BLK);
- if(!sg->node_mem)
- return _del_StringGroup(sg);
- return sg;
-}
-
-/*.......................................................................
- * Delete a StringGroup object.
- *
- * Input:
- * sg StringGroup * The object to be deleted.
- * Output:
- * return StringGroup * The deleted object (always NULL).
- */
-StringGroup *_del_StringGroup(StringGroup *sg)
-{
- if(sg) {
- StringSegment *node;
-/*
- * Delete the character arrays.
- */
- for(node=sg->head; node; node=node->next) {
- if(node->block)
- free(node->block);
- node->block = NULL;
- };
-/*
- * Delete the list nodes that contained the string segments.
- */
- sg->node_mem = _del_FreeList("_del_StringGroup", sg->node_mem, 1);
- sg->head = NULL; /* Already deleted by deleting sg->node_mem */
-/*
- * Delete the container.
- */
- free(sg);
- };
- return NULL;
-}
-
-/*.......................................................................
- * Make a copy of a string in the specified string group, and return
- * a pointer to the copy.
- *
- * Input:
- * sg StringGroup * The group to store the string in.
- * string const char * The string to be recorded.
- * remove_escapes int If true, omit backslashes which escape
- * other characters when making the copy.
- * Output:
- * return char * The pointer to the copy of the string,
- * or NULL if there was insufficient memory.
- */
-char *_sg_store_string(StringGroup *sg, const char *string, int remove_escapes)
-{
- char *copy; /* The recorded copy of string[] */
-/*
- * Check the arguments.
- */
- if(!sg || !string)
- return NULL;
-/*
- * Get memory for the string.
- */
- copy = _sg_alloc_string(sg, strlen(string));
- if(copy) {
-/*
- * If needed, remove backslash escapes while copying the input string
- * into the cache string.
- */
- if(remove_escapes) {
- int escaped = 0; /* True if the next character should be */
- /* escaped. */
- const char *src = string; /* A pointer into the input string */
- char *dst = copy; /* A pointer into the cached copy of the */
- /* string. */
- while(*src) {
- if(!escaped && *src == '\\') {
- escaped = 1;
- src++;
- } else {
- escaped = 0;
- *dst++ = *src++;
- };
- };
- *dst = '\0';
-/*
- * If escapes have already been removed, copy the input string directly
- * into the cache.
- */
- } else {
- strcpy(copy, string);
- };
- };
-/*
- * Return a pointer to the copy of the string (or NULL if the allocation
- * failed).
- */
- return copy;
-}
-
-/*.......................................................................
- * Allocate memory for a string of a given length.
- *
- * Input:
- * sg StringGroup * The group to store the string in.
- * length int The required length of the string.
- * Output:
- * return char * The pointer to the copy of the string,
- * or NULL if there was insufficient memory.
- */
-char *_sg_alloc_string(StringGroup *sg, int length)
-{
- StringSegment *node; /* A node of the list of string segments */
- char *copy; /* The allocated string */
-/*
- * If the string is longer than block_size, then we can't record it.
- */
- if(length > sg->block_size || length < 0)
- return NULL;
-/*
- * See if there is room to record the string in one of the existing
- * string segments.
- */
- for(node=sg->head; node && node->unused <= length; node=node->next)
- ;
-/*
- * If there wasn't room, allocate a new string segment.
- */
- if(!node) {
- node = (StringSegment *) _new_FreeListNode(sg->node_mem);
- if(!node)
- return NULL;
-/*
- * Initialize the segment.
- */
- node->next = NULL;
- node->block = NULL;
- node->unused = sg->block_size;
-/*
- * Attempt to allocate the string segment character array.
- */
- node->block = (char *) malloc(sg->block_size);
- if(!node->block)
- return NULL;
-/*
- * Prepend the node to the list.
- */
- node->next = sg->head;
- sg->head = node;
- };
-/*
- * Get memory for the string.
- */
- copy = node->block + sg->block_size - node->unused;
- node->unused -= length + 1;
-/*
- * Return a pointer to the string memory.
- */
- return copy;
-}
-
-/*.......................................................................
- * Delete all of the strings that are currently stored by a specified
- * StringGroup object.
- *
- * Input:
- * sg StringGroup * The group of strings to clear.
- */
-void _clr_StringGroup(StringGroup *sg)
-{
- StringSegment *node; /* A node in the list of string segments */
-/*
- * Mark all of the string segments as unoccupied.
- */
- for(node=sg->head; node; node=node->next)
- node->unused = sg->block_size;
- return;
-}