spacepaste

  1.  
  2. #define _GNU_SOURCE
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #define CHUNK_SIZE 40000000
  8. #define LINES_CHUNK_SIZE 100000
  9. #define BUF_SIZE 160000
  10. void dump(char *buffer, int size) {
  11. while (size>0) {
  12. int w = write(1, buffer, size);
  13. buffer+=w;
  14. size-=w;
  15. }
  16. }
  17. static inline char * dumpstr(char *buffer, char *current, char *word, int len) {
  18. int capacity = buffer+BUF_SIZE-current;
  19. if (len > capacity) {
  20. dump(buffer, current - buffer);
  21. current = buffer;
  22. }
  23. for (int i=0;i < len; i++) {
  24. *current = word[i];
  25. current++;
  26. }
  27. return current;
  28. }
  29. int main() {
  30. // INPUT reading
  31. char *buf = malloc(CHUNK_SIZE);
  32. int size = CHUNK_SIZE;
  33. {
  34. char *s = buf;
  35. int left = CHUNK_SIZE;
  36. while(1){
  37. int n = read(0, s, left);
  38. if(n == 0) break;
  39. s += n; left -= n;
  40. if(left == 0) {
  41. int tmp = size;
  42. size += CHUNK_SIZE;
  43. left = CHUNK_SIZE;
  44. buf=realloc(buf, size);
  45. s = buf + tmp;
  46. }
  47. }
  48. *s = '\n';
  49. *(s+1) = '\0';
  50. }
  51. char **w = NULL;
  52. ssize_t *o = NULL;
  53. int k = 0;
  54. {
  55. char *s = buf;
  56. int is_word = 0;
  57. while (*s) {
  58. if (k % LINES_CHUNK_SIZE == 0) {
  59. w = realloc(w, k+LINES_CHUNK_SIZE);
  60. o = realloc(o, (k+LINES_CHUNK_SIZE)*sizeof(ssize_t));
  61. }
  62. switch (*s) {
  63. case ' ':
  64. if (is_word) {
  65. o[k] = s-w[k];
  66. is_word = 0;
  67. k++;
  68. }
  69. break;
  70. case '\r':
  71. if (is_word) {
  72. o[k] = s-w[k];
  73. is_word = 0;
  74. k++;
  75. }
  76. break;
  77. case '\n':
  78. if (is_word) {
  79. o[k] = s-w[k];
  80. is_word = 0;
  81. k++;
  82. }
  83. break;
  84. default:
  85. if (!is_word) {
  86. w[k] = s;
  87. is_word = 1;
  88. }
  89. }
  90. s++;
  91. }
  92. }
  93. char out_buf[BUF_SIZE];
  94. char *s = out_buf;
  95. for(int i = 0; i < k; i+=2)
  96. for(int j = 1; j < k; j+=2){
  97. s=dumpstr(out_buf,s,w[i],o[i]);
  98. s=dumpstr(out_buf,s,w[j],o[j]);
  99. s=dumpstr(out_buf,s,"\n",1);
  100. }
  101. dump(out_buf, s - out_buf);
  102. return 0;
  103. }
  104.