Fri, 10 Jan 2014 21:58:42 +0200
- major refactoring begins
72
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
1 | #include <cstdio> |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
2 | #include "main.h" |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
3 | #include "format.h" |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
4 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
5 | static void draw_pos (const string& fmt, int pos) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
6 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
7 | string rep (fmt); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
8 | rep.replace ("\n", "↵"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
9 | rep.replace ("\t", "⇥"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
10 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
11 | fprintf (stderr, "%s\n", rep.chars()); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
12 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
13 | for (int x = 0; x < pos; ++x) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
14 | fprintf (stderr, "-"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
15 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
16 | fprintf (stderr, "^\n"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
17 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
18 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
19 | string format_args (const list<format_arg>& args) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
20 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
21 | const string& fmtstr = args[0].as_string(); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
22 | assert (args.size() >= 1); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
23 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
24 | if (args.size() == 1) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
25 | return args[0].as_string(); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
26 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
27 | string fmt = fmtstr; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
28 | string out; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
29 | int pos = 0; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
30 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
31 | while ((pos = fmt.first ("%", pos)) != -1) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
32 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
33 | if (fmt[pos + 1] == '%') |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
34 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
35 | fmt.replace (pos, 2, "%"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
36 | pos++; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
37 | continue; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
38 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
39 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
40 | int ofs = 1; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
41 | char mod = '\0'; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
42 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
43 | // handle modifiers |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
44 | if (fmt[ pos + ofs ] == 's' || fmt[ pos + ofs ] == 'x') |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
45 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
46 | mod = fmt[ pos + ofs ]; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
47 | ofs++; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
48 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
49 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
50 | if (!isdigit (fmt[ pos + ofs ])) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
51 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
52 | fprintf (stderr, "bad format string, expected digit with optional " |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
53 | "modifier after '%%':\n"); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
54 | draw_pos (fmt, pos); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
55 | return fmt; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
56 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
57 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
58 | int i = fmt[ pos + ofs ] - '0'; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
59 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
60 | if (i >= args.size()) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
61 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
62 | fprintf (stderr, "format arg #%d used but not defined: %s\n", i, fmtstr.chars()); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
63 | return fmt; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
64 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
65 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
66 | string repl = args[i].as_string(); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
67 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
68 | if (mod == 's') |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
69 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
70 | repl = (repl == "1") ? "" : "s"; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
71 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
72 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
73 | elif (mod == 'd') |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
74 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
75 | repl.sprintf ("%d", repl[0]); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
76 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
77 | elif (mod == 'x') |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
78 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
79 | // modifier x: reinterpret the argument as hex |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
80 | repl.sprintf ("0x%X", strtol (repl.chars(), null, 10)); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
81 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
82 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
83 | fmt.replace (pos, 1 + ofs, repl); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
84 | pos += repl.length(); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
85 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
86 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
87 | return fmt; |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
88 | } |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
89 | |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
90 | void print_args (FILE* fp, const list<format_arg>& args) |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
91 | { |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
92 | string out = format_args (args); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
93 | fprintf (fp, "%s", out.chars()); |
03e4d9db3fd9
- major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
94 | } |