1 /* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
2 * Understanding is not required. Only obedience.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, version 3 of the License ONLY.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 * option.c - command line option processing
26 char **cfgargs
= NULL
;
29 #define PUSH_BACK(_c) (*ress)[dpos++] = (_c)
30 #define DECODE_TUPLE(tuple,bytes) \
31 for (tmp = bytes; tmp > 0; tmp--, tuple = (tuple&0x00ffffff)<<8) \
32 PUSH_BACK((char)((tuple>>24)&0xff))
34 // returns ress length
35 static int ascii85Decode (char **ress
, const char *srcs
/*, int start, int length*/) {
36 static uint32_t pow85
[5] = { 85*85*85*85UL, 85*85*85UL, 85*85UL, 85UL, 1UL };
37 const uint8_t *data
= (const uint8_t *)srcs
;
38 int len
= strlen(srcs
);
42 int start
= 0, length
= len
;
45 if (start
< 0) start
= 0; else { len
-= start
; data
+= start
; }
46 if (length
< 0 || len
< length
) length
= len
;
49 int xlen = 4*((length+4)/5);
50 kstringReserve(ress, xlen);
54 *ress
= (char *)calloc(1, len
+1);
55 for (int f
= length
; f
> 0; --f
, ++data
) {
57 if (c
<= ' ') continue; // skip blanks
59 case 'z': // zero tuple
61 //fprintf(stderr, "%s: z inside ascii85 5-tuple\n", file);
71 case '~': // '~>': end of sequence
72 if (f
< 1 || data
[1] != '>') { free(*ress
); return -2; } // error
73 if (count
> 0) { f
= -1; break; }
75 if (c
< '!' || c
> 'u') {
76 //fprintf(stderr, "%s: bad character in ascii85 region: %#o\n", file, c);
80 tuple
+= ((uint8_t)(c
-'!'))*pow85
[count
++];
82 DECODE_TUPLE(tuple
, 4);
89 // write last (possibly incomplete) tuple
91 tuple
+= pow85
[count
];
92 DECODE_TUPLE(tuple
, count
);
101 static void decodeBA (char *str
, int len
) {
104 for (int f
= 0; f
< len
; ++f
, ++str
) {
114 static void printEC (const char *txt
) {
118 if ((len
= ascii85Decode(&dest
, txt
)) >= 0) {
120 fprintf(stderr
, "%s\n", dest
);
126 static int isStr85Equ (const char *txt
, const char *str
) {
130 if ((len
= ascii85Decode(&dest
, txt
)) >= 0) {
131 res
= (strcmp(dest
, str
) == 0);
138 static int checkEGG (const char *str
) {
139 if (isStr85Equ("06:]JASq", str
) || isStr85Equ("0/i", str
)) {
141 "H8lZV&6)1>+AZ>m)Cf8;A1/cP+CnS)0OJ`X.QVcHA4^cc5r3=m1c%0D3&c263d?EV6@4&>"
142 "3DYQo;c-FcO+UJ;MOJ$TAYO@/FI]+B?C.L$>%:oPAmh:4Au)>AAU/H;ZakL2I!*!%J;(AK"
143 "NIR#5TXgZ6c'F1%^kml.JW5W8e;ql0V3fQUNfKpng6ppMf&ip-VOX@=jKl;#q\"DJ-_>jG"
144 "8#L;nm]!q;7c+hR6p;tVY#J8P$aTTK%c-OT?)<00,+q*8f&ff9a/+sbU,:`<H*[fk0o]7k"
145 "^l6nRkngc6Tl2Ngs!!P2I%KHG=7n*an'bsgn>!*8s7TLTC+^\\\"W+<=9^%Ol$1A1eR*Be"
146 "gqjEag:M0OnrC4FBY5@QZ&'HYYZ#EHs8t4$5]!22QoJ3`;-&=\\DteO$d6FBqT0E@:iu?N"
147 "a5ePUf^_uEEcjTDKfMpX/9]DFL8N-Ee;*8C5'WgbGortZuh1\\N0;/rJB6'(MSmYiS\"6+"
148 "<NK)KDV3e+Ad[@).W:%.dd'0h=!QUhghQaNNotIZGrpHr-YfEuUpsKW<^@qlZcdTDA!=?W"
149 "Yd+-^`'G8Or)<0-T&CT.i+:mJp(+/M/nLaVb#5$p2jR2<rl7\"XlngcN`mf,[4oK5JLr\\"
150 "m=X'(ue;'*1ik&/@T4*=j5t=<&/e/Q+2=((h`>>uN(#>&#i>2/ajK+=eib1coVe3'D)*75"
151 "m_h;28^M6p6*D854Jj<C^,Q8Wd\"O<)&L/=C$lUAQNN<=eTD:A6kn-=EItXSss.tAS&!;F"
152 "EsgpJTHIYNNnh'`kmX^[`*ELOHGcWbfPOT`J]A8P`=)AS;rYlR$\"-.RG440lK5:Dg?G'2"
153 "['dE=nEm1:k,,Se_=%-6Z*L^J[)EC"
157 if (isStr85Equ("04Jj?B)", str
)) {
159 "IPaSa(`c:T,o9Bq3\\)IY++?+!-S9%P0/OkjE&f$l.OmK'Ai2;ZHn[<,6od7^8;)po:HaP"
160 "m<'+&DRS:/1L7)IA7?WI$8WKTUB2tXg>Zb$.?\"@AIAu;)6B;2_PB5M?oBPDC.F)606Z$V"
161 "=ONd6/5P*LoWKTLQ,d@&;+Ru,\\ESY*rg!l1XrhpJ:\"WKWdOg?l;=RHE:uU9C?aotBqj]"
162 "=k8cZ`rp\"ZO=GjkfD#o]Z\\=6^]+Gf&-UFthT*hN"
166 if (isStr85Equ("04o69A7Tr", str
)) {
168 "Ag7d[&R#Ma9GVV5,S(D;De<T_+W).?,%4n+3cK=%4+0VN@6d\")E].np7l?8gF#cWF7SS_m"
169 "4@V\\nQ;h!WPD2h#@\\RY&G\\LKL=eTP<V-]U)BN^b.DffHkTPnFcCN4B;]8FCqI!p1@H*_"
170 "jHJ<%g']RG*MLqCrbP*XbNL=4D1R[;I(c*<FuesbWmSCF1jTW+rplg;9[S[7eDVl6YsjT"
178 int getoptions (int argc
, char **argv
, const char *opts
, option
*optv
, char** targets
) {
185 for (i
= 0; i
< argc
; ++i
) {
186 if (argv
[i
][0] == '-' && argv
[i
][1] == '-' && argv
[i
][2]) {
191 cfgargs
= calloc(num_cfgargs
+1, sizeof(char *));
193 memset((char *)optv
, '\0', sizeof(*optv
)*N_OPTS
);
195 for (i
= 0; i
< argc
; ++i
) {
196 if (checkEGG(argv
[i
])) exit(1);
197 if (argv
[i
][0] == '-' && argv
[i
][1] == '-' && argv
[i
][2]) {
199 cfgargs
[num_cfgargs
++] = strdup(argv
[i
]);
202 if (argv
[i
][0] == '-') {
203 if (!optc
--) { printf("too many options (%d max)\n", N_OPTS
); return -1; }
204 for (arg
= &argv
[i
][1]; *arg
; ++arg
) {
205 for (f
= opts
; *f
; ++f
) if (*f
== *arg
) break;
206 if (!*f
) { printf("invalid option: -%c\n", *arg
); return -1; }
208 if (f
[1] != ':') { optv
++->val
= "true"; }
209 else if (arg
[1]) { optv
++->val
= &arg
[1]; break; }
210 else if (++i
< argc
) { optv
++->val
= argv
[i
]; break; }
211 else { printf("option: -%c needs argument\n", *f
); return -1; }
213 } else if (argv
[i
][0] != '=' && strchr(argv
[i
], '=')) {
214 /* something like VARNAME=.... is treated as an implicit '-s' flag */
215 if (!optc
--) { printf("too many options (%d max)\n", N_OPTS
); return -1; }
217 optv
++->val
= argv
[i
];
220 if (n
>= N_TARGETS
) { printf("too many targets (%d max)\n", N_TARGETS
); return -1; }
221 targets
[n
++] = argv
[i
];
229 * Name: getoptval() - find an option given its character
231 JAMFA_PURE
const char *getoptval (option
*optv
, char opt
, int subopt
) {
232 for (int i
= 0; i
< N_OPTS
; ++i
, ++optv
) if (optv
->flag
== opt
&& !subopt
--) return optv
->val
;