new
This commit is contained in:
parent
acd4770618
commit
61b8c11b66
1 changed files with 199 additions and 0 deletions
|
|
@ -0,0 +1,199 @@
|
|||
/*% cyntax % && cc -go # %
|
||||
* getflags: process flags for command files
|
||||
* Usage: ifs='' eval `{getflags [-s] flagfmt [arg ...]} # rc
|
||||
* Usage: IFS= eval `getflags -b [-s] flagfmt [arg...]` # Bourne shell
|
||||
* -b means give Bourne-shell compatible output
|
||||
*/
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include "getflags.h"
|
||||
|
||||
/* predefine functions */
|
||||
void bourneprint(int, char *[]);
|
||||
void bournearg(char *);
|
||||
void rcprint(int, char *[]);
|
||||
void usmsg(char *);
|
||||
int count(int, char *);
|
||||
void rcarg(char *);
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int bourne;
|
||||
argc=getflags(argc, argv, "b");
|
||||
if(argc<2) usage("flagfmt [arg ...]");
|
||||
bourne=flag['b']!=0;
|
||||
flag['b']=0;
|
||||
if((argc=getflags(argc-1, argv+1, argv[1]))<0){
|
||||
usmsg(argv[1]);
|
||||
exits(0);
|
||||
}
|
||||
if(bourne) bourneprint(argc, argv);
|
||||
else rcprint(argc, argv);
|
||||
exits(0);
|
||||
}
|
||||
void
|
||||
bourneprint(int argc, char *argv[])
|
||||
{
|
||||
register int c, i, n;
|
||||
for(c=0;c!=NFLAG;c++) if(flag[c]){
|
||||
print("FLAG%c=", c); /* bug -- c could be a bad char */
|
||||
n=count(c, argv[1]);
|
||||
if(n==0)
|
||||
print("1\n");
|
||||
else{
|
||||
print("'");
|
||||
bournearg(flag[c][0]);
|
||||
for(i=1;i!=n;i++){
|
||||
print(" ");
|
||||
bournearg(flag[c][i]);
|
||||
}
|
||||
print("'\n");
|
||||
}
|
||||
}
|
||||
print("set --");
|
||||
for(c=1;c!=argc;c++){
|
||||
print(" ");
|
||||
bournearg(argv[c+1]);
|
||||
}
|
||||
print("\n");
|
||||
}
|
||||
void
|
||||
bournearg(char *s)
|
||||
{
|
||||
for(;*s;s++)
|
||||
if(*s=='\'')
|
||||
print("'\\''");
|
||||
else
|
||||
print("%c", *s);
|
||||
}
|
||||
void
|
||||
rcprint(int argc, char *argv[])
|
||||
{
|
||||
register c, i, n;
|
||||
for(c=0;c!=NFLAG;c++) if(flag[c]){
|
||||
print("FLAG%c=", c); /* bug -- c could be a bad char */
|
||||
n=count(c, argv[1]);
|
||||
if(n==0)
|
||||
print("''");
|
||||
else if(n==1)
|
||||
rcarg(flag[c][0]);
|
||||
else{
|
||||
print("(");
|
||||
rcarg(flag[c][0]);
|
||||
for(i=1;i!=n;i++){
|
||||
print(" ");
|
||||
rcarg(flag[c][i]);
|
||||
}
|
||||
print(")");
|
||||
}
|
||||
print("\n");
|
||||
}
|
||||
print("*=");
|
||||
if(argc==1) print("()");
|
||||
else if(argc==2) rcarg(argv[2]);
|
||||
else{
|
||||
print("(");
|
||||
rcarg(argv[2]);
|
||||
for(c=2;c!=argc;c++){
|
||||
print(" ");
|
||||
rcarg(argv[c+1]);
|
||||
}
|
||||
print(")");
|
||||
}
|
||||
print("\n");
|
||||
}
|
||||
void
|
||||
usmsg(char *flagarg)
|
||||
{
|
||||
register char *s, *t, c;
|
||||
register count, nflag=0;
|
||||
print("echo Usage: $0'");
|
||||
for(s=flagarg;*s;){
|
||||
c=*s;
|
||||
if(*s++==' ') continue;
|
||||
if(*s==':')
|
||||
count = strtol(++s, &s, 10);
|
||||
else count=0;
|
||||
if(count==0){
|
||||
if(nflag==0) print(" [-");
|
||||
nflag++;
|
||||
print("%c", c);
|
||||
}
|
||||
if(*s=='['){
|
||||
int depth=1;
|
||||
s++;
|
||||
for(;*s!='\0' && depth>0; s++)
|
||||
if (*s==']') depth--;
|
||||
else if (*s=='[') depth++;
|
||||
}
|
||||
}
|
||||
if(nflag) print("]");
|
||||
for(s=flagarg;*s;){
|
||||
c=*s;
|
||||
if(*s++==' ') continue;
|
||||
if(*s==':')
|
||||
count = strtol(++s, &s, 10);
|
||||
else count=0;
|
||||
if(count!=0){
|
||||
print(" [-");
|
||||
print("%c", c);
|
||||
if(*s=='['){
|
||||
int depth=1;
|
||||
s++;
|
||||
t=s;
|
||||
for(;*s!='\0' && depth>0; s++)
|
||||
if (*s==']') depth--;
|
||||
else if (*s=='[') depth++;
|
||||
print(" ");
|
||||
write(1, t, s - t);
|
||||
}
|
||||
else
|
||||
while(count--) print(" arg");
|
||||
print("]");
|
||||
}
|
||||
else if(*s=='['){
|
||||
int depth=1;
|
||||
s++;
|
||||
for(;*s!='\0' && depth>0; s++)
|
||||
if (*s==']') depth--;
|
||||
else if (*s=='[') depth++;
|
||||
}
|
||||
}
|
||||
print("' $usage;\n");
|
||||
print("exit 'usage'\n");
|
||||
}
|
||||
int
|
||||
count(int flag, char *flagarg)
|
||||
{
|
||||
register char *s, c;
|
||||
register n;
|
||||
for(s=flagarg;*s;){
|
||||
c=*s;
|
||||
if(*s++==' ') continue;
|
||||
if(*s==':')
|
||||
n = strtol(++s, &s, 10);
|
||||
else n=0;
|
||||
if(*s=='['){
|
||||
int depth=1;
|
||||
s++;
|
||||
for(;*s!='\0' && depth>0; s++)
|
||||
if (*s==']') depth--;
|
||||
else if (*s=='[') depth++;
|
||||
}
|
||||
if(c==flag) return n;
|
||||
}
|
||||
return -1; /* never happens */
|
||||
}
|
||||
void
|
||||
rcarg(char *s)
|
||||
{
|
||||
if(*s=='\0' || strpbrk(s, "\n \t#;&|^$=`'{}()<>?")){
|
||||
print("\'");
|
||||
for(;*s;s++)
|
||||
if(*s=='\'') print("''");
|
||||
else print("%c", *s);
|
||||
print("\'");
|
||||
}
|
||||
else print("%s", s);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue