grab.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*====================================================================*
  2. *
  3. * grab.c - byte stream grabber
  4. *
  5. *. Motley Tools by Charles Maier;
  6. *: Copyright (c) 2001-2006 by Charles Maier Associates Limited;
  7. *; Licensed under the Internet Software Consortium License;
  8. *
  9. *--------------------------------------------------------------------*/
  10. #define _GETOPT_H
  11. /*====================================================================*
  12. * system header files;
  13. *--------------------------------------------------------------------*/
  14. #include <stdio.h>
  15. /*====================================================================*
  16. * custom header files;
  17. *--------------------------------------------------------------------*/
  18. #include "../tools/getoptv.h"
  19. #include "../tools/putoptv.h"
  20. #include "../tools/version.h"
  21. #include "../tools/number.h"
  22. #include "../tools/error.h"
  23. #include "../tools/flags.h"
  24. #include "../tools/files.h"
  25. /*====================================================================*
  26. * custom source files;
  27. *--------------------------------------------------------------------*/
  28. #ifndef MAKEFILE
  29. #include "../tools/getoptv.c"
  30. #include "../tools/putoptv.c"
  31. #include "../tools/version.c"
  32. #include "../tools/basespec.c"
  33. #include "../tools/todigit.c"
  34. #include "../tools/error.c"
  35. #include "../tools/efreopen.c"
  36. #endif
  37. /*====================================================================*
  38. * constants;
  39. *--------------------------------------------------------------------*/
  40. #define GRAB_VERBOSE (1 << 0)
  41. #define GRAB_SILENCE (1 << 1)
  42. #define GRAB_NEWLINE (1 << 2)
  43. /*====================================================================*
  44. *
  45. * void function (size_t offset, size_t length, flag_t flags);
  46. *
  47. *
  48. *. Motley Tools by Charles Maier;
  49. *: Copyright (c) 2001-2006 by Charles Maier Associates Limited;
  50. *; Licensed under the Internet Software Consortium License;
  51. *
  52. *--------------------------------------------------------------------*/
  53. void function (size_t offset, size_t length, flag_t flags)
  54. {
  55. signed c;
  56. while (offset--)
  57. {
  58. if ((c = getc (stdin)) == EOF)
  59. {
  60. error (1, errno, "Can't read file");
  61. }
  62. }
  63. while (length--)
  64. {
  65. if ((c = getc (stdin)) == EOF)
  66. {
  67. error (1, errno, "Can't read file");
  68. }
  69. putc (DIGITS_HEX [(c >> 4) & 0x0f], stdout);
  70. putc (DIGITS_HEX [(c >> 0) & 0x0f], stdout);
  71. }
  72. if (_anyset (flags, GRAB_NEWLINE))
  73. {
  74. putc ('\n', stdout);
  75. }
  76. return;
  77. }
  78. /*====================================================================*
  79. *
  80. * int main (int argc, char const * argv []);
  81. *
  82. *. Motley Tools by Charles Maier;
  83. *: Copyright (c) 2001-2006 by Charles Maier Associates Limited;
  84. *; Licensed under the Internet Software Consortium License;
  85. *
  86. *--------------------------------------------------------------------*/
  87. int main (int argc, char const * argv [])
  88. {
  89. static char const * optv [] =
  90. {
  91. "l:no:qv",
  92. PUTOPTV_S_FILTER,
  93. "byte stream grabber",
  94. "l n\tlength to read in bytes",
  95. "n\tappend newline on output",
  96. "o x\toffset to read in bytes",
  97. "q\tquiet mode",
  98. "v\tverbose mode",
  99. (char const *) (0)
  100. };
  101. size_t offset = 0;
  102. size_t length = 0;
  103. flag_t flags = (flag_t) (0);
  104. signed c;
  105. while (~ (c = getoptv (argc, argv, optv)))
  106. {
  107. switch (c)
  108. {
  109. case 'l':
  110. length = (size_t) (basespec (optarg, 10, sizeof (size_t)));
  111. break;
  112. case 'o':
  113. offset = (size_t) (basespec (optarg, 16, sizeof (size_t)));
  114. break;
  115. case 'n':
  116. _setbits (flags, GRAB_NEWLINE);
  117. break;
  118. case 'q':
  119. _setbits (flags, GRAB_SILENCE);
  120. break;
  121. case 'v':
  122. _setbits (flags, GRAB_VERBOSE);
  123. break;
  124. default:
  125. break;
  126. }
  127. }
  128. argc -= optind;
  129. argv += optind;
  130. if (! argc)
  131. {
  132. function (offset, length, flags);
  133. }
  134. while ((argc) && (* argv))
  135. {
  136. if (efreopen (* argv, "rb", stdin))
  137. {
  138. function (offset, length, flags);
  139. }
  140. argc--;
  141. argv++;
  142. }
  143. return (0);
  144. }