summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/stand/device-streams/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/amiga/stand/device-streams/util.c')
-rw-r--r--sys/arch/amiga/stand/device-streams/util.c342
1 files changed, 342 insertions, 0 deletions
diff --git a/sys/arch/amiga/stand/device-streams/util.c b/sys/arch/amiga/stand/device-streams/util.c
new file mode 100644
index 00000000000..d3bfeb0a683
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/util.c
@@ -0,0 +1,342 @@
+/* --------------------------------------------------
+ | NAME
+ | util
+ | PURPOSE
+ | provide some standard useful utility functions.
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | This program is free software; you can redistribute it and/or modify
+ | it under the terms of the GNU General Public License as published by
+ | the Free Software Foundation; either version 2 of the License, or
+ | (at your option) any later version.
+ |
+ | This program is distributed in the hope that it will be useful,
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ | GNU General Public License for more details.
+ |
+ | You should have received a copy of the GNU General Public License
+ | along with this program; if not, write to the Free Software
+ | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <error.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include "util.h"
+#include "string.h"
+
+/* Utility functions */
+
+/* string functions.
+ */
+int
+string_to_number(char *s, unsigned long *num)
+{
+ char *ns;
+ int base, errsave = errno;
+ unsigned long res;
+ int len;
+ s = stpblk(s);
+ ns = s;
+ len = strlen (s);
+ if((!strnicmp(s,"0x",2))) { /* check 0[xX]nnnnnnnn */
+ /* Hex number */
+ s += 2;
+ ns += 2;
+ base = 16;
+ } else if((!strnicmp(s,"x",1)) || /* check [xX]nnnnnnnn */
+ (s[0] == '$')) { /* check $nnnnnnnn */
+ /* Hex number */
+ s++;
+ ns++;
+ base = 16;
+ } else if((len && tolower (s[len-1]) == 'h') || /* check nnnnnnnn[Hh] */
+ (len>1 && tolower (s[len-2]) == 'h')) {
+
+ /* Hex number */
+ base = 16;
+ } else if((len && tolower (s[len-1]) == 'o') || /* check nnnnnnnnnn[Oo] */
+ (len>1 && tolower (s[len-2]) == 'o')) {
+ /* octal */
+ base = 8;
+ } else if( (len && tolower (s[len-1]) == 'b') || /* check nnnnnnnnnn[Bb] */
+ (len>1 && tolower (s[len-2]) == 'b')) {
+ /* binary */
+ base = 2;
+ } else {
+ /* assume decimal */
+ base = 10;
+ }
+ errno = 0;
+ len = strlen (s);
+ res = strtoul(s,&ns,base);
+ if(ns == s || (res == 0xffffffff && errno == ERANGE)) {
+ errno = errsave;
+ return(0); /* failed */
+ } else {
+ errno = errsave;
+ if ((len && s[len-1] == 'M') ||
+ (len>1 && s[len-2] == 'M')) {
+ /* result should be in Megabytes */
+ if (res <= 0xfff) {
+ res <<= 20;
+ } else {
+ errno = ERANGE;
+ return (0);
+ }
+ } else if ((len && tolower (s[len-1]) == 'k') ||
+ (len>1 && tolower (s[len-2]) == 'k')) {
+ /* result should be in kilobytes */
+ if (res <= 0x3ffffff) {
+ res <<= 10;
+ } else {
+ errno = ERANGE;
+ return (0);
+ }
+ }
+ *num = res;
+ }
+ return(ns - s); /* it worked */
+}
+
+char *
+stripws (char *s)
+{
+ while (isspace (*s)) {
+ s++;
+ }
+ return (s);
+}
+
+/* string = fgetline(fileptr) :: replacement for fgets. no length limits. */
+/* ------------------------- */
+/* fgetline function returns a dynamic string of any length. The string is */
+/* the next line from ``fp'' arg. Returns NULL for failure or EOF the */
+/* reason can be detirmened by feof() and errno. On an error that is not */
+/* EOF will flush the buffer to EOL if possible. The returned string has */
+/* the newline stripped. */
+
+/* sorry about the asm like comments I wrote this for a school project and */
+/* the prof is decidedly in favor of verbosity. I think the code is clear */
+/* enough alone, and most of these comments clutter the clarity. Oh well.*/
+
+char *fgetline(FILE *fp)
+{
+ enum local_constants { locbufsize = 40 };
+ char *retstr = NULL, *temp;
+ char locbuf[locbufsize];
+ char locbuflen = 0;
+
+ while(1) { /* do forever. */
+ while(locbuflen < (locbufsize-1)) {
+ int ch = fgetc(fp); /* get next character from */
+ /* stream. */
+
+ if(ch == EOF) { /* check for end of file. */
+ free_string(retstr); /* free_string retstr */
+ /* if EOF. */
+ return(NULL); /* and return NULL. */
+ } else if( ch == '\n' ) {
+ locbuf[locbuflen] = 0; /* got newline null term. */
+ temp = concat_strings(retstr,locbuf); /* and concat local */
+ /* buffer. */
+ free_string(retstr);
+ return(temp); /* return new string. */
+ } else {
+ locbuf[locbuflen++] = ch; /* add to local buffer */
+ }
+ }
+ /* we need to reset out local buffer. */
+ locbuf[locbuflen] = 0; /* null terminate. */
+ temp = retstr;
+ retstr = concat_strings(retstr,locbuf); /* concatenate locbuf to */
+ /* older string. */
+ locbuflen = 0; /* zero local buffer. */
+ free_string(temp); /* free old string. */
+
+ if(retstr == NULL) {
+ flush_to_eol(fp); /* flush to EOL on fail. */
+ return(NULL); /* and return NULL. */
+ }
+ }
+}
+
+/* flush ``fp'' to end of line, if possible. returns 0 on success or EOF for */
+/* error. */
+int flush_to_eol(FILE *fp)
+{
+ int ch;
+ while(EOF != (ch = fgetc(fp))) { /* loop until EOF */
+ if(ch == '\n') { /* if newline, return. */
+ return(0);
+ }
+ }
+ return(EOF);
+}
+
+/* Concatenate 2 strings into a new one. Both or either of the inputs */
+/* ``before'' and ``after'' can be NULL. returns NULL for failure */
+/* setting errno acordingly. */
+char *concat_strings(const char *before, const char *after)
+{
+ char *string = NULL;
+ int len1 = 0, len2 = 0;
+ if(before) /* if non null */
+ len1 = strlen(before); /* get length */
+
+ if(after) /* if non null */
+ len2 = strlen(after); /* get length */
+
+ string = malloc(len1 + len2 + 1); /* allocate storage for */
+ /* new string. */
+ if(string) {
+ memcpy(string,before,len1); /* copy ``before'' */
+ memcpy(&string[len1],after,len2); /* cat ``after'' */
+ string[len1+len2] = '\0'; /* null terminate. */
+ }
+ return(string); /* return string (or NULL) */
+}
+
+/* free_string() - frees a string gotten from misc string routines. input */
+/* can be NULL. */
+void free_string(char *string)
+{
+ if(string) /* if non NULL */
+ free(string); /* free string. */
+}
+
+char *
+alloc_string (char *s)
+{
+ char *d = malloc (strlen (s) + 1);
+ if (d) {
+ strcpy (d, s);
+ }
+ return (d);
+}
+
+int
+ask_bool (int def, int other, char *f, ...)
+{
+ char buffer[20];
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "? [%lc%lc]:",toupper (def),tolower (other));
+ fflush (mout);
+ if (fgets (buffer, 18, min)) {
+ char *s = stripws (buffer);
+ if (s[0] != 0 && s[0] != '\n') {
+ def = (int) s[0];
+ }
+ }
+ if (buffer[strlen (buffer)-1] != '\n') {
+ flush_to_eol (min);
+ }
+ return (def);
+}
+
+void *
+zmalloc (size_t b)
+{
+ void *mem = malloc (b);
+ if (mem) {
+ memset (mem, 0, b);
+ }
+ return (mem);
+}
+
+void
+zfree (void *mem)
+{
+ if (mem)
+ free (mem);
+}
+
+struct Node *
+find_name (struct List *l, char *s)
+{
+ struct Node *n = l->lh_Head;
+ while (n->ln_Succ) {
+ if (!stricmp (s, n->ln_Name)) {
+ return (n);
+ }
+ n = n->ln_Succ;
+ }
+ return (NULL);
+}
+
+void
+verbose_message (char *f, ...)
+{
+ if (opt_verbose) {
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+debug_message (char *f, ...)
+{
+ if (opt_debug) {
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "debug: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+verbose_debug_message (char *f, ...)
+{
+ if (opt_verbose && opt_debug) {
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "debug: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+message (char *f, ...)
+{
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+void
+warn_message (char *f, ...)
+{
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "warn: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+void
+vmessage (char *f, va_list ap)
+{
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+
+