#include<stdio.h>
#define BUFSIZE 48
#define NUMENCDATA 4
static const size_t sixbase = 0b111111 ;
static const size_t eigbase = 0b11111111 ;
static const char table[ ] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;
typedef struct _FMS {
size_t bytes;
size_t state;
} FMS;
enum State { First = 1 , Second = 2 , Third = 3 , Finish = 4 } ;
static FMS initState = { 0 , First } ;
void FMS_init( FMS * self) {
* self = initState;
}
void FMS_stack( FMS * self, char c) {
size_t stack = ( size_t ) c;
switch ( self-> state) {
case First:
self-> bytes = ( stack << 16 ) ;
self-> state = Second;
break ;
case Second:
self-> bytes = self-> bytes | ( stack << 8 ) ;
self-> state = Third;
break ;
case Third:
self-> bytes = self-> bytes | stack;
self-> state = Finish;
break ;
case Finish:
break ;
}
}
void FMS_stackdata_encode_flush( FMS * self) {
char res[ NUMENCDATA] ;
if ( self-> state == Finish) {
for ( size_t it = 0 ; it != NUMENCDATA; ++ it) {
res[ it] = table[ ( self-> bytes & ( sixbase << ( 18 - 6 * it) ) ) >> ( 18 - 6 * it) ] ;
}
fwrite ( res
, sizeof ( char ) , NUMENCDATA
, stdout
) ; * self = initState;
}
}
void b64enc( FILE * fp) {
FMS fms;
FMS_init( & fms) ;
char buf[ BUFSIZE] ;
size_t nread;
while ( ( nread
= fread ( buf
, sizeof ( char ) , BUFSIZE
, fp
) ) > 0 ) { for ( size_t it = 0 ; it != BUFSIZE; ++ it) {
FMS_stack( & fms, buf[ it] ) ;
FMS_stackdata_encode_flush( & fms) ;
}
}
}
int main( void ) {
FILE * fp;
if ( fopen_s( & fp, "base64s.c" , "rb" ) < 0 ) {
fprintf ( stderr
, "ファイルを開けませんでした!\n " ) ; return 1 ;
}
b64enc( fp) ;
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KCiNkZWZpbmUgQlVGU0laRSA0OAojZGVmaW5lIE5VTUVOQ0RBVEEgNAoKc3RhdGljIGNvbnN0IHNpemVfdCBzaXhiYXNlID0gMGIxMTExMTE7CnN0YXRpYyBjb25zdCBzaXplX3QgZWlnYmFzZSA9IDBiMTExMTExMTE7CnN0YXRpYyBjb25zdCBjaGFyIHRhYmxlW10gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Cgp0eXBlZGVmIHN0cnVjdCBfRk1TIHsKICAgIHNpemVfdCBieXRlczsKICAgIHNpemVfdCBzdGF0ZTsKfSBGTVM7CgplbnVtIFN0YXRlIHsgRmlyc3QgPSAxLCBTZWNvbmQgPSAyLCBUaGlyZCA9IDMsIEZpbmlzaCA9IDQgfTsKc3RhdGljIEZNUyBpbml0U3RhdGUgPSB7IDAsIEZpcnN0IH07Cgp2b2lkIEZNU19pbml0KEZNUyAqc2VsZikgewogICAgKnNlbGYgPSBpbml0U3RhdGU7Cn0KCnZvaWQgRk1TX3N0YWNrKEZNUyAqc2VsZiwgY2hhciBjKSB7CiAgICBzaXplX3Qgc3RhY2sgPSAoc2l6ZV90KWM7CiAgICBzd2l0Y2ggKHNlbGYtPnN0YXRlKSB7CiAgICAgICAgY2FzZSBGaXJzdDoKICAgICAgICAgICAgc2VsZi0+Ynl0ZXMgPSAoc3RhY2sgPDwgMTYpOwogICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IFNlY29uZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTZWNvbmQ6CiAgICAgICAgICAgIHNlbGYtPmJ5dGVzID0gc2VsZi0+Ynl0ZXMgfCAoc3RhY2sgPDwgOCkgOwogICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IFRoaXJkOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRoaXJkOgogICAgICAgICAgICBzZWxmLT5ieXRlcyA9IHNlbGYtPmJ5dGVzIHwgc3RhY2s7CiAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRmluaXNoOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZpbmlzaDoKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIuOCueOCv+ODg+OCr+OBjOOBhOOBo+OBseOBhOOBp+OBmeOAglxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9Cgp2b2lkIEZNU19zdGFja2RhdGFfZW5jb2RlX2ZsdXNoKEZNUyAqc2VsZikgewogICAgY2hhciByZXNbTlVNRU5DREFUQV07CiAgICBpZihzZWxmLT5zdGF0ZSA9PSBGaW5pc2gpIHsgCiAgICAgICAgZm9yKHNpemVfdCBpdCA9IDA7IGl0ICE9IE5VTUVOQ0RBVEE7ICsraXQpIHsKICAgICAgICAgICAgcmVzW2l0XSA9IHRhYmxlWyhzZWxmLT5ieXRlcyAmIChzaXhiYXNlIDw8ICgxOCAtIDYgKiBpdCkpKSA+PiAoMTggLSA2ICogaXQpXTsKICAgICAgICB9CiAgICAgICAgZndyaXRlKHJlcywgc2l6ZW9mKGNoYXIpLCBOVU1FTkNEQVRBLCBzdGRvdXQpOwogICAgICAgICpzZWxmID0gaW5pdFN0YXRlOwogICAgfQp9Cgp2b2lkIGI2NGVuYyhGSUxFICpmcCkgewogICAgRk1TIGZtczsKICAgIEZNU19pbml0KCZmbXMpOwogICAgY2hhciBidWZbQlVGU0laRV07CiAgICBzaXplX3QgbnJlYWQ7CiAgICB3aGlsZSgobnJlYWQgPSBmcmVhZChidWYsIHNpemVvZihjaGFyKSwgQlVGU0laRSwgZnApKSA+IDApIHsKICAgICAgICBmb3Ioc2l6ZV90IGl0ID0gMDsgaXQgIT0gQlVGU0laRTsgKytpdCkgewogICAgICAgICAgICBGTVNfc3RhY2soJmZtcywgYnVmW2l0XSk7CiAgICAgICAgICAgIEZNU19zdGFja2RhdGFfZW5jb2RlX2ZsdXNoKCZmbXMpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIEZJTEUgKmZwOwogICAgaWYoIGZvcGVuX3MoJmZwLCJiYXNlNjRzLmMiLCAicmIiKSA8IDApIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIuODleOCoeOCpOODq+OCkumWi+OBkeOBvuOBm+OCk+OBp+OBl+OBnyFcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgYjY0ZW5jKGZwKTsKICAgIGZjbG9zZShmcCk7CiAgICByZXR1cm4gMDsKfQ==
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