getflags.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <u.h>
  2. #include <libc.h>
  3. void
  4. usage(void)
  5. {
  6. print("status=usage\n");
  7. exits(0);
  8. }
  9. char*
  10. findarg(char *flags, Rune r)
  11. {
  12. char *p;
  13. Rune rr;
  14. for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
  15. chartorune(&rr, p);
  16. if(rr == r)
  17. return p;
  18. }
  19. return nil;
  20. }
  21. int
  22. countargs(char *p)
  23. {
  24. int n;
  25. n = 1;
  26. while(*p == ' ')
  27. p++;
  28. for(; *p && *p != ','; p++)
  29. if(*p == ' ' && *(p-1) != ' ')
  30. n++;
  31. return n;
  32. }
  33. void
  34. main(int argc, char *argv[])
  35. {
  36. char *flags, *p, buf[512];
  37. int i, n;
  38. Fmt fmt;
  39. doquote = needsrcquote;
  40. quotefmtinstall();
  41. argv0 = argv[0]; /* for sysfatal */
  42. flags = getenv("flagfmt");
  43. if(flags == nil){
  44. fprint(2, "$flagfmt not set\n");
  45. print("exit 'missing flagfmt'");
  46. exits(0);
  47. }
  48. fmtfdinit(&fmt, 1, buf, sizeof buf);
  49. for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
  50. fmtprint(&fmt, "flag%.1s=()\n", p);
  51. ARGBEGIN{
  52. default:
  53. if((p = findarg(flags, ARGC())) == nil)
  54. usage();
  55. p += runelen(ARGC());
  56. if(*p == ',' || *p == 0){
  57. fmtprint(&fmt, "flag%C=1\n", ARGC());
  58. break;
  59. }
  60. n = countargs(p);
  61. fmtprint(&fmt, "flag%C=(", ARGC());
  62. for(i=0; i<n; i++)
  63. fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
  64. fmtprint(&fmt, ")\n");
  65. }ARGEND
  66. fmtprint(&fmt, "*=(");
  67. for(i=0; i<argc; i++)
  68. fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
  69. fmtprint(&fmt, ")\n");
  70. fmtprint(&fmt, "status=''\n");
  71. fmtfdflush(&fmt);
  72. exits(0);
  73. }