Annotation of embedaddon/php/ext/xmlrpc/libxmlrpc/base64.c, revision 1.1

1.1     ! misho       1: static const char rcsid[] = "#(@) $Id: base64.c 242949 2007-09-26 15:44:16Z cvs2svn $";
        !             2: 
        !             3: /*
        !             4: 
        !             5:           Encode or decode file as MIME base64 (RFC 1341)
        !             6: 
        !             7:                            by John Walker
        !             8:                       http://www.fourmilab.ch/
        !             9: 
        !            10:                This program is in the public domain.
        !            11: 
        !            12: */
        !            13: #include <stdio.h>
        !            14: 
        !            15: /*  ENCODE  -- Encode binary file into base64.  */
        !            16: #include <stdlib.h>
        !            17: #include <ctype.h>
        !            18: 
        !            19: #include "base64.h"
        !            20: 
        !            21: static unsigned char dtable[512];
        !            22: 
        !            23: void buffer_new(struct buffer_st *b)
        !            24: {
        !            25:   b->length = 512;
        !            26:   b->data = malloc(sizeof(char)*(b->length));
        !            27:   b->data[0] = 0;
        !            28:   b->ptr = b->data;
        !            29:   b->offset = 0;
        !            30: }
        !            31: 
        !            32: void buffer_add(struct buffer_st *b, char c)
        !            33: {
        !            34:   *(b->ptr++) = c;
        !            35:   b->offset++;
        !            36:   if (b->offset == b->length) {
        !            37:     b->length += 512;
        !            38:     b->data = realloc(b->data, b->length);
        !            39:     b->ptr = b->data + b->offset;
        !            40:   }
        !            41: }
        !            42: 
        !            43: void buffer_delete(struct buffer_st *b)
        !            44: {
        !            45:   free(b->data);
        !            46:   b->length = 0;
        !            47:   b->offset = 0;
        !            48:   b->ptr = NULL;
        !            49:   b->data = NULL;
        !            50: }
        !            51: 
        !            52: void base64_encode_xmlrpc(struct buffer_st *b, const char *source, int length)
        !            53: {
        !            54:   int i, hiteof = 0;
        !            55:   int offset = 0;
        !            56:   int olen;
        !            57:   
        !            58:   olen = 0;
        !            59:   
        !            60:   buffer_new(b);
        !            61:   
        !            62:   /*   Fill dtable with character encodings.  */
        !            63:   
        !            64:   for (i = 0; i < 26; i++) {
        !            65:     dtable[i] = 'A' + i;
        !            66:     dtable[26 + i] = 'a' + i;
        !            67:   }
        !            68:   for (i = 0; i < 10; i++) {
        !            69:     dtable[52 + i] = '0' + i;
        !            70:   }
        !            71:   dtable[62] = '+';
        !            72:   dtable[63] = '/';
        !            73:   
        !            74:   while (!hiteof) {
        !            75:     unsigned char igroup[3], ogroup[4];
        !            76:     int c, n;
        !            77:     
        !            78:     igroup[0] = igroup[1] = igroup[2] = 0;
        !            79:     for (n = 0; n < 3; n++) {
        !            80:       c = *(source++);
        !            81:       offset++;
        !            82:       if (offset > length) {
        !            83:        hiteof = 1;
        !            84:        break;
        !            85:       }
        !            86:       igroup[n] = (unsigned char) c;
        !            87:     }
        !            88:     if (n > 0) {
        !            89:       ogroup[0] = dtable[igroup[0] >> 2];
        !            90:       ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
        !            91:       ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
        !            92:       ogroup[3] = dtable[igroup[2] & 0x3F];
        !            93:       
        !            94:       /* Replace characters in output stream with "=" pad
        !            95:         characters if fewer than three characters were
        !            96:         read from the end of the input stream. */
        !            97:       
        !            98:       if (n < 3) {
        !            99:        ogroup[3] = '=';
        !           100:        if (n < 2) {
        !           101:          ogroup[2] = '=';
        !           102:        }
        !           103:       }
        !           104:       for (i = 0; i < 4; i++) {
        !           105:        buffer_add(b, ogroup[i]);
        !           106:        if (!(b->offset % 72)) {
        !           107:          /* buffer_add(b, '\r'); */
        !           108:          buffer_add(b, '\n');
        !           109:        }
        !           110:       }
        !           111:     }
        !           112:   }
        !           113:   /* buffer_add(b, '\r'); */
        !           114:   buffer_add(b, '\n');
        !           115: }
        !           116: 
        !           117: void base64_decode_xmlrpc(struct buffer_st *bfr, const char *source, int length)
        !           118: {
        !           119:     int i;
        !           120:     int offset = 0;
        !           121:     int endoffile;
        !           122:     int count;
        !           123: 
        !           124:     buffer_new(bfr);
        !           125: 
        !           126:     for (i = 0; i < 255; i++) {
        !           127:        dtable[i] = 0x80;
        !           128:     }
        !           129:     for (i = 'A'; i <= 'Z'; i++) {
        !           130:         dtable[i] = 0 + (i - 'A');
        !           131:     }
        !           132:     for (i = 'a'; i <= 'z'; i++) {
        !           133:         dtable[i] = 26 + (i - 'a');
        !           134:     }
        !           135:     for (i = '0'; i <= '9'; i++) {
        !           136:         dtable[i] = 52 + (i - '0');
        !           137:     }
        !           138:     dtable['+'] = 62;
        !           139:     dtable['/'] = 63;
        !           140:     dtable['='] = 0;
        !           141: 
        !           142:     endoffile = 0;
        !           143: 
        !           144:     /*CONSTANTCONDITION*/
        !           145:     while (1) {
        !           146:        unsigned char a[4], b[4], o[3];
        !           147: 
        !           148:        for (i = 0; i < 4; i++) {
        !           149:            int c;
        !           150:            while (1) {
        !           151:              c = *(source++);
        !           152:              offset++;
        !           153:              if (offset > length) endoffile = 1;
        !           154:              if (isspace(c) || c == '\n' || c == '\r') continue;
        !           155:              break;
        !           156:            }
        !           157: 
        !           158:            if (endoffile) {
        !           159:              /*
        !           160:                if (i > 0) {
        !           161:                     fprintf(stderr, "Input file incomplete.\n");
        !           162:                    exit(1);
        !           163:                }
        !           164:              */
        !           165:                return;
        !           166:            }
        !           167: 
        !           168:            if (dtable[c] & 0x80) {
        !           169:              /*
        !           170:              fprintf(stderr, "Offset %i length %i\n", offset, length);
        !           171:              fprintf(stderr, "character '%c:%x:%c' in input file.\n", c, c, dtable[c]);
        !           172:              exit(1);
        !           173:              */
        !           174:              i--;
        !           175:              continue;
        !           176:            }
        !           177:            a[i] = (unsigned char) c;
        !           178:            b[i] = (unsigned char) dtable[c];
        !           179:        }
        !           180:        o[0] = (b[0] << 2) | (b[1] >> 4);
        !           181:        o[1] = (b[1] << 4) | (b[2] >> 2);
        !           182:        o[2] = (b[2] << 6) | b[3];
        !           183:         i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
        !           184:        count = 0;
        !           185:        while (count < i) {
        !           186:          buffer_add(bfr, o[count++]);
        !           187:        }
        !           188:        if (i < 3) {
        !           189:            return;
        !           190:        }
        !           191:     }
        !           192: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>