getflags.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. quotefmtinstall();
  40. argv0 = argv[0]; /* for sysfatal */
  41. flags = getenv("flagfmt");
  42. if(flags == nil){
  43. fprint(2, "$flagfmt not set\n");
  44. print("exit 'missing flagfmt'");
  45. exits(0);
  46. }
  47. fmtfdinit(&fmt, 1, buf, sizeof buf);
  48. for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
  49. fmtprint(&fmt, "flag%.1s=()\n", p);
  50. ARGBEGIN{
  51. default:
  52. if((p = findarg(flags, ARGC())) == nil)
  53. usage();
  54. p += runelen(ARGC());
  55. if(*p == ',' || *p == 0){
  56. fmtprint(&fmt, "flag%C=1\n", ARGC());
  57. break;
  58. }
  59. n = countargs(p);
  60. fmtprint(&fmt, "flag%C=(", ARGC());
  61. for(i=0; i<n; i++)
  62. fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
  63. fmtprint(&fmt, ")\n");
  64. }ARGEND
  65. fmtprint(&fmt, "*=(");
  66. for(i=0; i<argc; i++)
  67. fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
  68. fmtprint(&fmt, ")\n");
  69. fmtprint(&fmt, "status=''\n");
  70. fmtfdflush(&fmt);
  71. exits(0);
  72. }