home *** CD-ROM | disk | FTP | other *** search
- /* strings.c
- * MACHINE: RISC OS 3.60
- * LANGUAGE: Acorn C v5.06
- * LIBRARIES: OSLib
- * AUTHOR: Cy Booker <cy@cheepnis.demon.co.uk>
- * LICENCE: Freeware, copyright 1995
- */
-
- #include "strings.h"
-
-
- #include <assert.h>
- #include <limits.h>
- #include <stddef.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
-
- #include "OS:osfile.h"
- #include "OS:territory.h"
-
-
- #include "main.h"
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- #define EOL "\x0a\x0d"
-
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_read(
- strings *s,
- const char *filename) {
- int file_size;
- fileswitch_object_type type;
- char *file_buffer;
- char *rove;
- assert(s);
- assert(filename);
-
- assert(s);
- assert(filename);
- type = osfile_read_stamped(filename, NULL, NULL, &file_size, NULL, NULL);
- if (type == osfile_NOT_FOUND) {
- /* cope with history file not existing */
- return;
- }
- if (type != osfile_IS_FILE) {
- osfile_make_error(filename, type);
- }
-
- file_buffer = xmalloc(file_size+1);
- osfile_load_stamped(filename, (byte *)file_buffer, NULL, NULL, NULL, NULL);
- file_buffer[file_size] = '\0';
-
- for (rove= strtok(file_buffer, EOL); (rove); rove = strtok(NULL, EOL)) {
- strings_add(s, rove);
- }
- free(file_buffer);
- }
-
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_write(
- const strings *s,
- const char *filename) {
- FILE *file;
- node *node;
- unsigned int i;
-
- assert(s);
- assert(filename);
-
- assert(s);
- assert(filename);
-
- file = fopen(filename, "w");
- assert(file);
-
- node = s->head;
- for (i= s->count; (i > 0); i--) {
- assert(node);
- fputs(node->text, file);
- fputs("\n", file);
- node = node->next;
- }
- fclose(file);
- }
-
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_clear(
- strings *s) {
- unsigned int i;
- node *next;
- node *node;
-
- assert(s);
-
- node = s->head;
- for (i= s->count; (i > 0); i--) {
- assert(node);
- next = node->next;
- free(node);
- node = next;
- }
- s->count = 0;
- s->head = NULL;
- s->tail = NULL;
- }
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_add(
- strings *s,
- const char *text) {
- node *n;
-
- assert(s);
- assert(text);
-
- n = xmalloc(offsetof(node, text) + strlen(text) + 1);
- n->next = NULL;
- strcpy(n->text, text);
- strings_insert(s, n);
-
- }
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern node *strings_find(
- const strings *s,
- const char *text) {
- node *node;
- unsigned int i;
-
- assert(s);
- assert(text);
-
- node = s->head;
- for (i= s->count; (i > 0); i--) {
- assert(node);
- if (territory_collate(
- territory_CURRENT,
- text,
- node->text,
- territory_IGNORE_CASE) == 0) {
- return node;
- }
- node = node->next;
- }
- return NULL;
- }
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern node *strings_get(
- const strings *s,
- unsigned int index) {
- node *node;
- unsigned int i;
-
- assert(s);
- assert(index < s->count);
-
- node = s->head;
- for (i= 0; (i < index); i++) {
- assert(node);
- node = node->next;
- }
- assert(node);
- return node;
- }
-
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_insert(
- strings *s,
- node *node) {
- assert(s);
- assert(node);
- assert(node->next == NULL);
-
- if (s->tail) {
- assert(s->count > 0);
- assert(s->head);
- s->tail->next = node;
- } else {
- s->head = node;
- }
- s->tail = node;
- s->count++;
- }
-
-
-
- /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- extern void strings_remove(
- strings *s,
- node *n) {
- node *parent;
- unsigned int i;
-
- assert(s);
- assert(n);
-
- if (n == s->head) {
- s->head = n->next;
- if (s->head == NULL) {
- s->tail = NULL;
- }
- } else {
- parent = s->head;
- for (i= s->count; (i > 1); i--) {
- assert(parent->next);
- if (parent->next == n) {
- break;
- }
- parent = parent->next;
- }
- assert(parent->next == n);
- parent->next = n->next;
- if (parent->next == NULL) {
- s->tail = parent;
- }
- }
- s->count--;
- n->next = NULL;
- }
-
-
-