Back to index

php5  5.3.10
Functions | Variables
base64.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "base64.h"

Go to the source code of this file.

Functions

void buffer_new (struct buffer_st *b)
void buffer_add (struct buffer_st *b, char c)
void buffer_delete (struct buffer_st *b)
void base64_encode_xmlrpc (struct buffer_st *b, const char *source, int length)
void base64_decode_xmlrpc (struct buffer_st *bfr, const char *source, int length)

Variables

static const char rcsid [] = "#(@) $Id: base64.c 242949 2007-09-26 15:44:16Z cvs2svn $"
static unsigned char dtable [512]

Function Documentation

void base64_decode_xmlrpc ( struct buffer_st bfr,
const char *  source,
int  length 
)

Definition at line 117 of file base64.c.

{
    int i;
    int offset = 0;
    int endoffile;
    int count;

    buffer_new(bfr);

    for (i = 0; i < 255; i++) {
       dtable[i] = 0x80;
    }
    for (i = 'A'; i <= 'Z'; i++) {
        dtable[i] = 0 + (i - 'A');
    }
    for (i = 'a'; i <= 'z'; i++) {
        dtable[i] = 26 + (i - 'a');
    }
    for (i = '0'; i <= '9'; i++) {
        dtable[i] = 52 + (i - '0');
    }
    dtable['+'] = 62;
    dtable['/'] = 63;
    dtable['='] = 0;

    endoffile = 0;

    /*CONSTANTCONDITION*/
    while (1) {
       unsigned char a[4], b[4], o[3];

       for (i = 0; i < 4; i++) {
           int c;
           while (1) {
             c = *(source++);
             offset++;
             if (offset > length) endoffile = 1;
             if (isspace(c) || c == '\n' || c == '\r') continue;
             break;
           }

           if (endoffile) {
             /*
              if (i > 0) {
                    fprintf(stderr, "Input file incomplete.\n");
                  exit(1);
              }
             */
              return;
           }

           if (dtable[c] & 0x80) {
             /*
             fprintf(stderr, "Offset %i length %i\n", offset, length);
             fprintf(stderr, "character '%c:%x:%c' in input file.\n", c, c, dtable[c]);
             exit(1);
             */
             i--;
             continue;
           }
           a[i] = (unsigned char) c;
           b[i] = (unsigned char) dtable[c];
       }
       o[0] = (b[0] << 2) | (b[1] >> 4);
       o[1] = (b[1] << 4) | (b[2] >> 2);
       o[2] = (b[2] << 6) | b[3];
        i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
       count = 0;
       while (count < i) {
         buffer_add(bfr, o[count++]);
       }
       if (i < 3) {
           return;
       }
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void base64_encode_xmlrpc ( struct buffer_st b,
const char *  source,
int  length 
)

Definition at line 52 of file base64.c.

{
  int i, hiteof = 0;
  int offset = 0;
  int olen;
  
  olen = 0;
  
  buffer_new(b);
  
  /*   Fill dtable with character encodings.  */
  
  for (i = 0; i < 26; i++) {
    dtable[i] = 'A' + i;
    dtable[26 + i] = 'a' + i;
  }
  for (i = 0; i < 10; i++) {
    dtable[52 + i] = '0' + i;
  }
  dtable[62] = '+';
  dtable[63] = '/';
  
  while (!hiteof) {
    unsigned char igroup[3], ogroup[4];
    int c, n;
    
    igroup[0] = igroup[1] = igroup[2] = 0;
    for (n = 0; n < 3; n++) {
      c = *(source++);
      offset++;
      if (offset > length) {
       hiteof = 1;
       break;
      }
      igroup[n] = (unsigned char) c;
    }
    if (n > 0) {
      ogroup[0] = dtable[igroup[0] >> 2];
      ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
      ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
      ogroup[3] = dtable[igroup[2] & 0x3F];
      
      /* Replace characters in output stream with "=" pad
        characters if fewer than three characters were
        read from the end of the input stream. */
      
      if (n < 3) {
       ogroup[3] = '=';
       if (n < 2) {
         ogroup[2] = '=';
       }
      }
      for (i = 0; i < 4; i++) {
       buffer_add(b, ogroup[i]);
       if (!(b->offset % 72)) {
         /* buffer_add(b, '\r'); */
         buffer_add(b, '\n');
       }
      }
    }
  }
  /* buffer_add(b, '\r'); */
  buffer_add(b, '\n');
}

Here is the call graph for this function:

Here is the caller graph for this function:

void buffer_add ( struct buffer_st b,
char  c 
)

Definition at line 32 of file base64.c.

{
  *(b->ptr++) = c;
  b->offset++;
  if (b->offset == b->length) {
    b->length += 512;
    b->data = realloc(b->data, b->length);
    b->ptr = b->data + b->offset;
  }
}

Here is the caller graph for this function:

void buffer_delete ( struct buffer_st b)

Definition at line 43 of file base64.c.

{
  free(b->data);
  b->length = 0;
  b->offset = 0;
  b->ptr = NULL;
  b->data = NULL;
}

Here is the caller graph for this function:

void buffer_new ( struct buffer_st b)

Definition at line 23 of file base64.c.

{
  b->length = 512;
  b->data = malloc(sizeof(char)*(b->length));
  b->data[0] = 0;
  b->ptr = b->data;
  b->offset = 0;
}

Here is the caller graph for this function:


Variable Documentation

unsigned char dtable[512] [static]

Definition at line 21 of file base64.c.

const char rcsid[] = "#(@) $Id: base64.c 242949 2007-09-26 15:44:16Z cvs2svn $" [static]

Definition at line 1 of file base64.c.