Пишу на Ц парсер для переменных окружения и стандартного ввода — аналог функций 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); }
Как бы написать парсер вообще и конвертер в частности.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
decvar постал в «Помойке программистов» неплохую подборку примеров по работе со строками:
http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=trash;action=display;num=1092217096
посмотри.
А еще я тебе по-дружески скажу, только ты не обижайся, ладно? Язык, который ты Ц называешь, он вообще-то «Си». И это очень удобный и красивый язык, именно поэтому на нем за 30 лет написано огромное множество полезных программ.
Ты его не знаешь. Если ты знаешь PHP (который «Пи-Эйч-Пи», а не «Пэ-Хэ-Пэ»), или ассемблер, это не значит, что ты автоматически знаешь все другие языки. Так вот, твое раздражение происходит оттого, что ты языка С не знаешь, а пытаешься на нем писать. Так ты его изучи, это не так сложно. А твои подколки выглядят совсем не круто.
А по поводу перевода с PHP на C, первая заповедь переводчика (человеческих языков) — ты должен очень хорошо знать язык на который ты переводишь, и неплохо тот, с которого переводишь.
Good Luck,
UT