Highlight things
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.1KB

  1. /* main.c
  2. * Copyright 2023 Anon Anonson, Ognjen 'xolatile' Milan Robovic, Emil Williams
  3. * SPDX Identifier: GPL-3.0-only / NO WARRANTY / NO GUARANTEE */
  4. #include <assert.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include "terminal.h"
  10. #include "syntax/syntax.h"
  11. #define ALLOCATION_CHUNK (128UL)
  12. static const char * argv0;
  13. static char *
  14. read_entire_file(const char * fn)
  15. {
  16. FILE * fp = fopen(fn, "r");
  17. if (fp)
  18. {
  19. size_t len;
  20. char * b;
  21. fseek(fp, 0, SEEK_END);
  22. len = ftell(fp);
  23. rewind(fp);
  24. b = malloc(len + 1);
  25. if (b && fread(b, 1, len, fp)) {
  26. b[len] = '\0';
  27. }
  28. fclose(fp);
  29. return b;
  30. }
  31. else
  32. { return NULL; }
  33. }
  34. static char *
  35. get_stdin(void)
  36. {
  37. size_t buffer_size = 0;
  38. size_t n = 1;
  39. char * buffer = malloc(ALLOCATION_CHUNK);
  40. if (!buffer)
  41. { return NULL; }
  42. do {
  43. if (buffer_size + 1 >= (ALLOCATION_CHUNK * n)) {
  44. buffer = realloc(buffer, ALLOCATION_CHUNK * ++n + 1);
  45. if (!buffer)
  46. { return NULL; }
  47. buffer[ALLOCATION_CHUNK * n] = '\0';
  48. }
  49. if (read(STDIN_FILENO, &buffer[buffer_size], sizeof (*buffer)) == -1)
  50. {
  51. free(buffer);
  52. fprintf(stderr, "%s: Failed to read from stdin\n", argv0);
  53. return NULL;
  54. }
  55. } while (buffer[buffer_size++]);
  56. buffer[buffer_size - 1] = '\0';
  57. return buffer;
  58. }
  59. int
  60. main(int argc,
  61. char ** argv) {
  62. int arg = 0;
  63. int ret = 0;
  64. char * buffer = NULL;
  65. argv0 = argv[0];
  66. terminal_hl_init();
  67. highlight_c(); /* this mustn't break overrides (but definitely does) */
  68. while (++argv,
  69. --argc) {
  70. if (**argv == '-') {
  71. /* TODO use uthash */
  72. if (strcmp(*argv+1, "c") == 0) {
  73. highlight_c();
  74. }
  75. else {
  76. fprintf(stderr, "%s: Unimplemented syntax '%s'\n", argv0, *argv+1);
  77. return 1;
  78. }
  79. }
  80. else {
  81. free(buffer);
  82. arg = 1;
  83. buffer = read_entire_file(*argv);
  84. if (!buffer) {
  85. fprintf(stderr,"%s: cannot access '%s': ", argv0, *argv);
  86. perror(NULL);
  87. ret = 2;
  88. }
  89. else
  90. { render_string(buffer, "cterm"); }
  91. }
  92. }
  93. if (!arg) {
  94. buffer = get_stdin();
  95. render_string(buffer, "cterm");
  96. }
  97. fflush(stdout);
  98. hl_deinit();
  99. free(buffer);
  100. return ret;
  101. }