diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-12-31 05:04:42 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-12-31 05:04:42 +0400 |
commit | 71dc8760ff4de5f365330d1bc571d934deb54af9 (patch) | |
tree | 7346d42a282562a3937d82307012b5857d642ce6 /readom/io.c | |
download | cdrkit-upstream.tar.gz |
Imported Upstream version 1.1.11upstream/1.1.11upstream
Diffstat (limited to 'readom/io.c')
-rw-r--r-- | readom/io.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/readom/io.c b/readom/io.c new file mode 100644 index 0000000..364e0ed --- /dev/null +++ b/readom/io.c @@ -0,0 +1,193 @@ +/* + * This file has been modified for the cdrkit suite. + * + * The behaviour and appearence of the program code below can differ to a major + * extent from the version distributed by the original author(s). + * + * For details, see Changelog file distributed with the cdrkit package. If you + * received this file from another source then ask the distributing person for + * a log of modifications. + * + */ + +/* @(#)io.c 1.19 98/10/10 Copyright 1988 J. Schilling */ +/* + * Copyright (c) 1988 J. Schilling + */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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; see the file COPYING. If not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <mconfig.h> +#include <stdio.h> +#include <standard.h> +#include <vadefs.h> +#include <stdxlib.h> +#include <strdefs.h> +#include <utypes.h> +#include <schily.h> +#include <ctype.h> + +struct disk { + int dummy; +}; + +static char *skipwhite(const char *); +static void prt_std(char *, long, long, long, struct disk *); +BOOL cvt_std(char *, long *, long, long, struct disk *); +extern BOOL getvalue(char *, long *, long, long, + void (*)(char *, long, long, long, struct disk *), + BOOL (*)(char *, long *, long, long, struct disk *), + struct disk *); +extern BOOL getlong(char *, long *, long, long); +extern BOOL getint(char *, int *, int, int); +extern BOOL yes(char *, ...); + +static +char *skipwhite(const char *s) +{ + register const Uchar *p = (const Uchar *)s; + + while (*p) { + if (!isspace(*p)) + break; + p++; + } + return ((char *)p); +} + +/* ARGSUSED */ + +BOOL +cvt_std(char *linep, long *lp, long mini, long maxi, struct disk *dp) +{ + long l = -1L; + +/* printf("cvt_std(\"%s\", %d, %d, %d);\n", linep, *lp, mini, maxi);*/ + + if (linep[0] == '?') { + printf("Enter a number in the range from %ld to %ld\n", + mini, maxi); + printf("The default radix is 10\n"); + printf("Precede number with '0x' for hexadecimal or with '0' for octal\n"); + printf("Shorthands are:\n"); + printf("\t'^' for minimum value (%ld)\n", mini); + printf("\t'$' for maximum value (%ld)\n", maxi); + printf("\t'+' for incrementing value to %ld\n", *lp + 1); + printf("\t'-' for decrementing value to %ld\n", *lp - 1); + return (FALSE); + } + if (linep[0] == '^' && *skipwhite(&linep[1]) == '\0') { + l = mini; + } else if (linep[0] == '$' && *skipwhite(&linep[1]) == '\0') { + l = maxi; + } else if (linep[0] == '+' && *skipwhite(&linep[1]) == '\0') { + if (*lp < maxi) + l = *lp + 1; + } else if (linep[0] == '-' && *skipwhite(&linep[1]) == '\0') { + if (*lp > mini) + l = *lp - 1; + } else if (*astol(linep, &l)) { + printf("Not a number: '%s'.\n", linep); + return (FALSE); + } + if (l < mini || l > maxi) { + printf("'%s' is out of range.\n", linep); + return (FALSE); + } + *lp = l; + return (TRUE); +} + +/* ARGSUSED */ +static void +prt_std(char *s, long l, long mini, long maxi, struct disk *dp) +{ + printf("%s %ld (%ld - %ld)/<cr>:", s, l, mini, maxi); +} + + +BOOL getvalue(char *s, long *lp, long mini, long maxi, + void (*prt)(char *, long, long, long, struct disk *), + BOOL (*cvt)(char *, long *, long, long, struct disk *), + struct disk *dp) +{ + char line[128]; + char *linep; + + for(;;) { + (*prt)(s, *lp, mini, maxi, dp); + flush(); + line[0] = '\0'; + if (rols_getline(line, 80) == EOF) + exit(EX_BAD); + + linep = skipwhite(line); + /* + * Nicht initialisierte Variablen + * duerfen nicht uebernommen werden + */ + if (linep[0] == '\0' && *lp != -1L) + return (FALSE); + + if (strlen(linep) == 0) { + /* Leere Eingabe */ + /* EMPTY */ + } else if ((*cvt)(linep, lp, mini, maxi, dp)) + return (TRUE); + } + /* NOTREACHED */ +} + + +BOOL getlong(char *s, long *lp, long mini, long maxi) +{ + return (getvalue(s, lp, mini, maxi, prt_std, cvt_std, (void *)0)); +} + + +BOOL getint(char *s, int *ip, int mini, int maxi) +{ + long l = *ip; + BOOL ret; + + ret = getlong(s, &l, (long)mini, (long)maxi); + *ip = l; + return (ret); +} + +/* VARARGS1 */ +BOOL yes(char *form, ...) +{ + va_list args; + char okbuf[10]; + +again: + va_start(args, form); + vprintf(form, args); + va_end(args); + flush(); + if (rols_getline(okbuf, sizeof(okbuf)) == EOF) + exit(EX_BAD); + if (okbuf[0] == '?') { + printf("Enter 'y', 'Y', 'yes' or 'YES' if you agree with the previous asked question.\n"); + printf("All other input will be handled as if the question has beed answered with 'no'.\n"); + goto again; + } + if(streql(okbuf, "y") || streql(okbuf, "yes") || + streql(okbuf, "Y") || streql(okbuf, "YES")) + return(TRUE); + else + return(FALSE); +} |