code_junkie

Colored grep?

Nov 11th, 2011
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. grep -C 99999 --color <regexp> <filename>
  2.  
  3. #include <stdio.h>
  4. #include <regex.h>
  5.  
  6. #define MAX_LINE 4096
  7.  
  8. #define RESET "33[0m"
  9. #define BLACK "33[30m" /* Black */
  10. #define RED "33[31m" /* Red */
  11. #define GREEN "33[32m" /* Green */
  12. #define YELLOW "33[33m" /* Yellow */
  13. #define BLUE "33[34m" /* Blue */
  14. #define MAGENTA "33[35m" /* Magenta */
  15. #define CYAN "33[36m" /* Cyan */
  16. #define WHITE "33[37m" /* White */
  17. #define BOLDBLACK "33[1m33[30m" /* Bold Black */
  18. #define BOLDRED "33[1m33[31m" /* Bold Red */
  19. #define BOLDGREEN "33[1m33[32m" /* Bold Green */
  20. #define BOLDYELLOW "33[1m33[33m" /* Bold Yellow */
  21. #define BOLDBLUE "33[1m33[34m" /* Bold Blue */
  22. #define BOLDMAGENTA "33[1m33[35m" /* Bold Magenta */
  23. #define BOLDCYAN "33[1m33[36m" /* Bold Cyan */
  24. #define BOLDWHITE "33[1m33[37m" /* Bold White */
  25.  
  26. static int selected_color = 0;
  27. static char *colors[] = {
  28. "-green", GREEN,
  29. "-black", BLACK,
  30. "-red", RED,
  31. "-yellow", YELLOW,
  32. "-blue", BLUE,
  33. "-magenta", MAGENTA,
  34. "-cyan", CYAN,
  35. "-white", WHITE,
  36. "-boldgreen", BOLDGREEN,
  37. "-boldblack", BOLDBLACK,
  38. "-boldred", BOLDRED,
  39. "-boldyellow", BOLDYELLOW,
  40. "-boldblue", BOLDBLUE,
  41. "-boldmagenta", BOLDMAGENTA,
  42. "-boldcyan", BOLDCYAN,
  43. "-boldwhite", BOLDWHITE,
  44. NULL
  45. };
  46.  
  47. /*----------------------------------------------------------------------*/
  48.  
  49. int main(int argc, char *argv[]) {
  50. char buf[MAX_LINE];
  51. int has_re = 0;
  52. regex_t re;
  53.  
  54. if (argc > 1) {
  55. if (argc > 2) {
  56. int idx = 0;
  57. while (colors[idx*2]) {
  58. if (!strcmp(colors[idx*2], argv[1])) {
  59. selected_color = idx;
  60. break;
  61. }
  62. idx++;
  63. }
  64. if (regcomp(&re, argv[2], REG_EXTENDED | REG_NEWLINE)) {
  65. printf("regcomp() failed!n");
  66. return -1;
  67. }
  68. } else if (regcomp(&re, argv[1], REG_EXTENDED | REG_NEWLINE)) {
  69. printf("regcomp() failed!n");
  70. return -1;
  71. }
  72. has_re = 1;
  73. } else {
  74. printf("Usage: %s [ -red | -blue | -cyan | -white | -black | "
  75. "-yellow | -magenta ] <regexp>n", argv[0]);
  76. return -1;
  77. }
  78.  
  79. while (fgets(buf, MAX_LINE, stdin) == buf) {
  80. char *bbuf = buf;
  81. while (1) {
  82. if (has_re) {
  83. regmatch_t match[10];
  84. if (regexec(&re, bbuf, re.re_nsub + 1, match, 0)) {
  85. printf("%s", bbuf);
  86. break;
  87. } else {
  88. int i, idx;
  89. for (i=idx=0; i<1; i++) {
  90. if (match[0].rm_so < 0) {
  91. break;
  92. } else {
  93. printf("%.*s",
  94. (int)(match[i].rm_so-idx),
  95. bbuf+idx);
  96. printf( "%s%.*s" RESET,
  97. colors[selected_color*2+1],
  98. (int)(match[i].rm_eo-match[i].rm_so),
  99. bbuf+(int)match[i].rm_so);
  100. idx = match[i].rm_eo;
  101. bbuf += idx;
  102. }
  103. }
  104. }
  105. }
  106. fflush(stdout);
  107. }
  108. }
  109.  
  110. if (has_re) {
  111. regfree(&re);
  112. }
  113.  
  114. return 0;
  115. }
Add Comment
Please, Sign In to add comment