/* Copyright 1996 Acorn Computers Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* File: string32.c * Purpose: strings terminated by char < 32 * Author: Timothy Roddis * History: 24-Jan-94: IDJ: created from original TGR sources */ #include "string32.h" /* Strings passed to the toolbox might be terminated with any control character ... */ #define NULL 0 void string_copy (char *dst_txt, char *src_txt) { /* * copy a ctrl-terminated string to a buffer big enough to * hold the result (no length checking). */ if (!src_txt) src_txt = ""; while ((*(dst_txt++)=*(src_txt++))>=32); *(--dst_txt) = '\0'; } char *string_copy_chk (char *dst_txt, char *src_txt, int max_len) { int i; /* * copy a ctrl-terminated string to a buffer checking it is big enough to * hold the result. Return NULL and nul-terminate, if dst buffer not * big enough. */ if (dst_txt == NULL || max_len == 0) return NULL; if (!src_txt) src_txt = ""; for (i=1;(*dst_txt++=*src_txt++)>=32;i++) if (i>=max_len) { *(--dst_txt) = '\0'; return NULL; } *(--dst_txt) = '\0'; return dst_txt; } int string_length (char *txt) { int i=0; /* * return length of ctrl-terminated string */ if (!txt) return 0; while (*txt++>=32) i++; return i; } void string_to_buffer (char *dst_txt, char *src_txt, int *max_len) { /* * general purpose routine to fill in a user-supplied buffer (and report * number of bytes written), or just report size of buffer needed. * If buffer is supplied (dst_txt != 0), then *max_len gives size of supplied * buffer; if this is not large enough, don't return an error, but return * size of bufer required! */ int src_len = string_length (src_txt) + 1; if (dst_txt == NULL) *max_len = src_len; else /* user-supplied buffer */ { if (*max_len >= src_len) string_copy (dst_txt, src_txt); else string_copy_chk (dst_txt, src_txt, *max_len); *max_len = string_length (dst_txt) + 1; } }