gaim/www
Clone
Summary
Browse
Changes
Graph
as discussed on gaim-devel
2005-12-20, Luke Schierer
0dca992e9b5d
as discussed on gaim-devel
#include
<stdlib.h>
#include
<stdio.h>
#define g_malloc malloc
#define g_realloc realloc
typedef
long
gint32
;
char
alphabet
[]
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
"0123456789+/"
;
char
*
tobase64
(
const
char
*
text
)
{
char
*
out
=
NULL
;
const
char
*
c
;
unsigned
int
tmp
=
0
;
int
len
=
0
,
n
=
0
;
c
=
text
;
while
(
*
c
)
{
tmp
=
tmp
<<
8
;
tmp
+=
*
c
;
n
++
;
if
(
n
==
3
)
{
out
=
g_realloc
(
out
,
len
+
4
);
out
[
len
]
=
alphabet
[(
tmp
>>
18
)
&
0x3f
];
out
[
len
+
1
]
=
alphabet
[(
tmp
>>
12
)
&
0x3f
];
out
[
len
+
2
]
=
alphabet
[(
tmp
>>
6
)
&
0x3f
];
out
[
len
+
3
]
=
alphabet
[
tmp
&
0x3f
];
len
+=
4
;
tmp
=
0
;
n
=
0
;
}
c
++
;
}
switch
(
n
)
{
case
2
:
tmp
<<=
8
;
out
=
g_realloc
(
out
,
len
+
5
);
out
[
len
]
=
alphabet
[(
tmp
>>
18
)
&
0x3f
];
out
[
len
+
1
]
=
alphabet
[(
tmp
>>
12
)
&
0x3f
];
out
[
len
+
2
]
=
alphabet
[(
tmp
>>
6
)
&
0x3f
];
out
[
len
+
3
]
=
'='
;
out
[
len
+
4
]
=
0
;
break
;
case
1
:
tmp
<<=
16
;
out
=
g_realloc
(
out
,
len
+
5
);
out
[
len
]
=
alphabet
[(
tmp
>>
18
)
&
0x3f
];
out
[
len
+
1
]
=
alphabet
[(
tmp
>>
12
)
&
0x3f
];
out
[
len
+
2
]
=
'='
;
out
[
len
+
3
]
=
'='
;
out
[
len
+
4
]
=
0
;
break
;
case
0
:
out
=
g_realloc
(
out
,
len
+
1
);
out
[
len
]
=
0
;
break
;
}
return
out
;
}
void
frombase64
(
const
char
*
text
,
char
**
data
,
int
*
size
)
{
char
*
out
=
NULL
;
char
tmp
=
0
;
const
char
*
c
;
gint32
tmp2
=
0
;
int
len
=
0
,
n
=
0
;
if
(
!
text
||
!
data
)
return
;
c
=
text
;
while
(
*
c
)
{
if
(
*
c
>=
'A'
&&
*
c
<=
'Z'
)
{
tmp
=
*
c
-
'A'
;
}
else
if
(
*
c
>=
'a'
&&
*
c
<=
'z'
)
{
tmp
=
26
+
(
*
c
-
'a'
);
}
else
if
(
*
c
>=
'0'
&&
*
c
<=
57
)
{
tmp
=
52
+
(
*
c
-
'0'
);
}
else
if
(
*
c
==
'+'
)
{
tmp
=
62
;
}
else
if
(
*
c
==
'/'
)
{
tmp
=
63
;
}
else
if
(
*
c
==
'='
)
{
if
(
n
==
3
)
{
out
=
g_realloc
(
out
,
len
+
2
);
out
[
len
]
=
(
char
)(
tmp2
>>
10
)
&
0xff
;
len
++
;
out
[
len
]
=
(
char
)(
tmp2
>>
2
)
&
0xff
;
len
++
;
}
else
if
(
n
==
2
)
{
out
=
g_realloc
(
out
,
len
+
1
);
out
[
len
]
=
(
char
)(
tmp2
>>
4
)
&
0xff
;
len
++
;
}
break
;
}
tmp2
=
((
tmp2
<<
6
)
|
(
tmp
&
0xff
));
n
++
;
if
(
n
==
4
)
{
out
=
g_realloc
(
out
,
len
+
3
);
out
[
len
]
=
(
char
)((
tmp2
>>
16
)
&
0xff
);
len
++
;
out
[
len
]
=
(
char
)((
tmp2
>>
8
)
&
0xff
);
len
++
;
out
[
len
]
=
(
char
)(
tmp2
&
0xff
);
len
++
;
tmp2
=
0
;
n
=
0
;
}
c
++
;
}
out
=
g_realloc
(
out
,
len
+
1
);
out
[
len
]
=
0
;
*
data
=
out
;
if
(
size
)
*
size
=
len
;
}
int
main
(
int
argc
,
char
**
argv
)
{
char
*
data
;
int
len
;
FILE
*
f
;
if
(
argc
!=
3
)
return
1
;
switch
(
argv
[
1
][
0
])
{
case
'e'
:
printf
(
"%s
\n
"
,
tobase64
(
argv
[
2
]));
break
;
case
'd'
:
frombase64
(
argv
[
2
],
&
data
,
&
len
);
f
=
fopen
(
"output"
,
"w"
);
fwrite
(
data
,
1
,
len
,
f
);
fclose
(
f
);
break
;
}
return
0
;
}