]> git.cameronkatri.com Git - apple_cmds.git/blob - diskdev_cmds/fdisk.tproj/misc.c
setup.sh: Use iOS ~12 XNU version
[apple_cmds.git] / diskdev_cmds / fdisk.tproj / misc.c
1 /*
2 * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 /*
26 * Copyright (c) 1997 Tobias Weingartner
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by Tobias Weingartner.
40 * 4. The name of the author may not be used to endorse or promote products
41 * derived from this software without specific prior written permission.
42 *
43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
44 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
45 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
46 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
47 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
48 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
52 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 */
54
55 #include <err.h>
56 #include <stdio.h>
57 #include <ctype.h>
58 #include <stdlib.h>
59 #include <string.h>
60 #include "misc.h"
61
62
63 int
64 ask_cmd(cmd_t *cmd)
65 {
66 char lbuf[100], *cp, *buf;
67
68 /* Get input */
69 if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
70 errx(1, "eof");
71 lbuf[strlen(lbuf)-1] = '\0';
72
73 /* Parse input */
74 buf = lbuf;
75 buf = &buf[strspn(buf, " \t")];
76 cp = &buf[strcspn(buf, " \t")];
77 *cp++ = '\0';
78 strncpy(cmd->cmd, buf, 10);
79 buf = &cp[strspn(cp, " \t")];
80 strncpy(cmd->args, buf, 100);
81
82 return (0);
83 }
84
85 int
86 ask_num(const char *str, int flags, unsigned int dflt, unsigned int low, unsigned int high, void (*help) __P((void)))
87 {
88 char lbuf[100], *cp;
89 unsigned int num;
90
91 do {
92 again:
93 num = dflt;
94 if (flags == ASK_HEX)
95 printf("%s [%X - %X]: [%X] ", str, low, high, num);
96 else
97 printf("%s [%u - %u]: [%u] ", str, low, high, num);
98 if (help)
99 printf("(? for help) ");
100
101 if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
102 errx(1, "eof");
103 lbuf[strlen(lbuf)-1] = '\0';
104
105 if (help && lbuf[0] == '?') {
106 (*help)();
107 goto again;
108 }
109
110 /* Convert */
111 cp = lbuf;
112 num = strtoul(lbuf, &cp, ((flags==ASK_HEX)?16:10));
113
114 /* Make sure only number present */
115 if (cp == lbuf)
116 num = dflt;
117 if (*cp != '\0') {
118 printf("'%s' is not a valid number.\n", lbuf);
119 num = low - 1;
120 } else if (num < low || num > high) {
121 printf("'%u' is out of range.\n", num);
122 }
123 } while (num < low || num > high);
124
125 return (num);
126 }
127
128 int
129 ask_yn(const char *str, int default_answer)
130 {
131 int ch, first;
132
133 printf("%s [%c] ", str, default_answer ? 'y' : 'n');
134 fflush(stdout);
135
136 first = ch = getchar();
137 while (ch != '\n' && ch != EOF)
138 ch = getchar();
139
140 if (ch == EOF || first == EOF)
141 errx(1, "eof");
142
143 if (first == '\n')
144 return default_answer;
145
146 return (first == 'y' || first == 'Y');
147 }
148
149 u_int16_t
150 getshort(void *p)
151 {
152 unsigned char *cp = p;
153
154 return (cp[0] | (cp[1] << 8));
155 }
156
157 void
158 putshort(void *p, u_int16_t l)
159 {
160 unsigned char *cp = p;
161
162 *cp++ = l;
163 *cp++ = l >> 8;
164 }
165
166 u_int32_t
167 getlong(void *p)
168 {
169 unsigned char *cp = p;
170
171 return (cp[0] | (cp[1] << 8) | (cp[2] << 16) | (cp[3] << 24));
172 }
173
174 void
175 putlong(void *p, u_int32_t l)
176 {
177 unsigned char *cp = p;
178
179 *cp++ = l;
180 *cp++ = l >> 8;
181 *cp++ = l >> 16;
182 *cp++ = l >> 24;
183 }