PHP/FI Version 2.0

23238a6d

No crypt support compiled into



Пример 5

/* * If mode is non-zero, a salt is expected. * If mode is zero, a pseudo-random salt will be selected. */ void Crypt(int mode) { #if HAVE_CRYPT Stack *s; char salt[8]; char *enc; salt[0] = '\0'; if(mode) { s = Pop(); if(!s) { Error("Stack error in crypt"); return; }

if(s->strval) strncpy(salt,s->strval,2); } s = Pop(); if(!s) { Error("Stack error in crypt"); return; } if(!salt[0]) { salt[0] = 'A' + (time(NULL) % 26); salt[1] = 'a' + (time(NULL) % 26); salt[2] = '\0'; } enc = (char *)crypt(s->strval,salt); #if DEBUG Debug("Crypt returned [%s]\n",enc); #endif Push(enc,STRING); #else Error(" No crypt support compiled into this version"); #endif }

Наиболее важный аспект этой функции - это вызов s = Pop(). Параметры для функции должны быть вытолкнуты из стека выражений один за другим. Когда Вы пишите функцию, которая принимает несколько аргументов, не забывайте, что стек - это структура данных "последним пришел", "первым вышел" . Это означает это, параметры будут выталкиваться из стека в обратном порядке. Последний параметр выталкивается первым. В вышеупомянутом примере мы выясняем, вызвана ли функция с 2 параметрами. Если да, параметр выталкивается из стека и сохраняется. Затем из стека выталкивается следующий параметр. Pop() возвращает указатель на структуру Stack (s). Структура Stack похожа на (из php.h):

/* Expression Stack */ typedef struct Stack { short type; unsigned char *strval; long intval; double douval; VarTree *var; struct Stack *next; } Stack;

Тип type будет один из STRING, LNUMBER или DNUMBER. Strval, intval и douval компоненты - строки, integer и double представления значения соответственно. Если выражение - фактически определенная переменная, компонента var содержит указатель на переменную структуру, которая определяет эту переменную.

В нашей функции Crypt() нас интересует только строковое значение параметра, так что мы используем s->strval. Много функций PHP/FI могут делать различные вещи в зависимости от типа переменной просто проверяя s->type и используя s->strval, s->intval и/или s->douval соответственно.

После вызова реальной функции Crypt() и получения шифрованной строки, наша функции Crypt() вызывает Push(enc, STRING); помещая возвращаемое значение в стек выражений. Нужно отметить, что стек выражений очищается после каждой строки PHP/FI, так что, если Вы помещаете выражения в стек, которые никогда не выталкиваются чем-либо, это не будет иметь значения.

Вызов Debug() в примере Crypt() показывает, как добавить вывод отладочной информации к вашей функции. Debug() - это функция с переменным списком параметров, точно так же как printf.




Содержание раздела