nixp.ru v3.0

18 октября 2017,
среда,
08:50:39 MSK

DevOps с компанией «Флант»
My-SQL написал 5 января 2005 года в 03:53 (613 просмотра) Ведет себя неопределенно; открыл 4 темы в форуме, оставил 1 комментарий на сайте.

Пишу на Ц парсер для переменных окружения и стандартного ввода — аналог функций GET и POST на PHP.

Ощущение, что обработка строк на Ц почти аналогична ходьбе на руках — в принципе возможно, но крайне неудобно.

Или приём пищи хоккейными клюшками. Причём на вытянутых руках.

Предстваляю какая чехарда начинается при вызове библиотечной функции — поиск и подгрузка с диска нужного *.so, поиск точки входа и тп.

На Асме такого бардака стараться больно долго. Оптимизирующим компиляторам и не снилось какой красивый код руками можно написать.

В общем пишу прогу разбирающую урлу на переменные со значениями. Наверняка кто-то где-то такое уже делал, но я не нашел.

Если кто знает где искать — подскажите. Меньше мучаться буду.

А тут ещё совсем неестетсвенная проблема — написать конвертер — из байта делать байт.

Причём не какие-то там кодировки или шифрование. Всё тривиально. Нужно байт интерпретируемый (ой блин, компилируемый)

как целое бесзнаковое число считать символом — просто MOV. В терминах Ц (если он вдруг числа хранит как строки) функция ITOA.

Но такой во всяких инклюдах с либами на FreeBSD 5.1 на нашёл. Обратная функция есть, и вообще, и в коде.

И писать её приходится только потому, что когда ненадо Ц мешает обрабатывать данные, типо заботится о целостности.

А когда надо бы проверять хотябы границы массива, плюёт с высокой колокольни.

А ведь наверняка рядом с переменной есть структура, в которой хранится и тип и размер. Надо только поменять тип.

Да… на лирику потянуло. Спать надо больше. Итак заготовка:

// gcc -L/usr/local/lib/mysql -lmysqlclient -lz -lcrypt -lm -L/usr/lib -lssl -lcrypto -o get_vars get_vars.c

#include

#include

#include

#include

char Query[100], *String, *Mail_user, *Mail_old_password, *Mail_new_password, *Mail_new_password1, *ErrorMessage;

int Pay, Result; //mysql_real_query();

unsigned long i;

unsigned long String_Length;

char *Variable, *Value, *Write_Symbol, Symbol[1]; //Read_Symbol

unsigned int Character, Read_Symbol;

//unsigned int ITOA (unsigned int iNteger) {unsigned int cHaracter; unsigned int hUndreds, tEns, oNes;

char ITOA (unsigned int iNteger) { char cHaracter; unsigned int hUndreds, tEns, oNes;

hUndreds%=iNteger/100; iNteger=iNteger-hUndreds*100;

tEns%=iNteger/10; oNes=iNteger-tEns*10;

// cHaracter=hUndreds*100+tEns*10+oNes;

cHaracter=(hUndreds-’0\′)*100+(tEns-’0\′)*10+(oNes-’0\′);

return(cHaracter); }

int main (int argc, char **argv) { setvbuf (stdout, NULL, _IONBF, 0);

String = getenv («CONTENT_LENGTH»); String = getenv («SHLVL»); i=atoi(String);

//printf(«String=%s\n»,String); printf(«i=%d\n»,i);

//Read_Symbol=205; Character=ITOA(Read_Symbol); printf(«rs=%d\n»,Character);

//Read_Symbol=205; Write_Symbol=ITOA(Read_Symbol); printf(«rs=%d\n»,Write_Symbol);

Read_Symbol=205; Symbol[0]=ITOA(Read_Symbol); printf(«rs=%d\n»,Symbol[0]);

String = getenv («CLIENT_IP»); String = getenv («QUERY_STRING»); String = getenv («PATH»);

String_Length=strlen(String);

for (i=0; i

//Write_Symbol=Read_Symbol;

/*

if (Read_Symbol>32 && Read_Symbol<50) {printf(«F*ck\n»);}

Character=atoi(&Read_Symbol);

Symbol[0]=Read_Symbol;

Write_Symbol=«64»;

Character=atoi(Write_Symbol);

Character=atoi(«Z»); //Symbol[0]); //Write_Symbol=Character; //Write_Symbol=«1»;

if (Read_Symbol==«+») {Write_Symbol=» »;}

printf («%d»,Character); //printf («%s»,Character); Segmentation fault (core dumped)

printf («%s»,Write_Symbol);

putchar(Write_Symbol);

Symbol[0]=Read_Symbol; printf (&Symbol[0]); //Write_Symbol=Symbol; trash output

Character=atoi(Symbol); Write_Symbol=«1»; //Write_Symbol=itoa(Character); itoa==unknown function

sprintf ( Symbol, «%s», &Read_Symbol ); //printf (Symbol); each symbol appends «`»

strcpy (Write_Symbol, **Read_Symbol);

char* strcat(char* dest, const char* source);

sprintf(Query,"select password from %s where login=’%s’\n»,Table,User);

strcat(Query, Table);

printf(«String=%s\n»,String); String=strchr (String,’:');

if ((String=strchr (String,’:'))) { String++;} //skip element

printf(«String=%s\n»,String);

i=666; printf(«i=%d\n»,i); sprintf (Query,«%d», i); printf(«Query=%s\n»,Query);

i=atoi(Query); printf(«i=%d\n»,i);

*/

} exit(0); }

Как бы написать парсер вообще и конвертер в частности.

Uncle Theodore

decvar постал в «Помойке программистов» неплохую подборку примеров по работе со строками:

http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=trash;action=display;num=1092217096

посмотри.

А еще я тебе по-дружески скажу, только ты не обижайся, ладно? Язык, который ты Ц называешь, он вообще-то «Си». И это очень удобный и красивый язык, именно поэтому на нем за 30 лет написано огромное множество полезных программ.

Ты его не знаешь. Если ты знаешь PHP (который «Пи-Эйч-Пи», а не «Пэ-Хэ-Пэ»), или ассемблер, это не значит, что ты автоматически знаешь все другие языки. Так вот, твое раздражение происходит оттого, что ты языка С не знаешь, а пытаешься на нем писать. Так ты его изучи, это не так сложно. А твои подколки выглядят совсем не круто.

А по поводу перевода с PHP на C, первая заповедь переводчика (человеческих языков) — ты должен очень хорошо знать язык на который ты переводишь, и неплохо тот, с которого переводишь.

Good Luck,

UT