fork download
  1. #include<stdio.h>
  2.  
  3. #define BUFSIZE 48
  4. #define NUMENCDATA 4
  5.  
  6. static const size_t sixbase = 0b111111;
  7. static const size_t eigbase = 0b11111111;
  8. static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  9.  
  10. typedef struct _FMS {
  11. size_t bytes;
  12. size_t state;
  13. } FMS;
  14.  
  15. enum State { First = 1, Second = 2, Third = 3, Finish = 4 };
  16. static FMS initState = { 0, First };
  17.  
  18. void FMS_init(FMS *self) {
  19. *self = initState;
  20. }
  21.  
  22. void FMS_stack(FMS *self, char c) {
  23. size_t stack = (size_t)c;
  24. switch (self->state) {
  25. case First:
  26. self->bytes = (stack << 16);
  27. self->state = Second;
  28. break;
  29. case Second:
  30. self->bytes = self->bytes | (stack << 8) ;
  31. self->state = Third;
  32. break;
  33. case Third:
  34. self->bytes = self->bytes | stack;
  35. self->state = Finish;
  36. break;
  37. case Finish:
  38. fprintf(stderr,"スタックがいっぱいです。\n");
  39. break;
  40. }
  41. }
  42.  
  43. void FMS_stackdata_encode_flush(FMS *self) {
  44. char res[NUMENCDATA];
  45. if(self->state == Finish) {
  46. for(size_t it = 0; it != NUMENCDATA; ++it) {
  47. res[it] = table[(self->bytes & (sixbase << (18 - 6 * it))) >> (18 - 6 * it)];
  48. }
  49. fwrite(res, sizeof(char), NUMENCDATA, stdout);
  50. *self = initState;
  51. }
  52. }
  53.  
  54. void b64enc(FILE *fp) {
  55. FMS fms;
  56. FMS_init(&fms);
  57. char buf[BUFSIZE];
  58. size_t nread;
  59. while((nread = fread(buf, sizeof(char), BUFSIZE, fp)) > 0) {
  60. for(size_t it = 0; it != BUFSIZE; ++it) {
  61. FMS_stack(&fms, buf[it]);
  62. FMS_stackdata_encode_flush(&fms);
  63. }
  64. printf("\n");
  65. }
  66. }
  67.  
  68. int main(void) {
  69. FILE *fp;
  70. if( fopen_s(&fp,"base64s.c", "rb") < 0) {
  71. fprintf(stderr, "ファイルを開けませんでした!\n");
  72. return 1;
  73. }
  74. b64enc(fp);
  75. fclose(fp);
  76. return 0;
  77. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function ‘main’:
prog.c:70: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:7:21: warning: ‘eigbase’ defined but not used [-Wunused-const-variable=]
 static const size_t eigbase = 0b11111111;
                     ^~~~~~~
/usr/bin/ld: /home/yBWCa8/ccvT6PJ2.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