]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - quiz/quiz.c
2 * Copyright (c) 1991 The Regents of the University of California.
5 * This code is derived from software contributed to Berkeley by
6 * Jim R. Oldroyd at The Instruction Set.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 "@(#) Copyright (c) 1991 The Regents of the University of California.\n\
40 All rights reserved.\n";
44 /*static char sccsid[] = "from: @(#)quiz.c 5.1 (Berkeley) 11/10/91";*/
45 static char rcsid
[] = "$Id: quiz.c,v 1.5 1994/01/04 05:23:56 cgd Exp $";
48 #include <sys/types.h>
56 #include "pathnames.h"
59 static int catone
, cattwo
, tflag
;
62 char *appdstr
__P((char *, char *));
63 void downcase
__P((char *));
64 void err
__P((const char *, ...));
65 void get_cats
__P((char *, char *));
66 void get_file
__P((char *));
67 char *next_cat
__P((char *));
68 void quiz
__P((void));
69 void score
__P((u_int
, u_int
, u_int
));
70 void show_index
__P((void));
71 void usage
__P((void));
81 indexfile
= _PATH_QUIZIDX
;
82 while ((ch
= getopt(argc
, argv
, "i:t")) != EOF
)
104 get_cats(argv
[0], argv
[1]);
122 if ((fp
= fopen(file
, "r")) == NULL
)
123 err("%s: %s", file
, strerror(errno
));
127 * Should really free up space from any earlier read list
128 * but there are no reverse pointers to do so with.
132 while ((lp
= fgetln(fp
, &len
)) != NULL
) {
133 if (qp
->q_text
&& qp
->q_text
[strlen(qp
->q_text
) - 1] == '\\')
134 qp
->q_text
= appdstr(qp
->q_text
, lp
);
136 if ((qp
->q_next
= malloc(sizeof(QE
))) == NULL
)
137 err("%s", strerror(errno
));
140 if ((qp
->q_text
= strdup(lp
)) == NULL
)
141 err("%s", strerror(errno
));
142 qp
->q_asked
= qp
->q_answered
= FALSE
;
154 register char *p
, *s
;
157 if ((pf
= popen(_PATH_PAGER
, "w")) == NULL
)
158 err("%s: %s", _PATH_PAGER
, strerror(errno
));
159 (void)fprintf(pf
, "Subjects:\n\n");
160 for (qp
= qlist
.q_next
; qp
; qp
= qp
->q_next
) {
161 for (s
= next_cat(qp
->q_text
); s
; s
= next_cat(s
)) {
164 if (p
= rxp_expand())
165 (void)fprintf(pf
, "%s ", p
);
167 (void)fprintf(pf
, "\n");
169 (void)fprintf(pf
, "\n%s\n%s\n%s\n",
170 "For example, \"quiz victim killer\" prints a victim's name and you reply",
171 "with the killer, and \"quiz killer victim\" works the other way around.",
172 "Type an empty line to get the correct answer.");
186 for (qp
= qlist
.q_next
; qp
; qp
= qp
->q_next
) {
187 s
= next_cat(qp
->q_text
);
188 catone
= cattwo
= i
= 0;
199 if (catone
&& cattwo
&& catone
!= cattwo
) {
200 if (!rxp_compile(qp
->q_text
))
202 get_file(rxp_expand());
206 err("invalid categories");
214 u_int guesses
, rights
, wrongs
;
216 char *s
, *t
, question
[LINE_SZ
];
220 guesses
= rights
= wrongs
= 0;
224 next
= random() % qsize
;
226 for (i
= 0; i
< next
; i
++)
228 while (qp
&& qp
->q_answered
)
234 if (tflag
&& random() % 100 > 20) {
235 /* repeat questions in tutorial mode */
236 while (qp
&& (!qp
->q_asked
|| qp
->q_answered
))
242 for (i
= 0; i
< catone
- 1; i
++)
247 if (!t
|| *t
== '\0') {
248 qp
->q_answered
= TRUE
;
251 (void)strcpy(question
, t
);
253 for (i
= 0; i
< cattwo
- 1; i
++)
258 if (!t
|| *t
== '\0') {
259 qp
->q_answered
= TRUE
;
263 (void)printf("%s?\n", question
);
265 if ((answer
= fgetln(stdin
, &len
)) == NULL
) {
266 score(rights
, wrongs
, guesses
);
269 answer
[len
- 1] = '\0';
271 if (rxp_match(answer
)) {
272 (void)printf("Right!\n");
274 qp
->q_answered
= TRUE
;
277 if (*answer
== '\0') {
278 (void)printf("%s\n", t
);
281 qp
->q_answered
= TRUE
;
284 (void)printf("What?\n");
287 score(rights
, wrongs
, guesses
);
311 register char *mp
, *sp
;
315 if ((m
= malloc(strlen(s
) + strlen(tp
) + 1)) == NULL
)
316 err("%s", strerror(errno
));
317 for (mp
= m
, sp
= s
; *mp
++ = *sp
++;);
319 if (*(mp
- 1) == '\\')
321 while ((ch
= *mp
++ = *tp
++) && ch
!= '\n');
332 (void)printf("Rights %d, wrongs %d,", r
, w
);
334 (void)printf(" extra guesses %d,", g
);
335 (void)printf(" score %d%%\n", (r
+ w
+ g
) ? r
* 100 / (r
+ w
+ g
) : 0);
345 if (isascii(ch
) && isupper(ch
))
352 (void)fprintf(stderr
, "quiz [-t] [-i file] category1 category2\n");
364 err(const char *fmt
, ...)
377 (void)fprintf(stderr
, "quiz: ");
378 (void)vfprintf(stderr
, fmt
, ap
);
380 (void)fprintf(stderr
, "\n");