annotate toys/other/factor.c @ 1718:3ac823675413 draft

Fix several printf_format warnings.
author Rob Landley <rob@landley.net>
date Sun, 01 Mar 2015 16:43:01 -0600
parents 89384d54d49a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* factor.c - Factor integers
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2014 Rob Landley <rob@landley.net>
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * No standard, but it's in coreutils
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 USE_FACTOR(NEWTOY(factor, 0, TOYFLAG_USR|TOYFLAG_BIN))
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config FACTOR
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "factor"
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 default y
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: factor NUMBER...
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Factor integers.
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 */
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
17
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 #include "toys.h"
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
19
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 static void factor(char *s)
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 {
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 long l, ll;
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
23
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
24 for (;;) {
1718
3ac823675413 Fix several printf_format warnings.
Rob Landley <rob@landley.net>
parents: 1626
diff changeset
25 char *err = s;
3ac823675413 Fix several printf_format warnings.
Rob Landley <rob@landley.net>
parents: 1626
diff changeset
26
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
27 while(isspace(*s)) s++;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
28 if (!*s) return;
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
29
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
30 l = strtol(s, &s, 0);
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
31 if (*s && !isspace(*s)) {
1718
3ac823675413 Fix several printf_format warnings.
Rob Landley <rob@landley.net>
parents: 1626
diff changeset
32 error_msg("%s: not integer", err);
3ac823675413 Fix several printf_format warnings.
Rob Landley <rob@landley.net>
parents: 1626
diff changeset
33
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
34 return;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
35 }
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
36
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
37 printf("%ld:", l);
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
38
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
39 // Negative numbers have -1 as a factor
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
40 if (l < 0) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
41 printf(" -1");
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
42 l *= -1;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
43 }
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
44
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
45 // Nothing below 4 has factors
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
46 if (l < 4) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
47 printf(" %ld\n", l);
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
48 continue;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
49 }
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
50
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
51 // Special case factors of 2
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
52 while (l && !(l&1)) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
53 printf(" 2");
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
54 l >>= 1;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
55 }
1411
dd336488a69b factor: catch integer overflow.
Rob Landley <rob@landley.net>
parents: 1410
diff changeset
56
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
57 // test odd numbers.
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
58 for (ll=3; ;ll += 2) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
59 long lll = ll*ll;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
60
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
61 if (lll>l || lll<ll) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
62 if (l>1) printf(" %ld", l);
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
63 break;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
64 }
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
65 while (!(l%ll)) {
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
66 printf(" %ld", ll);
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
67 l /= ll;
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
68 }
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 }
1626
89384d54d49a Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
Rob Landley <rob@landley.net>
parents: 1411
diff changeset
70 xputc('\n');
1410
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 }
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 }
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
73
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 void factor_main(void)
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 {
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 if (toys.optc) {
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 char **ss;
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
78
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 for (ss = toys.optargs; *ss; ss++) factor(*ss);
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 } else for (;;) {
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 char *s = 0;
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 size_t len = 0;
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 if (-1 == getline(&s, &len, stdin)) break;
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 factor(s);
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 }
ee0109c35b34 Add factor.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 }