Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define MIMETYPE_MAX 32768*4
  6. #define MIMETYPE_EXT_MAX_LENGTH 16
  7. #define MIMETYPE_EXT_MAX_COUNT 16
  8.  
  9. // Linked list of our mimetypes:
  10. struct s_mimetype {
  11. char mimetype[64];
  12. int extensioncount;
  13. char *extensions[MIMETYPE_EXT_MAX_COUNT];
  14.  
  15. struct s_mimetype *next;
  16. };
  17.  
  18. struct s_mimetype *mimes = NULL;
  19.  
  20. void read_mimetypes()
  21. {
  22. FILE *fh = fopen("/etc/mime.types", "r");
  23. if( !fh )
  24. {
  25. fprintf(stderr, "Failed to read /etc/mime.types!\n");
  26. return;
  27. }
  28.  
  29. // Slurp it into a big ol' buffer. If yours is larger than this, well, make this bigger.
  30. char *mimeraw = (char*)malloc( MIMETYPE_MAX+1 );
  31. size_t rin = fread( mimeraw, 1, MIMETYPE_MAX, fh );
  32. fclose( fh );
  33. mimeraw[ rin ] = '\0';
  34.  
  35. bool onext = false;
  36. bool comment = false;
  37. struct s_mimetype *mime = (struct s_mimetype *)malloc(sizeof(struct s_mimetype));
  38. memset( mime, 0, sizeof(struct s_mimetype) );
  39.  
  40. for( int x=0; mime && x < rin; x++ )
  41. {
  42. char ch = mimeraw[x];
  43. if( ch == '#' )
  44. comment = true;
  45. else if( ch == '\r' || ch == '\n' )
  46. {
  47. if( mime->mimetype[0] == '\0' )
  48. {
  49. // it's empty.
  50. onext = false;
  51. comment = false;
  52. continue;
  53. }
  54.  
  55. // done this entry, move along now.
  56. mime->next = mimes;
  57. mimes = mime;
  58. mime = NULL;
  59. mime = (struct s_mimetype *)malloc(sizeof(struct s_mimetype));
  60. memset( mime, 0, sizeof(struct s_mimetype) );
  61. onext = false;
  62. comment = false;
  63. continue;
  64. }
  65. else if( comment )
  66. continue;
  67. else if( onext )
  68. {
  69. int extnum = mime->extensioncount - 1;
  70. int extlen = strlen( mime->extensions[extnum] );
  71. if( ch == ' ' || ch == '\t' )
  72. {
  73. // next one, or we're in padding still..
  74. if( extlen == 0 )
  75. continue;
  76.  
  77. if( mime->extensioncount+1 >= MIMETYPE_EXT_MAX_COUNT )
  78. {
  79. // At our limit.
  80. comment = true;
  81. continue;
  82. }
  83.  
  84. mime->extensioncount++;
  85. extnum++;
  86. mime->extensions[extnum] = (char *)malloc(MIMETYPE_EXT_MAX_LENGTH+1);
  87. mime->extensions[extnum][0] = '\0';
  88. continue;
  89. }
  90. else if( extlen < MIMETYPE_EXT_MAX_LENGTH )
  91. {
  92. mime->extensions[extnum][extlen] = ch;
  93. extlen++;
  94. mime->extensions[extnum][extlen] = '\0';
  95. }
  96. }
  97. else
  98. {
  99. int mlen = strlen( mime->mimetype );
  100. if( mlen >= sizeof(mime->mimetype) )
  101. {
  102. // At capacity!
  103. comment = true;
  104. continue;
  105. }
  106. else if( ch == ' ' || ch == '\t' )
  107. {
  108. onext = true;
  109. int extnum = mime->extensioncount;
  110. mime->extensions[extnum] = (char *)malloc(MIMETYPE_EXT_MAX_LENGTH+1);
  111. mime->extensions[extnum][0] = '\0';
  112. mime->extensioncount++;
  113. continue;
  114. }
  115. mime->mimetype[mlen] = ch;
  116. mlen++;
  117. mime->mimetype[mlen] = '\0';
  118. }
  119. }
  120.  
  121. if( mime->mimetype[0] != '\0' )
  122. {
  123. mimes->next = mime;
  124. mimes = mime;
  125. }
  126. else
  127. free( mime );
  128.  
  129. free( mimeraw );
  130. }
  131.  
  132. void free_mimetypes()
  133. {
  134. struct s_mimetype *mnext;
  135. for( struct s_mimetype *m=mimes; m; )
  136. {
  137. mnext = m->next;
  138. for( int x=0; x < m->extensioncount; x++ )
  139. free( m->extensions[x] );
  140. free( m );
  141. m = mnext;
  142. }
  143. }
  144.  
  145. void spill_beans()
  146. {
  147. for( struct s_mimetype *m=mimes; m; m=m->next )
  148. {
  149. printf("[%s] =>", m->mimetype);
  150. for( int x=0; x < m->extensioncount; x++ )
  151. printf(" (%s)", m->extensions[x]);
  152.  
  153. printf("\n");
  154. }
  155. }
  156.  
  157. int main(int argc, char **argv)
  158. {
  159. read_mimetypes();
  160.  
  161. spill_beans();
  162.  
  163. free_mimetypes();
  164.  
  165. return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement