io.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)io.c 1.19 98/10/10 Copyright 1988 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)io.c 1.19 98/10/10 Copyright 1988 J. Schilling";
  5. #endif
  6. /*
  7.  * Copyright (c) 1988 J. Schilling
  8.  */
  9. /*
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. #include <mconfig.h>
  25. #include <stdio.h>
  26. #include <standard.h>
  27. #include <ctype.h>
  28. #include <vadefs.h>
  29. #include <stdxlib.h>
  30. #include <strdefs.h>
  31. #include <utypes.h>
  32. struct disk {
  33. int dummy;
  34. };
  35. LOCAL char *skipwhite __PR((const char *));
  36. LOCAL void prt_std __PR((char *, long, long, long, struct disk *));
  37. EXPORT BOOL cvt_std __PR((char *, long *, long, long, struct disk *));
  38. extern BOOL getvalue __PR((char *, long *, long, long,
  39. void (*)(char *, long, long, long, struct disk *),
  40. BOOL (*)(char *, long *, long, long, struct disk *),
  41. struct disk *));
  42. extern BOOL getlong __PR((char *, long *, long, long));
  43. extern BOOL getint __PR((char *, int *, int, int));
  44. extern BOOL yes __PR((char *, ...));
  45. LOCAL
  46. char *skipwhite(s)
  47.  const char *s;
  48. {
  49. register const Uchar *p = (const Uchar *)s;
  50. while (*p) {
  51. if (!isspace(*p))
  52. break;
  53. p++;
  54. }
  55. return ((char *)p);
  56. }
  57. /* ARGSUSED */
  58. EXPORT
  59. BOOL
  60. cvt_std(linep, lp, mini, maxi, dp)
  61. char *linep;
  62. long *lp;
  63. long mini;
  64. long maxi;
  65. struct disk *dp;
  66. {
  67. long l = -1L;
  68. /* printf("cvt_std("%s", %d, %d, %d);n", linep, *lp, mini, maxi);*/
  69. if (linep[0] == '?') {
  70. printf("Enter a number in the range from %ld to %ldn",
  71. mini, maxi);
  72. printf("The default radix is 10n");
  73. printf("Precede number with '0x' for hexadecimal or with '0' for octaln");
  74. printf("Shorthands are:n");
  75. printf("t'^' for minimum value (%ld)n", mini);
  76. printf("t'$' for maximum value (%ld)n", maxi);
  77. printf("t'+' for incrementing value to %ldn", *lp + 1);
  78. printf("t'-' for decrementing value to %ldn", *lp - 1);
  79. return (FALSE);
  80. }
  81. if (linep[0] == '^' && *skipwhite(&linep[1]) == '') {
  82. l = mini;
  83. } else if (linep[0] == '$' && *skipwhite(&linep[1]) == '') {
  84. l = maxi;
  85. } else if (linep[0] == '+' && *skipwhite(&linep[1]) == '') {
  86. if (*lp < maxi)
  87. l = *lp + 1;
  88. } else if (linep[0] == '-' && *skipwhite(&linep[1]) == '') {
  89. if (*lp > mini)
  90. l = *lp - 1;
  91. } else if (*astol(linep, &l)) {
  92. printf("Not a number: '%s'.n", linep);
  93. return (FALSE);
  94. }
  95. if (l < mini || l > maxi) {
  96. printf("'%s' is out of range.n", linep);
  97. return (FALSE);
  98. }
  99. *lp = l;
  100. return (TRUE);
  101. }
  102. /* ARGSUSED */
  103. LOCAL void
  104. prt_std(s, l, mini, maxi, dp)
  105. char *s;
  106. long l;
  107. long mini;
  108. long maxi;
  109. struct disk *dp;
  110. {
  111. printf("%s %ld (%ld - %ld)/<cr>:", s, l, mini, maxi);
  112. }
  113. EXPORT
  114. BOOL getvalue(s, lp, mini, maxi, prt, cvt, dp)
  115. char *s;
  116. long *lp;
  117. long mini;
  118. long maxi;
  119. void (*prt) __PR((char *, long, long, long, struct disk *));
  120. BOOL (*cvt) __PR((char *, long *, long, long, struct disk *));
  121. struct disk *dp;
  122. {
  123. char line[128];
  124. char *linep;
  125. for(;;) {
  126. (*prt)(s, *lp, mini, maxi, dp);
  127. flush();
  128. line[0] = '';
  129. if (getline(line, 80) == EOF)
  130. exit(EX_BAD);
  131. linep = skipwhite(line);
  132. /*
  133.  * Nicht initialisierte Variablen
  134.  * duerfen nicht uebernommen werden
  135.  */
  136. if (linep[0] == '' && *lp != -1L)
  137. return (FALSE);
  138. if (strlen(linep) == 0) {
  139. /* Leere Eingabe */
  140. } else if ((*cvt)(linep, lp, mini, maxi, dp))
  141. return (TRUE);
  142. }
  143. /* NOTREACHED */
  144. }
  145. EXPORT
  146. BOOL getlong(s, lp, mini, maxi)
  147. char *s;
  148. long *lp;
  149. long mini;
  150. long maxi;
  151. {
  152. return (getvalue(s, lp, mini, maxi, prt_std, cvt_std, (void *)0));
  153. }
  154. EXPORT
  155. BOOL getint(s, ip, mini, maxi)
  156. char *s;
  157. int *ip;
  158. int mini;
  159. int maxi;
  160. {
  161. long l = *ip;
  162. BOOL ret;
  163. ret = getlong(s, &l, (long)mini, (long)maxi);
  164. *ip = l;
  165. return (ret);
  166. }
  167. /* VARARGS1 */
  168. #ifdef PROTOTYPES
  169. EXPORT BOOL yes(char *form, ...)
  170. #else
  171. EXPORT
  172. BOOL yes(form, va_alist)
  173. char *form;
  174. va_dcl
  175. #endif
  176. {
  177. va_list args;
  178. char okbuf[10];
  179. again:
  180. #ifdef PROTOTYPES
  181. va_start(args, form);
  182. #else
  183. va_start(args);
  184. #endif
  185. printf("%r", form, args);
  186. va_end(args);
  187. flush();
  188. if (getline(okbuf, sizeof(okbuf)) == EOF)
  189. exit(EX_BAD);
  190. if (okbuf[0] == '?') {
  191. printf("Enter 'y', 'Y', 'yes' or 'YES' if you agree with the previous asked question.n");
  192. printf("All other input will be handled as if the question has beed answered with 'no'.n");
  193. goto again;
  194. }
  195. if(streql(okbuf, "y") || streql(okbuf, "yes") ||
  196.    streql(okbuf, "Y") || streql(okbuf, "YES"))
  197. return(TRUE);
  198. else
  199. return(FALSE);
  200. }