Teach the argument plumbing how to do -@ for mkfs.vfat

This commit is contained in:
Rob Landley 2018-12-26 12:07:14 -06:00
parent 5a670c5883
commit 831266c068
2 changed files with 31 additions and 8 deletions

View File

@ -84,6 +84,9 @@
// + Synonyms (switch on all) [+abc] means -ab=-abc, -c=-abc // + Synonyms (switch on all) [+abc] means -ab=-abc, -c=-abc
// ! More than one in group is error [!abc] means -ab calls error_exit() // ! More than one in group is error [!abc] means -ab calls error_exit()
// primarily useful if you can switch things back off again. // primarily useful if you can switch things back off again.
//
// You may use octal escapes with the high bit (127) set to use a control
// character as an option flag. For example, \300 would be the option -@
// Notes from getopt man page // Notes from getopt man page
// - and -- cannot be arguments. // - and -- cannot be arguments.
@ -128,7 +131,7 @@ struct getoptflagstate
unsigned excludes, requires; unsigned excludes, requires;
}; };
// Use getoptflagstate to parse parse one command line option from argv // Use getoptflagstate to parse one command line option from argv
static int gotflag(struct getoptflagstate *gof, struct opts *opt) static int gotflag(struct getoptflagstate *gof, struct opts *opt)
{ {
int type; int type;
@ -317,7 +320,7 @@ void parse_optflaglist(struct getoptflagstate *gof)
continue; continue;
// Claim this option, loop to see what's after it. // Claim this option, loop to see what's after it.
} else new->c = *options; } else new->c = 127&*options;
options++; options++;
} }

View File

@ -137,6 +137,21 @@ struct flag *digest(char *string)
return list; return list;
} }
// Parse C-style octal escape
void octane(char *from)
{
unsigned char *to = (void *)from;
while (*from) {
if (*from == '\\') {
*to = 0;
while (isdigit(*++from)) *to = (8**to)+*from-'0';
to++;
} else *to++ = *from++;
}
*to = 0;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char command[256], flags[1023], allflags[1024]; char command[256], flags[1023], allflags[1024];
@ -158,6 +173,8 @@ int main(int argc, char *argv[])
*command = *flags = *allflags = 0; *command = *flags = *allflags = 0;
bit = fscanf(stdin, "%255s \"%1023[^\"]\" \"%1023[^\"]\"\n", bit = fscanf(stdin, "%255s \"%1023[^\"]\" \"%1023[^\"]\"\n",
command, flags, allflags); command, flags, allflags);
octane(flags);
octane(allflags);
if (getenv("DEBUG")) if (getenv("DEBUG"))
fprintf(stderr, "command=%s, flags=%s, allflags=%s\n", fprintf(stderr, "command=%s, flags=%s, allflags=%s\n",
@ -186,12 +203,14 @@ int main(int argc, char *argv[])
command, command, command); command, command, command);
while (offlist) { while (offlist) {
struct flag *f = offlist->lopt; char *s = (char []){0, 0, 0, 0};
while (f) {
printf("#undef FLAG_%s\n", f->command); if (!offlist->command) s = offlist->lopt->command;
f = f->next; else {
*s = *offlist->command;
if (127 < (unsigned char)*s) sprintf(s, "X%02X", 127&*s);
} }
if (offlist->command) printf("#undef FLAG_%c\n", *offlist->command); printf("#undef FLAG_%s\n", s);
offlist = offlist->next; offlist = offlist->next;
} }
printf("#endif\n\n"); printf("#endif\n\n");
@ -201,7 +220,7 @@ int main(int argc, char *argv[])
out += strlen(out); out += strlen(out);
while (aflist) { while (aflist) {
char *llstr = bit>31 ? "LL" : "", *s = (char []){0, 0}; char *llstr = bit>31 ? "LL" : "", *s = (char []){0, 0, 0, 0};
int enabled = 0; int enabled = 0;
// Output flag macro for bare longopts // Output flag macro for bare longopts
@ -212,6 +231,7 @@ int main(int argc, char *argv[])
// Output normal flag macro // Output normal flag macro
} else { } else {
*s = *aflist->command; *s = *aflist->command;
if (127 < (unsigned char)*s) sprintf(s, "X%02X", 127&*s);
if (flist && flist->command && *aflist->command == *flist->command) if (flist && flist->command && *aflist->command == *flist->command)
enabled++; enabled++;
} }