fork download
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<limits.h>
  4.  
  5. #define BUFSIZE 48
  6. #define NUMENCDATA 4
  7.  
  8. void printb(unsigned int v) {
  9. unsigned int mask = (int)1 << (sizeof(v) * CHAR_BIT - 1);
  10. do putchar(mask & v ? '1' : '0');
  11. while (mask >>= 1);
  12. }
  13.  
  14. void putb(unsigned int v) {
  15. putchar('0'), putchar('b'), printb(v), putchar('\n');
  16. }
  17.  
  18. static const size_t sixbase = 0b111111;
  19. static const size_t eigbase = 0b11111111;
  20. static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  21.  
  22. enum State { First = 1, Second = 2, Third = 3, Finish = 4 };
  23. typedef struct {
  24. size_t bytes;
  25. enum State state;
  26. } FSM;
  27.  
  28. static FSM initState = { 0, First };
  29.  
  30.  
  31. void FSM_init(FSM *self) {
  32. *self = initState;
  33. }
  34.  
  35. void FSM_stack(FSM *self, char c) {
  36. size_t stack = (size_t)c;
  37. switch (self->state) {
  38. case First:
  39. self->bytes = (stack << 16);
  40. self->state = Second;
  41. break;
  42. case Second:
  43. self->bytes = self->bytes | (stack << 8) ;
  44. self->state = Third;
  45. break;
  46. case Third:
  47. self->bytes = self->bytes | stack;
  48. self->state = Finish;
  49. break;
  50. case Finish:
  51. fprintf(stderr,"スタックがいっぱいです。\n");
  52. break;
  53. }
  54. }
  55.  
  56. void FSM_encode_flush(FSM *self) {
  57. char res[NUMENCDATA];
  58. if(self->state == Finish) {
  59. for(size_t it = 0; it != NUMENCDATA; ++it) {
  60. res[it] = table[(self->bytes & (sixbase << (18 - 6 * it))) >> (18 - 6 * it)];
  61. }
  62. fwrite(res, sizeof(char), NUMENCDATA, stdout);
  63. printf(" : ");
  64. putb(self->bytes);
  65. *self = initState;
  66. }
  67. }
  68.  
  69. void b64enc(FILE *fp) {
  70. FSM fms;
  71. FSM_init(&fms);
  72. char buf[BUFSIZE];
  73. size_t nread;
  74. while((nread = fread(buf, sizeof(char), BUFSIZE, fp)) > 0) {
  75. for(size_t it = 0; it != nread; ++it) {
  76. FSM_stack(&fms, buf[it]);
  77. FSM_encode_flush(&fms);
  78. }
  79. }
  80. printf("\n");
  81. }
  82.  
  83.  
  84. int main(void) {
  85. FILE *fp;
  86. if( fopen_s(&fp,"base64s.c", "rb") < 0) {
  87. fprintf(stderr, "ファイルを開けませんでした!\n");
  88. return 1;
  89. }
  90. b64enc(fp);
  91. fclose(fp);
  92. return 0;
  93. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function ‘main’:
prog.c:86:9: warning: implicit declaration of function ‘fopen_s’; did you mean ‘fopen’? [-Wimplicit-function-declaration]
     if( fopen_s(&fp,"base64s.c", "rb") < 0) {
         ^~~~~~~
         fopen
At top level:
prog.c:19:21: warning: ‘eigbase’ defined but not used [-Wunused-const-variable=]
 static const size_t eigbase = 0b11111111;
                     ^~~~~~~
/usr/bin/ld: /home/S5sApo/cc0GRKNg.o: in function `main':
prog.c:(.text.startup+0x26): undefined reference to `fopen_s'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty