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 10000
  9. #define BUF_SIZE 320000
  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, int newline) {
  18. int capacity = buffer+BUF_SIZE-current;
  19. if (len > capacity) {
  20. dump(buffer, current - buffer);
  21. current = buffer;
  22. }
  23. if (len>8) {
  24. memcpy(current,word,len);
  25. } else {
  26. memcpy(current,word,8);
  27. }
  28. /*
  29. switch (len) {
  30. case 0: break;
  31. case 1: memcpy(current,word,1);break;
  32. case 2: memcpy(current,word,2);break;
  33. case 3: memcpy(current,word,3);break;
  34. case 4: memcpy(current,word,4);break;
  35. case 5: memcpy(current,word,5);break;
  36. case 6: memcpy(current,word,6);break;
  37. case 7: memcpy(current,word,7);break;
  38. case 8: memcpy(current,word,8);break;
  39. default: memcpy(current,word,len);break;
  40. }*/
  41. current+=len;
  42. if (newline) {
  43. *current = '\n';
  44. current++;
  45. }
  46. return current;
  47. }
  48. int main() {
  49. // INPUT reading
  50. char *buf = malloc(CHUNK_SIZE);
  51. int size = CHUNK_SIZE;
  52. {
  53. char *s = buf;
  54. int left = CHUNK_SIZE;
  55. while(1){
  56. int n = read(0, s, left);
  57. if(n == 0) break;
  58. s += n; left -= n;
  59. if(left == 0) {
  60. int tmp = size;
  61. size += CHUNK_SIZE;
  62. left = CHUNK_SIZE;
  63. buf=realloc(buf, size);
  64. s = buf + tmp;
  65. }
  66. }
  67. *s = '\n';
  68. *(s+1) = '\0';
  69. //unlikely
  70. if (size < s-buf+8) {
  71. buf = realloc(buf, size+8);
  72. }
  73. }
  74. char **w = NULL;
  75. ssize_t *o = NULL;
  76. int k = 0;
  77. {
  78. char *s = buf;
  79. while (*s) {
  80. if (k % LINES_CHUNK_SIZE == 0) {
  81. w = realloc(w, (k+LINES_CHUNK_SIZE)*sizeof(ssize_t));
  82. o = realloc(o, (k+LINES_CHUNK_SIZE)*sizeof(ssize_t));
  83. }
  84. w[k] = s; // set offset
  85. while (*s != '\r' && *s != '\n' && *s != ' ') s++; // read word
  86. o[k] = s-w[k]; // set length
  87. k++;
  88. while (*s == '\r' || *s == '\n' || *s == ' ') s++; // read space characters
  89. }
  90. }
  91. char out_buf[BUF_SIZE+8];
  92. char *s = out_buf;
  93. for(int i = 0; i < k; i+=2)
  94. for(int j = 1; j < k; j+=2){
  95. s=dumpstr(out_buf,s,w[i],o[i],0);
  96. s=dumpstr(out_buf,s,w[j],o[j],1);
  97. }
  98. dump(out_buf, s - out_buf);
  99. return 0;
  100. }
  101.