Mirror of CollapseOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.3KB

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <dirent.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <sys/stat.h>
  8. static int lineno;
  9. static void emptylines(int n)
  10. {
  11. for (int i=0; i<64*n; i++) putchar(0);
  12. }
  13. static int getmarker(char *line) // returns -1 on error, blkid otherwise
  14. {
  15. int blkid;
  16. int r = sscanf(line, "( ----- %d )\n", &blkid);
  17. if (r == 1) {
  18. return blkid;
  19. } else {
  20. return -1;
  21. }
  22. }
  23. static int expectmarker(char *line)
  24. {
  25. int blkid = getmarker(line);
  26. if (blkid < 0) { // could not scan
  27. fprintf(
  28. stderr, "Error at line %d: expecting block marker\n", lineno);
  29. }
  30. return blkid;
  31. }
  32. static void usage()
  33. {
  34. fprintf(stderr, "Usage: blkpack < blk.fs > blkfs\n");
  35. }
  36. int main(int argc, char *argv[])
  37. {
  38. int prevblkid = -1;
  39. int blkid;
  40. char *line = NULL;
  41. if (argc != 1) {
  42. usage();
  43. return 1;
  44. }
  45. lineno = 1;
  46. size_t n = 0;
  47. ssize_t cnt = getline(&line, &n, stdin);
  48. if (cnt <= 0) {
  49. fprintf(stderr, "No input\n");
  50. return 1;
  51. }
  52. while (1) {
  53. blkid = expectmarker(line);
  54. if (blkid < 0) return 1;
  55. if (blkid <= prevblkid) {
  56. fprintf(
  57. stderr,
  58. "Wrong blkid (%d) at line %d: blocks must be ordered\n",
  59. blkid, lineno);
  60. return 1;
  61. }
  62. emptylines((blkid-prevblkid-1)*16);
  63. int blkline;
  64. for (blkline=0; blkline<16; blkline++) {
  65. lineno++;
  66. cnt = getline(&line, &n, stdin);
  67. if (cnt <= 0) break; // EOF
  68. if (cnt > 65) {
  69. fprintf(stderr, "Line %d too long (blk %d)\n", lineno, blkid);
  70. return 1;
  71. }
  72. if (getmarker(line) >= 0) break; // we have a marker early
  73. line[cnt-1] = '\0'; // remove newline
  74. printf("%s", line);
  75. // pad line to 64 chars
  76. for (int i=cnt-1; i<64; i++) putchar(0);
  77. }
  78. if (blkline == 16) {
  79. lineno++;
  80. cnt = getline(&line, &n, stdin);
  81. } else {
  82. // fill to 16 lines
  83. emptylines(16-blkline);
  84. }
  85. if (cnt <= 0) break; // EOF
  86. prevblkid = blkid;
  87. }
  88. free(line);
  89. return 0;
  90. }