Rafik Bari
Rafik Bari

Reputation: 5037

How to see the source code / content of a built in function in PHP?

Is there an easy way in PHP to figure out the source code/content of a built in function?

Say for example I want to know what base64_decode() actually does to the given encoded base64 string to convert it to a plain text. How can I achieve this?

Upvotes: 0

Views: 840

Answers (1)

Populus
Populus

Reputation: 7680

You can browse the source code of PHP here

In your case base64_decode is implemented here (PHP 5.6.0)

Note: This code is in C since that's what PHP is written in. In fact all built-in functions and extensions of PHP are written in C.

PHPAPI unsigned char *php_base64_decode_ex(const unsigned char *str, int length, int *ret_length, zend_bool strict) /* {{{ */
{
    const unsigned char *current = str;
    int ch, i = 0, j = 0, k;
    /* this sucks for threaded environments */
    unsigned char *result;

    result = (unsigned char *)safe_emalloc(length, 1, 1);

    /* run through the whole string, converting as we go */
    while ((ch = *current++) != '\0' && length-- > 0) {
        if (ch == base64_pad) {
            if (*current != '=' && ((i % 4) == 1 || (strict && length > 0))) {
                if ((i % 4) != 1) {
                    while (isspace(*(++current))) {
                        continue;
                    }
                    if (*current == '\0') {
                        continue;
                    }
                }
                efree(result);
                return NULL;
            }
            continue;
        }

        ch = base64_reverse_table[ch];
        if ((!strict && ch < 0) || ch == -1) { /* a space or some other separator character, we simply skip over */
            continue;
        } else if (ch == -2) {
            efree(result);
            return NULL;
        }

        switch(i % 4) {
        case 0:
            result[j] = ch << 2;
            break;
        case 1:
            result[j++] |= ch >> 4;
            result[j] = (ch & 0x0f) << 4;
            break;
        case 2:
            result[j++] |= ch >>2;
            result[j] = (ch & 0x03) << 6;
            break;
        case 3:
            result[j++] |= ch;
            break;
        }
        i++;
    }

    k = j;
    /* mop things up if we ended on a boundary */
    if (ch == base64_pad) {
        switch(i % 4) {
        case 1:
            efree(result);
            return NULL;
        case 2:
            k++;
        case 3:
            result[k] = 0;
        }
    }
    if(ret_length) {
        *ret_length = j;
    }
    result[j] = '\0';
    return result;
}

Upvotes: 3

Related Questions