[Info-vax] Mail reading/processing problem, UTF-8

Phillip Helbig---undress to reply helbig at astro.multiCLOTHESvax.de
Sun Aug 21 03:10:45 EDT 2011


In article
<6b046c6e-8997-42f1-bd03-923f3a76b4ae at u20g2000yqj.googlegroups.com>,
Steven Schweda <sms.antinode at gmail.com> writes: 

>    I have no idea where I found the b64decode.c and
> b64encode.c programs in my collection (19-DEC-1999), but let
> me know if you can't find anything which works.

Might be the same as this (also no idea where I got it):

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int decode_b64char( int ch )
{
    int  sextet;

         if( ('A' <= ch) && (ch <= 'Z') )  sextet = ch - 'A';
    else if( ('a' <= ch) && (ch <= 'z') )  sextet = (ch - 'a') + 26;
    else if( ('0' <= ch) && (ch <= '9') )  sextet = (ch - '0') + 52;
    else if( ch == '+' )                   sextet = 62;
    else if( ch == '/' )                   sextet = 63;
    else {
        fprintf( stderr, (isprint(ch) ? "Illegal base64 character '%c'\n" :
                                        "Illegal base64 character 0x%02x\n"),
                 ch );
        exit( EXIT_FAILURE );
    }
    return( sextet );
}


main( int argc, char *argv[] )
{
    FILE *fin;
    FILE *fout;
    int  flushing = 0;
    int  temp = 0;
    int  bits = 0;
    int  ch;

    if( argc < 2 ) {
        fprintf( stderr, "Usage: b64decode <infile> [outfile]\n" );
        exit( EXIT_SUCCESS );
    }

    fin = fopen( argv[1], "r" );
    if( fin == NULL ) {
        perror( "openin" );
        exit( EXIT_FAILURE );
    }

    if( argc < 3 )
        fout = stdout;
    else {
        fout = fopen( argv[2], "wb" );
        if( fout == NULL ) {
            perror( "openout" );
            fclose( fin );
            exit( EXIT_FAILURE );
        }
    }

    while( (ch = fgetc( fin )) != EOF ) {
        if( isspace(ch) )
            continue;

        if( flushing ) {
            if( ch != '=' ) {
                fprintf( stderr, "Illegal character in EOF padding\n" );
                exit( EXIT_FAILURE );
            }
        }
        else {
            if( ch == '=' )
                flushing = 1;
            else {
                temp <<= 6;
                temp |= decode_b64char( ch );
                bits += 6;
                if( bits >= 8 ) {
                    bits -= 8;
                    fputc( (0xff & (temp >> bits)), fout );
                }
            }
        }
    }

    fclose( fout );
    fclose( fin );
}



More information about the Info-vax mailing list