head 4.1; access; symbols xcodefinal:1.14; locks; strict; comment @ * @; 4.1 date 2004.02.04.05.32.13; author mamont; state Exp; branches; next 4.0; 4.0 date 2003.12.20.23.11.12; author mamont; state Exp; branches; next 3.7; 3.7 date 2003.10.05.18.35.21; author mamont; state Exp; branches; next 3.6; 3.6 date 2003.10.05.00.15.24; author mamont; state Exp; branches; next 3.5; 3.5 date 2003.10.04.23.26.25; author mamont; state Exp; branches; next 3.4; 3.4 date 2003.10.04.23.02.54; author mamont; state Exp; branches; next 3.3; 3.3 date 2003.09.27.18.37.05; author mamont; state Exp; branches; next 3.2; 3.2 date 2003.09.27.18.35.43; author mamont; state Exp; branches; next 3.1; 3.1 date 2003.09.27.18.28.26; author mamont; state Exp; branches; next 3.0; 3.0 date 2003.04.03.20.00.35; author mamont; state Exp; branches; next 2.10; 2.10 date 2003.04.03.19.47.12; author mamont; state Exp; branches; next 2.9; 2.9 date 2003.03.31.15.46.49; author mamont; state Exp; branches; next 2.8; 2.8 date 2003.03.26.02.17.16; author mamont; state Exp; branches; next 2.7; 2.7 date 2003.03.26.02.14.13; author mamont; state Exp; branches; next 2.6; 2.6 date 2003.03.10.17.36.26; author mamont; state Exp; branches; next 2.5; 2.5 date 2003.03.10.17.30.05; author mamont; state Exp; branches; next 2.4; 2.4 date 2003.03.09.01.42.47; author mamont; state Exp; branches; next 2.3; 2.3 date 2003.03.08.19.57.28; author mamont; state Exp; branches; next 2.2; 2.2 date 2003.03.08.19.33.27; author mamont; state Exp; branches; next 2.1; 2.1 date 2003.03.08.19.25.05; author mamont; state Exp; branches; next 2.0; 2.0 date 2003.03.08.19.23.31; author mamont; state Exp; branches; next 1.14; 1.14 date 2003.03.08.19.13.24; author mamont; state Exp; branches; next 1.13; 1.13 date 2003.03.08.16.24.13; author mamont; state Exp; branches; next 1.12; 1.12 date 2003.03.08.16.17.35; author mamont; state Exp; branches; next 1.11; 1.11 date 2003.03.08.16.15.45; author mamont; state Exp; branches; next 1.10; 1.10 date 2002.05.03.23.29.31; author dvk24; state Exp; branches; next 1.9; 1.9 date 2002.05.03.23.25.49; author dvk24; state Exp; branches; next 1.8; 1.8 date 2002.05.03.23.21.16; author dvk24; state Exp; branches; next 1.7; 1.7 date 2002.05.03.21.45.15; author dvk24; state Exp; branches; next 1.6; 1.6 date 2002.04.11.15.07.21; author mamont; state Exp; branches; next 1.5; 1.5 date 2002.04.11.14.58.53; author mamont; state Exp; branches; next 1.4; 1.4 date 2002.04.03.18.16.49; author mamont; state Exp; branches; next 1.3; 1.3 date 2002.04.03.17.47.14; author mamont; state Exp; branches; next 1.2; 1.2 date 2002.04.03.16.56.55; author mamont; state Exp; branches; next 1.1; 1.1 date 2002.03.17.21.23.54; author mamont; state Exp; branches; next ; desc @@ 4.1 log @Добавлен переключатель -c, позволяющий определять кодировку файла и выдавать её на экран. Полная справка по -H содержит инструкции по применению этой новой возможности. При корректном использовании переключателя -c программа выходит с кодом ошибки 6 --- ERROR_INFORM_ENCODING. @ text @/* Russian encodings with care to letter YO from www.rusf.ru/books/yo */ /* Written in 2002--2004 by D.V.Khmelev */ /* !!!!!!!!!!!! BEFORE COMPILATION !!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* Please #define D_ALT for messages in cp866 */ /* Please #define D_WIN for messages in cp12151 */ /* Please #define D_KOI for messages in koi8-r */ /* You can also pass their definitions through compiler command line */ /* gcc -DD_KOI xcode.c -o xcode #GNU C compiler */ /* bcc.exe -DD_ALT xcode.c #Borland C compiler */ // Выходная кодировка по умолчанию // Output encoding by default #define __ENCLINE__ __LINE__ //#define D_ALT //#define D_WIN //#define D_KOI //#define D_ISO //#define D_MAC #ifdef D_ALT # define OUTPUT_ENC 0 // либо "альтернативная" (т.е. досовская) //either cp866 #elif defined(D_WIN) # define OUTPUT_ENC 1 // win=cp1251 #elif defined(D_KOI) # define OUTPUT_ENC 2 // либо "KOI". // or koi8 #elif defined(D_ISO) # define OUTPUT_ENC 3 // iso #elif defined(D_MAC) # define OUTPUT_ENC 4 // mac #else # error Please #define default output encoding D_ALT D_WIN D_KOI D_ISO D_MAC #endif #if defined(__MSDOS__) || defined(_WIN32) || defined(WIN32)|| defined(__WIN32__) || defined(__TURBOC__) #define STDOUT_PROBLEM_DOS 1 #endif #if defined(__MINGW__) #define STDOUT_PROBLEM_MINGW 2 #endif // Change Log: // $Log: xcode.c,v $ // Revision 4.0 2003/12/20 23:11:12 mamont // Добавлен ключ -d для определения // двойной перекодировки. Смена номера // версии на 4.0 // // Revision 3.7 2003/10/05 18:35:21 mamont // Исправлен глюк, возникавший при вызове // xcode in out // с отсутствующим файлом out (выдавалась // ошибка). // // Revision 3.6 2003/10/05 00:15:24 mamont // Заработал прозрачно бинарный стандартный // ввод/вывод под ДОС-окном. Версию mingw // не проверял, но, по идее тоже должна работать. // // Revision 3.5 2003/10/04 23:26:25 mamont // Теперь stdout устанавливается в бинарный // режим в DOS/WIN окружении. Иначе // добавлялся код \x0D в конце каждой // строки (\x0D\x0A). // // Revision 3.4 2003/10/04 23:02:54 mamont // Исправлена ошибка в выдаче диагностики // в предыдущей версии. // // Добавлены дополнительные коды выхода // (см. xcode -H, раздел КОДЫ ВЫХОДА) // // Добавлен переключатель --, по которому // прерывается разбор командной строки. // // Добавлено сообщение об ошибке в аргументах // программы, ежели такая просходит. // // Revision 3.3 2003/09/27 18:37:05 mamont // переформатировал комментарии // // Revision 3.2 2003/09/27 18:35:43 mamont // Совсем забыл: теперь программа выходит // с ненулевым кодом при какой-либо ошибке. // Сами ошибки можно посмотреть в тексте: // E_OK и т.д. // // Revision 3.1 2003/09/27 18:28:26 mamont // Теперь опции вида /h допустимы только при // выходной кодировке D_ALT // // По опции "--" сканирование аргументов // останавливается. Следующие аргументы // рассматриваются как имена файлов. // // Revision 3.0 2003/04/03 20:00:35 mamont // Смена версии на 3.0 // команда: ci -f3.0 xcode.c // // Revision 2.10 2003/04/03 19:47:12 mamont // Поправлена ошибка в кодировке "mac", на которую // любезно указал Сергей Скотников (неверный код // буквы ``я''). Используемая библиотека // перестановочной перекодировки с // http://www.rusf.ru/books/yo/encoding.html получила // название SRECODE.C и явно выделена в тексте // программы комментариями. // // Revision 2.9 2003/03/31 15:46:49 mamont // Текст приведён к стандарту C99 (по модулю предупреждений о конвертации // между знаковыми/беззнаковыми буквами). Бороться с этим можно явным // заданием преобразования указателей, но не нужно в силу усложнения // кода. // // Revision 2.8 2003/03/26 02:17:16 mamont // Поправлено предупреждение "suspicious pointer conversion" // // Revision 2.7 2003/03/26 02:14:13 mamont // Добавлено декодирование html-Уникоденных текстов // (вроде Дима) // // Revision 2.6 2003/03/10 17:36:26 mamont // Информация о режиме silent добавленая в справку // // Revision 2.5 2003/03/10 17:30:05 mamont // Добавлен режим silent по опции -s // // Revision 2.4 2003/03/09 01:42:47 mamont // Исправлено неправильное поведение при одном имени файла // // Revision 2.3 2003/03/08 19:57:28 mamont // Теперь программа компилируется bc 3.1 без предупреждений и ошибок. // // Revision 2.2 2003/03/08 19:33:27 mamont // Режим трубы теперь по умолчанию только в Досе/Виндах. (Дос/Win // определяется по переключателю D_ALT) // // Revision 2.1 2003/03/08 19:25:05 mamont // *** empty log message *** // // Revision 2.0 2003/03/08 19:23:31 mamont // Смена номера версии на 2.0 // // Revision 1.14 2003/03/08 19:13:24 mamont // Значительные улучшения по сравнению с предыдущей версией. Теперь // имеется опция с трубой -p, а под Досовской консолью по умолчанию // программа выводит краткую помощь. // // Если входная кодировка уже указана, то программа не определяет её // автоматически, а сразу производит перекодировку. Единственный тонкий // момент: когда надо перекодировать файл на месте. В этом случае // используется временный файл на диске, как и всегда. // // Revision 1.13 2003/03/08 16:24:13 mamont // Добавил Revision // // Revision 1.12 2003/03/08 16:17:35 mamont // Начат лог изменений // #include #include #include #include #include #include #ifdef STDOUT_PROBLEM_DOS #include #include #endif//STDOUT_PROBLEM_DOS #define XCODE "xcode" #define REVISION "$Revision: 4.0 $" static char * VERSIONR=REVISION; static char VERSION[100];//=VERSIONR+11 #define SELF_URL_BASE "http://www.rusf.ru/books/yo" #define SELF_URL SELF_URL_BASE "/src/xcode.c" /* Library SRECODE.C (Shuffle RECODE) ver. 1.0 * Автор кода: Д.В.Хмелёв, Март 2002--апрель 2003 * Подробности: http://www.rusf.ru/books/yo * Подпрограммы на языке Си, обеспечивающие * перестановочную перекодировку 14 кодировок * русских букв друг в друга. * Functions for Perl, providing exchange * transformation of 14 russian encodings to * each other. * Следующий код является Ё-ware, Именно, его можно * свободно распространять модифицировать, и даже * дизассемблировать как в двоичном виде, так и в * исходном тексте. Однако, используя этот код, вы * должны использовать букву Ё во всех текстах, * которые набираете на компьютерах: начиная с * электронных писем и заканчивая крупной * прозаической формой. * Автор воздерживается от всяческих гарантий * надёжности кода и снимает с себя ответственность * за возможную потерю данных при его * использовании. Тем не менее, автор постарался * сделать всё возможное, чтобы потери данных можно * было избежать. * Written by D.V. Khmelev, March 2002 -- April 2003 * More information at http://www.rusf.ru/books/yo * The following code is YO-ware. YO-ware means that * you can freely copy, modify and disassemble it in * binary and/or source text. However, if you use * this program code, you should use Russian letter * YO in all texts in Russian you type in computer * from e-mails to novels. * The author disclaims any responsibility for code * safety and holds no responsibility for the loss of * data, resulting the the use of the following * code. However, the author tried to do his best to * avoid loss of data. */ typedef enum { CP866=0, CP1251, KOI8_R, ISO8859_5, MAC, OSN, MOSHKOV, SORT, ALT_FIDO, KOI7, DKOI, CP500, EBCDIC, ASCII, TOTAL_ENCODING_NUMBER} encoding_t; char * encoding_name[]={ "cp866", /* CP866 */ "cp1251", /* CP1251 */ "koi8-r", /* KOI8_R */ "iso8859-5", /* ISO8859_5 */ "mac", /* MAC */ "osn", /* OSN */ "moshkov", /* MOSHKOV */ "sort", /* SORT */ "alt-fido", /* ALT_FIDO */ "koi7", /* KOI7 */ "dkoi", /* DKOI */ "cp500", /* CP500 */ "ebcdic", /* EBCDIC */ "ascii", /* ASCII */ }; unsigned char * encoding_alphabet[]={ /* CP866 */ (unsigned char*) "\240\241\242\243\244\245\361\246\247\250" "\251\252\253\254\255\256\257\340\341\342" "\343\344\345\346\347\350\351\352\353\354" "\355\356\357" "\200\201\202\203\204\205\360\206\207\210" "\211\212\213\214\215\216\217\220\221\222" "\223\224\225\226\227\230\231\232\233\234" "\235\236\237", /* CP1251 */ (unsigned char*) "\340\341\342\343\344\345\270\346\347\350" "\351\352\353\354\355\356\357\360\361\362" "\363\364\365\366\367\370\371\372\373\374" "\375\376\377" "\300\301\302\303\304\305\250\306\307\310" "\311\312\313\314\315\316\317\320\321\322" "\323\324\325\326\327\330\331\332\333\334" "\335\336\337", /* KOI8_R */ (unsigned char*) "\301\302\327\307\304\305\243\326\332\311" "\312\313\314\315\316\317\320\322\323\324" "\325\306\310\303\336\333\335\337\331\330" "\334\300\321" "\341\342\367\347\344\345\263\366\372\351" "\352\353\354\355\356\357\360\362\363\364" "\365\346\350\343\376\373\375\377\371\370" "\374\340\361", /* ISO8859_5 */ (unsigned char*) "\320\321\322\323\324\325\361\326\327\330" "\331\332\333\334\335\336\337\340\341\342" "\343\344\345\346\347\350\351\352\353\354" "\355\356\357" "\260\261\262\263\264\265\241\266\267\270" "\271\272\273\274\275\276\277\300\301\302" "\303\304\305\306\307\310\311\312\313\314" "\315\316\317", /* MAC */ (unsigned char*) "\340\341\342\343\344\345\336\346\347\350" "\351\352\353\354\355\356\357\360\361\362" "\363\364\365\366\367\370\371\372\373\374" "\375\376\337" "\200\201\202\203\204\205\335\206\207\210" "\211\212\213\214\215\216\217\220\221\222" "\223\224\225\226\227\230\231\232\233\234" "\235\236\237", /* OSN */ (unsigned char*) "\320\321\322\323\324\325\361\326\327\330" "\331\332\333\334\335\336\337\340\341\342" "\343\344\345\346\347\350\351\352\353\354" "\355\356\357" "\260\261\262\263\264\265\360\266\267\270" "\271\272\273\274\275\276\277\300\301\302" "\303\304\305\306\307\310\311\312\313\314" "\315\316\317", /* MOSHKOV */ (unsigned char*) "\341\342\367\347\344\345\243\366\372\351" "\352\353\354\355\356\357\360\362\363\364" "\365\346\350\343\376\373\375\256\371\370" "\374\340\361" "\301\302\327\307\304\305\263\326\332\311" "\312\313\314\315\316\317\320\322\323\324" "\325\306\310\303\336\333\335\254\331\330" "\334\300\321", /* SORT */ (unsigned char*) "\241\242\243\244\245\246\247\250\251\252" "\253\254\255\256\257\260\261\262\263\264" "\265\266\267\270\271\272\273\274\275\276" "\277\300\301" "\200\201\202\203\204\205\206\207\210\211" "\212\213\214\215\216\217\220\221\222\223" "\224\225\226\227\230\231\232\233\234\235" "\236\237\240", /* ALT_FIDO */ (unsigned char*) "\240\241\242\243\244\245\361\246\247\250" "\251\252\253\254\255\256\257\160\341\342" "\343\344\345\346\347\350\351\352\353\354" "\355\356\357" "\200\201\202\203\204\205\360\206\207\210" "\211\212\213\214\110\216\217\220\221\222" "\223\224\225\226\227\230\231\232\233\234" "\235\236\237", /* KOI7 */ (unsigned char*) "\101\102\127\107\104\105\43\126\132\111" "\112\113\114\115\116\117\120\122\123\124" "\125\106\110\103\136\133\135\137\131\130" "\134\100\121" "\141\142\167\147\144\145\44\166\172\151" "\152\153\154\155\156\157\160\162\163\164" "\165\146\150\143\176\173\175\42\171\170" "\174\140\161", /* DKOI */ (unsigned char*) "\167\170\257\215\212\213\131\256\262\217" "\220\232\233\234\235\236\237\252\253\254" "\255\214\216\200\266\263\265\267\261\260" "\264\166\240" "\271\272\355\277\274\275\102\354\372\313" "\314\315\316\317\332\333\334\336\337\352" "\353\276\312\273\376\373\375\165\357\356" "\374\270\335", /* CP500 */ (unsigned char*) "\254\151\355\356\353\357\111\354\277\200" "\375\376\373\374\255\256\131\104\105\102" "\106\103\107\234\110\124\121\122\123\130" "\125\126\127" "\220\217\352\372\276\240\252\266\263\235" "\332\233\213\267\270\271\253\144\145\142" "\146\143\147\236\150\164\161\162\163\170" "\165\166\167", /* EBCDIC */ (unsigned char*) "\237\240\252\253\254\255\335\256\257\260" "\261\262\263\264\265\266\267\270\271\272" "\273\274\275\276\277\312\313\314\315\316" "\317\332\333" "\130\131\142\143\144\145\102\146\147\150" "\151\160\161\162\163\164\165\166\167\170" "\200\212\213\214\215\216\217\220\232\233" "\234\235\236", /* ASCII */ (unsigned char*) "\141\142\167\147\144\145\136\166\172\151" "\152\153\154\155\156\157\160\162\163\164" "\165\146\150\143\75\133\135\43\171\170" "\134\140\161" "\101\102\127\107\104\105\46\126\132\111" "\112\113\114\115\116\117\120\122\123\124" "\125\106\110\103\53\173\175\44\131\130" "\174\176\121", }; int *full_encoding_list(encoding_t encoding, int table[]){ int i,j; static int exists[256]; for(i=0;i<256;i++) exists[i]=0; for(i=0;i<66;i++) { table[i]=encoding_alphabet[encoding][i]; exists[table[i]]=1; } for(j=66,i=0;i<256;i++){ if(exists[i]) continue; table[j++]=i; } return table; } int *fill_recode_table(int table[], encoding_t from, encoding_t to){ static int full_enc_from[256]; static int full_enc_to[256]; int i; full_encoding_list(from,full_enc_from); full_encoding_list(to,full_enc_to); for(i=0;i<256;i++) table[full_enc_from[i]]=full_enc_to[i]; return table; } unsigned char *srecode(unsigned char *s, encoding_t from, encoding_t to){ static int prev_from=-1, prev_to=-1; static int recode_table[256]; int i; if((from!=prev_from)||(to!=prev_to)){ prev_from=from; prev_to=to; fill_recode_table(recode_table,from,to); } for(i=0;s[i];i++) s[i]=recode_table[s[i]]; return s; } unsigned char *srecode2(unsigned char *s, unsigned char *t, encoding_t from, encoding_t to){ static int prev_from=-1, prev_to=-1; static int recode_table[256]; int i; if((from!=prev_from)||(to!=prev_to)){ prev_from=from; prev_to=to; fill_recode_table(recode_table,from,to); } for(i=0;t[i];i++) s[i]=recode_table[t[i]]; s[i]=0; return s; } /* конец кода библиотеки SRECODE.C * * end of the code of the library SRECODE.C */ /*************************************************/ /**** ERROR_LIST ********/ /*************************************************/ // Внимание!!! Программа возвращает 0 тогда и только тогда, когда // успешно перекодировала файл (т.е. сделала то, для чего // предназначена). Выдача версии, или справки рассматриваются как // ошибки: такого при использовании в пакетном режиме происходить не // должно. // Список введён по просьбе Владислава Носова (nvv@@mail^primorye^ru) enum{ ERROR_OK=0, ERROR_VERSION, ERROR_HELP, ERROR_DESCRIPTION, ERROR_NO_ARGUMENT, ERROR_WRONG_ARGUMENT, ERROR_INFORM_ENCODING, ERROR_SERIOUS=16, ERROR_INTERNAL=ERROR_SERIOUS, ERROR_MALLOC, ERROR_STAT_FILE, ERROR_EMPTY_FILE, ERROR_OPEN_FILE_READ, ERROR_OPEN_FILE_WRITE, ERROR_OPEN_FILE_TMP, ERROR_WRITE_FILE, }; #define NUMCOD 5 char encLetter[]={'a','w','k','i','m'}; int enc=OUTPUT_ENC; int program_output_encoding=OUTPUT_ENC; int Russian=1; unsigned char *alphabet= "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; int self_encoding=2; // по умолчанию --- собственная кодировка есть koi void determine_self_encoding(char *selfname){ for(self_encoding=0; self_encoding=16.\n" "In future versions other exit codes might be added, but current shall\n" "not be changed." "\n" " THE TABLE OF EXIT CODES:\n" , /* msg_encodings */ "OTHER SWITCHES\n" "\n" "Switch -- stops parsing command line arguments and further parameters\n" "are considered as filenames (this way you can work with files, whose\n" "name begins with dash sign - ;).\n" "\n" "Switch -с changes xcode to the state of informing about encoding\n" "of the input. The program prints to output file the following string\n" " encoding: name_of_input_file\n" "If standard input was used, then the name of input file is <>.\n" "Combination with -d leads to printing 3 encodings: \n" " from->to, result: имя_входного_файла\n" "where 'from->to' is the recommended transform to get the file suggestively\n" "in encoding 'result'.\n" "Using -c automatically implies -s, i.e. the information on encodings\n" "is not duplicated to standard errors stream.\n" "In order to view encodings of html-files in current directory\n" "under bash in GNU type in the following one-comman-line script:\n" " for f in *.html; do xcode -c $f; done\n" "To carry out the similar action in file manager Far under Win32 (and in\n" "all other childs of Commander Norton), select files, press Ctrl-G, and\n" "type in command\n" " xcode -c !.!\n" "\n" "The following switches could be used for input " "and output encoding. \nHowever, " "automatic recognition is supported for first 5 encodings only.\n" "More information can be found at \n" " " SELF_URL_BASE "/xcode.html\n", /* msg_version */ "Program "XCODE" version %s written by D.V.Khmelev\n" "(see http://www.rusf.ru/books/yo/xcode.html for details)\n" "\n" "The author disclaims any responsibility for program\n" "safety and holds no responsibility for the loss of\n" "data, resulting the the use of the program.\n" "However, the author tried to do his best to\n" "avoid loss of data.\n", /* msg_help */ "Usage: " XCODE" -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " "[in [out]]\n" "-E -h in English (don't forget to add -h or -H switch!)\n" "-v print version information\n" "-H manual, list of 14 encodings supported, and view YO-ware license\n" "-d double recoding (try if simple '"XCODE"' failed)\n" "-q quoted-printable decoding (useful for decoding MIME-files)\n" "-l decode html Unicoded text (like Дима)\n" "-c determine encoding and print it to the output (see details by -H)\n" "-t do unix2dos transformation (convert LF to CR/LF) in DOS/Win only\n" "-p pipe mode (applies to DOS/Win environment only)\n" "-s silent mode (no information on encodings displayed)\n" "If input/output files are not specified, the standard input/output is used.\n", /* msg_out */ "-%c to set %-10s output", /* msg_forc */ "+%c to force %-10s input\n", /* msg_defl */ " (default)\n", /* msg_info */ "-%d to set %-10s output +%d to set %-10s input\n", /* msg_err_temp_file */ "Unable to create temporary file. No free space on disk?\n", /* msg_guessinp */ "Guessed input encoding: %s\n", /* msg_forceinp */ "Forced input encoding: %s\n", /* msg_outpenc */ "Output encoding: %s\n", /* msg_double_recode */ "Double recode: %s->%s, %s->%s\n", /* msg_erropenfile */ "Unable to open output file %s\n", /* msg_err_in_file */ "Unable to open input file %s\n", /* msg_cant_write_temp_file */ "Can't write to temporary file. Disk full?\n", /* msg_pipe */ "To use pipe mode run the program with option -p\n", /* msg_tryhelp */ "Try `xcode -e -h' for more information.\n", /* msg_uni_qp */ "You can not use -q and -l switches simultaneously.\n" "Try pipe 'xcode -l|xcode -q' to get desired result.\n", /* msg_conflict_force_inform */ "You can not use -c and any of -l, +[awikm] or +1, +2, ...\n" "switches simultaneously.\n", /* msg_wrong_argument */ "*** ERROR IN A PROGRAM ARGUMENT ***\n", }; char *msgs_rus[]={ /* msg_descr */ "(Основано на программе, которую написал Андрей В. Лукьянов 14.05.1997,\n" "и которую потом правили Кирилл Ротмистровский и Игорь В. Красиков)\n" "\n" "ОПИСАНИЕ\n" "\n" "Эта программа автоматически определяет кодировку входного\n" "документа и преобразует документ в кодировку, Вам нужную.\n" "Важной особенностью программы является взаимно однозначная перекодировка,\n" "которая предохраняет от повреждений Ваш файл. Если преобразование прошло\n" "некорректно, или даже если вы преобразовали двоичный файл, Вы всегда можете\n" "ВОССТАНОВИТЬ исходный файл обратным преобразованием (если, конечно, Вы\n" "не воспользовались дополнительными опциями -l, -q или -t).\n" "\n" "ЛИЦЕНЗИЯ\n" "\n" "Программа является Ё-ware, Именно, её можно свободно распространять\n" "модифицировать, и даже дизассемблировать как в двоичном виде, так и в\n" "исходном тексте. Однако, используя эту программу, вы должны\n" "использовать букву Ё во всех текстах, которые набираете на компьютерах:\n" "начиная с электронных писем и заканчивая крупной прозаической формой.\n" "\n" "КОДЫ ВЫХОДА\n" "\n" "Программа выходит с кодом 0 только при условии, что она\n" "действительно выполнила то, для чего предназначалась: перекодировала\n" "файл. Во всех остальных случаях код возврата ненулевой.\n" "В частности, выдача подсказки возвращает ненулевой код ERROR_HELP.\n" "Ошибки, связанные со взаимодействием с операционной системой имеют\n" "код >=16. В будущих версиях могут добавляться другие коды выхода, но\n" "текущие изменяться не будут." "\n" " ТАБЛИЦА КОДОВ ВЫХОДА:\n" , /* msg_encodings */ "ДРУГИЕ ПЕРЕКЛЮЧАТЕЛИ\n" "\n" "Переключатель -- останавливает разбор аргументов командной строки\n" "и следующие параметры рассматриваются уже как имена файлов.\n" "(таким образом можно обрабатывать файлы, названия которых начинаются\n" "со знака дефиса - ;)\n" "\n" "Переключатель -с переводит xcode в режим выдачи информации о кодировке\n" "файла. Программа тогда выдаёт в выходной файл строку вида\n" " кодировка: имя_входного_файла\n" "Если использовался стандартный ввод, то имя входного файла <>.\n" "При комбинировании с -d выдаётся 3 кодировки: \n" " from->to, result: имя_входного_файла\n" "где from->to --- рекомендуемое преобразование, чтобы получить файл\n" "предположительно в кодировке result.\n" "Использование переключателя -c приводит к включению переключателя -s,\n" "т.е. информация о кодировках в поток ошибок не дублируется.\n" "Для просмотра информации о кодировке html-файлов в текущей директории\n" "под bash в GNU наберите следующий скрипт в командной строке:\n" " for f in *.html; do xcode -c $f; done\n" "Для выполнения аналогичной задачи в файловом менеджере Far под Win32\n" "(и прочих детях командира Нортона), выделите файлы, нажмите Ctrl-G и\n" "наберите команду\n" " xcode -c !.!\n" "\n" "Следующими переключателями можно установить входную и выходную " "кодировки. \nОднако, " "автоматическое определение кодировки работает только для первых 5.\n" "Дальнейшую информацию см. на странице \n" " " SELF_URL_BASE "/xcode.html\n", /* msg_version */ "Программу "XCODE" версия %s написал Д.В.Хмелёв\n" "(подробности см. http://www.rusf.ru/books/yo/xcode.html)\n" "\n" "Автор воздерживается от всяческих гарантий\n" "надёжности программы и снимает с себя \n" "ответственность за возможную потерю данных при её\n" "использовании. Тем не менее, автор постарался\n" "сделать всё возможное, чтобы потери данных можно\n" "было избежать.\n", /* msg_help */ "Вызов: " XCODE" -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " "[in [out]]\n" "-E -h in English (don't forget to add -h or -H switch!)\n" "-v информация о версии\n" "-H Полная справка, список 14 поддерживаемых кодировок и лицензия Ё-ware\n" "-d двойная перекодировка (пробуйте, если просто команда '"XCODE"' не сработала)\n" "-q декодирование \"quoted-pritable\" символов, используемых в MIME\n" "-l декодирование html-Уникод текста (вроде Дима)\n" "-c определить кодировку и выдать её в выходной файл (подробная справка по -H)\n" "-t произвести unix2dos преобразование (превратить LF в CR/LF) в DOS/WIN\n" "-p режим трубы (требуется только в DOS/Win окружении)\n" "-s режим silent --- не выводить информацию о кодировках\n" "Если входной/выходной файл не указан, используется стандартный ввод/вывод.\n", /* msg_out */ "-%c выводим в кодировке %-10s ", /* msg_forc */ "+%c на входе кодировка %-10s \n", /* msg_defl */ " (по умолчанию) \n", /* msg_info */ "-%d вывод в кодировке %-10s +%d входная кодировка %-10s\n", /* msg_err_temp_file */ "Не могу создать временный файл. Нет места на диске?\n", /* msg_guessinp */ "Угадана входная кодировка %s\n", /* msg_forceinp */ "В качестве входной установлена кодировка %s\n", /* msg_outpenc */ "Выходная кодировка %s\n", /* msg_double_recode */ "Двойная перекодировка: %s->%s, %s->%s\n", /* msg_erropenfile */ "Не могу открыть выходной файл %s\n", /* msg_err_in_file */ "Не могу открыть входной файл %s\n", /* msg_cant_write_temp_file */ "Не могу писать во временный файл. Диск полон?\n", /* msg_pipe */ "Для использования в режиме трубы запустите программу с опцией -p\n", /* msg_tryhelp */ "Попробуйте запустить `"XCODE" -h' для справки по программе.\n", /* msg_uni_qp */ "Нельзя использовать переключатели -q и -l совместно.\n" "Воспользуйтесь трубой 'xcode -l|xcode -q' для получения желаемого результата.\n", /* msg_conflict_force_inform */ "Недопустимо использование ключа -c совместно с любым\n" "из ключей -l, +[awikm], +1, +2, ...\n", /* msg_wrong_argument */ "*** ОШИБКА В АРГУМЕНТЕ ПРОГРАММЫ ***\n", }; typedef enum{msg_descr, msg_encodings,msg_version,msg_help,msg_out, msg_forc,msg_defl,msg_info, msg_err_temp_file, msg_guessinp, msg_forceinp, msg_outpenc, msg_double_recode, msg_erropenfile,msg_err_in_file, msg_cant_write_temp_file, msg_pipe, msg_tryhelp,msg_uni_qp, msg_conflict_force_inform, msg_wrong_argument, msg_last} msg_id; char *msg(msg_id id){ assert(id=192) rating[i]+=(0.0+input_freq[c]) *letter_frequency[((int)to_koi_recode_table[i][c-128]-192)%32]; for(i=0; i=0; i--) if(decide[i]){ if(bestrating) *bestrating=rating[i]; return i; } return 0; } void compute_rating_two(unsigned long * input_freq, int resenc, int *res_recode_table, int *res_fr,int *res_to,int *res_a){ int c,from,to,b_from,b_to,j; double rating[NUMCOD][NUMCOD]; int a[NUMCOD][NUMCOD]; static int wt[256]; static int wt1[256]; static unsigned long in_freq[256]; for(from=0;from=4) goto dropdigs; digs[dignum++]=c; state=dig; continue; } if(c==';'){ int num; if(dignum<4) goto dropdigs; digs[dignum]=0; num=atoi(digs); if((num<0x401)||(num>0x451)) goto dropdigs; if(!is_iso_russian_letter[num-0x400+0xA0]) goto dropdigs; putc(recode_table[num-0x400+0xA0],out); dignum=0; state=scan; continue; } dropdigs: putc('&', out); putc('#', out); for(i=0;i=0){ fill_recode_table(fput_recode_table,force,enc); if(!silent){ if(!unicode_html){ fprintf(stderr,msg(msg_forceinp),encoding_name[force]); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); } if(unicode_html){ fprintf(stderr,msg(msg_forceinp),"html-unicode"); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); } } if(samefile){ if(NULL==(f=tmpfile())){ fprintf(stderr,msg(msg_err_temp_file)); return ERROR_OPEN_FILE_WRITE; } if(chkQP) read_qp(in,f); else if(unicode_html) read_unicode_html(in,f,enc); else read_file(in,f); fclose(in); rewind(f); out=openout(outfname,out,wt); while((c=getc(f))!=EOF){ putc(c,out); } fclose(f); fclose(out); }else { out=openout(outfname,out,wt); if(chkQP) read_qp(in,out); else if(unicode_html) read_unicode_html(in,out,enc); else read_file(in,out); fclose(in); fclose(out); } return ERROR_OK; } f=tmpfile(); if(f==NULL){ fprintf(stderr,msg(msg_err_temp_file)); return ERROR_OPEN_FILE_WRITE; } if(chkQP) read_qp(in,f); else read_file(in,f); fclose(in); if(double_recode){ compute_rating_two(input_freq,enc,work_recode_table,&fr,&to,&a); if(!silent){ fprintf(stderr,msg(msg_double_recode),encoding_name[fr],encoding_name[to], encoding_name[a],encoding_name[enc]); } }else{ a=compute_rating(input_freq,NULL); if(!silent){ fprintf(stderr,msg(msg_guessinp),encoding_name[a]); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); } fill_recode_table(work_recode_table,a,enc); } rewind(f); out=openout(outfname,out,wt); if(inform_encoding_only){ char *displayfname=fname?fname:"<>"; if(double_recode) fprintf(out, "%s->%s, %s: %s\n", encoding_name[fr],encoding_name[to], encoding_name[a], displayfname); else fprintf(out, "%s: %s\n", encoding_name[a], displayfname); fclose(f); fclose(out); return ERROR_INFORM_ENCODING; } while((c=getc(f))!=EOF){ putc(work_recode_table[c],out); } fclose(f); fclose(out); return ERROR_OK; } int samebuf(struct stat *a,struct stat *b){ return (a->st_size==b->st_size) && (a->st_mtime==b->st_mtime); } int main(int argc,char ** argv) { char *wt="wb"; int force=-1; int chkQP=0; int samefile; int do_pipe=0; int inform_encoding_only=0; int silent=0; int double_recode=0; char *filename; char *outfname; int version=0,help=0,Help=0; int unicode_html=0; int I=0; determine_self_encoding(argv[0]); for(I=1;argc>I&& (*argv[I]=='+'||*argv[I]=='-' # ifdef D_ALT ||*argv[I]=='/' # endif //D_ALT );I++) { if(isdigit(argv[I][1])){ int code; if(sscanf(argv[I]+1,"%d",&code)!=1){ printf(msg(msg_wrong_argument)); print_short_help(); return ERROR_WRONG_ARGUMENT; } if((code<1)||(code>TOTAL_ENCODING_NUMBER)){ printf(msg(msg_wrong_argument)); print_short_help(); return ERROR_WRONG_ARGUMENT; } if(*argv[I]=='+') force=code-1; else enc=code-1; continue; } switch(argv[I][1]) { default: help=2; printf(msg(msg_wrong_argument)); goto exit_commad_line_parser; case 'e': case 'E': Russian=0; break; case 'v': version=1; break; case 'h': case '?': help=1; break; case 'H': Help=1; break; case 't': wt="wt"; break; case 'p': do_pipe=1; break; case 's': silent=1; break; case 'l': unicode_html=1; break; case 'd': double_recode=1; break; case 'c': inform_encoding_only=1; silent=1; break; case 'a': case 'A': if(*argv[I]=='+') force=0; else enc=0; break; case 'w': case 'W': if(*argv[I]=='+') force=1; else enc=1; break; case 'k': case 'K': if(*argv[I]=='+') force=2; else enc=2; break; case 'i': case 'I': if(*argv[I]=='+') force=3; else enc=3; break; case 'm': case 'M': if(*argv[I]=='+') force=4; else enc=4; break; case 'q': case 'Q': chkQP = 1; break; /* По опции -- прекращаем сканировать список аргументов */ case '-': if(strcmp(argv[I],"--")==0) I++; else { printf(msg(msg_wrong_argument)); help=2; } goto exit_commad_line_parser; } if(argv[I][2]) help=2; } exit_commad_line_parser: if(help) { print_short_help(); if(help==1) return ERROR_HELP; else return ERROR_WRONG_ARGUMENT; } if(Help) { print_long_help(); if(help==1) return ERROR_HELP; else return ERROR_WRONG_ARGUMENT; } if(version) print_version(); if(unicode_html&&chkQP){ fprintf(stderr,msg(msg_uni_qp)); return ERROR_WRONG_ARGUMENT; } if(unicode_html) force=ISO8859_5; if(inform_encoding_only&&(force>=0)){ fprintf(stderr,msg(msg_conflict_force_inform)); return ERROR_WRONG_ARGUMENT; } if (I + 2 < argc) { print_short_help(); } else if(I == argc){ # ifdef D_ALT if(!do_pipe){ fprintf(stderr,msg(msg_pipe)); fprintf(stderr,msg(msg_tryhelp)); return ERROR_HELP; } # endif filename=NULL; outfname=NULL; samefile=0; }else if (I + 1 == argc) { filename=argv[I]; outfname=NULL; samefile=0; }else if (I + 2 == argc) { struct stat inbuf; struct stat outbuf; filename=argv[I]; outfname=argv[I+1]; if(stat(filename,&inbuf)<0){ perror(filename); return ERROR_STAT_FILE; } if(stat(outfname,&outbuf)<0) samefile=0; else samefile=samebuf(&inbuf,&outbuf); } return do_recode(filename,outfname, enc,force,chkQP,unicode_html,double_recode,wt, samefile,inform_encoding_only,silent); } @ 4.0 log @Добавлен ключ -d для определения двойной перекодировки. Смена номера версии на 4.0 @ text @d45 5 d174 1 a174 1 #define REVISION "$Revision: 3.7 $" d485 1 d575 18 d608 3 a610 2 "Usage:\n" " "XCODE" [-E] -[hH?v] -[qltps]-[wkaim1234567890] +[wkaim1234567890] [in [out]]\n" d617 1 d653 3 d689 1 a689 1 "Ошибки, связанные со взаимодействием в операционной системой имеют\n" d703 18 d737 2 a738 2 "Использование: \n" " "XCODE" -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " d746 1 d782 3 d795 4 a798 1 msg_pipe, msg_tryhelp,msg_uni_qp,msg_wrong_argument,msg_last} msg_id; d840 1 d845 1 d1137 3 a1139 1 int samefile, int silent){ d1141 1 d1236 1 a1236 2 if(double_recode){ int fr,to; d1255 18 a1272 1 a1278 1 d1293 1 d1313 1 d1317 1 d1319 1 a1319 1 } d1338 1 d1375 5 d1414 1 a1414 1 samefile,silent); @ 3.7 log @Исправлен глюк, возникавший при вызове xcode in out с отсутствующим файлом out (выдавалась ошибка). @ text @d2 1 a2 1 /* Written in 2002--2003 by D.V.Khmelev */ d6 1 d10 1 a10 1 /* bcc.exe -DD_KOI xcode.c #Borland C compiler */ d45 6 d169 1 a169 1 #define REVISION "$Revision: 3.6 $" d540 1 a540 1 "options -q and -t)\n" d588 2 a589 2 "-H print help, list of 14 (fourteen) encodings supported\n" " and view YO-ware license\n" d612 2 d644 1 a644 1 "не воспользовались дополнительными опциями -q и -t).\n" d695 2 a696 2 "-H Полная справка, список 14 (четырнадцати) поддерживаемых \n" " кодировок и лицензия Ё-ware\n" d719 2 d741 2 a742 1 msg_forceinp, msg_outpenc, msg_erropenfile,msg_err_in_file, d799 1 a799 1 unsigned char recode_table[NUMCOD][128]={ a858 2 double rating[NUMCOD]; d873 1 d877 1 a877 5 if(c>=128) for(i=0; i=192) rating[i]+=letter_frequency [((int)recode_table[i][c-128]-192)%32]; d885 55 d1078 2 a1079 1 int enc, int force, int chkQP, int unicode_html, d1083 1 a1083 1 int decide[NUMCOD]; d1085 1 d1087 1 a1087 1 // В DOS/WIN32 стандартный выход открыт в режиме text a1163 1 for(i=0; i=0; i--) if(decide[i]) a=i; if(!silent) { fprintf(stderr,msg(msg_guessinp),encoding_name[a]); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); a1193 1 fill_recode_table(work_recode_table,a,enc); d1220 1 d1260 1 d1299 1 a1299 1 }else if(I == argc){ d1330 1 a1330 1 enc,force,chkQP,unicode_html,wt, @ 3.6 log @Заработал прозрачно бинарный стандартный ввод/вывод под ДОС-окном. Версию mingw не проверял, но, по идее тоже должна работать. @ text @d44 5 d162 1 a162 1 #define REVISION "$Revision: 3.5 $" d1254 4 a1257 5 if(stat(outfname,&outbuf)<0){ perror(outfname); return ERROR_STAT_FILE; } samefile=samebuf(&inbuf,&outbuf); @ 3.5 log @Теперь stdout устанавливается в бинарный режим в DOS/WIN окружении. Иначе добавлялся код \x0D в конце каждой строки (\x0D\x0A). @ text @d34 6 a39 2 #if defined(__MSDOS__) || defined(_WIN32) || defined(WIN32)|| defined(__WIN32__) #define STDOUT_DOS d44 6 d151 1 a151 1 #ifdef STDOUT_DOS d154 1 a154 1 #endif//STDOUT_DOS d157 1 a157 1 #define REVISION "$Revision: 3.4 $" a1006 7 # ifdef STDOUT_DOS // В DOS/WIN32 стандартный выход открыт в режиме text // Поэтому требуется переключение в режим binary else if(out==stdout){ setmode(fileno(stdout),O_BINARY); } # endif d1016 23 a1038 1 FILE *f,*out=stdout,*in=stdin; @ 3.4 log @Исправлена ошибка в выдаче диагностики в предыдущей версии. Добавлены дополнительные коды выхода (см. xcode -H, раздел КОДЫ ВЫХОДА) Добавлен переключатель --, по которому прерывается разбор командной строки. Добавлено сообщение об ошибке в аргументах программы, ежели такая просходит. @ text @d34 4 d40 13 d141 4 d147 1 a147 1 #define REVISION "$Revision: 3.3 $" d997 7 @ 3.3 log @переформатировал комментарии @ text @d36 3 d126 1 a126 1 #define REVISION "$Revision: 3.2 $" d419 27 a445 8 enum { E_OK=0, E_OPEN_FILE_READ, E_OPEN_FILE_WRITE, E_OPEN_FILE_TMP, E_WRITE_FILE, E_WRONG_ENCODING_NUMBER, E_UNICODE_QP_TOGETHER, d448 1 d489 2 d499 2 d506 13 a518 1 "\n", d520 6 d549 1 a549 1 "-t do unix2dos transformation (convert LF to CR/LF)\n" d582 2 d591 2 d601 2 d608 13 a620 1 "\n", d622 7 d654 1 a654 1 "-t произвести unix2dos преобразование (превратить LF в CR/LF)\n" d687 2 d695 2 a696 2 msg_cant_create_temp_file, msg_cant_write_temp_file, msg_pipe, msg_tryhelp,msg_uni_qp, msg_last} msg_id; d710 1 a710 1 exit(E_OK); d726 3 d734 9 d749 1 d838 1 a838 1 exit(E_WRITE_FILE); d973 1 a973 1 exit(E_OPEN_FILE_WRITE); d990 1 a990 1 return E_OPEN_FILE_READ; d1011 1 a1011 1 return E_OPEN_FILE_WRITE; d1039 1 a1039 1 return E_OK; d1047 1 a1047 1 return E_OPEN_FILE_WRITE; d1078 1 a1078 1 return E_OK; d1112 1 a1112 1 print_short_help(); return E_WRONG_ENCODING_NUMBER; d1115 1 a1115 1 print_short_help(); return E_WRONG_ENCODING_NUMBER; d1121 4 a1124 1 default: help=2; goto exit_commad_line_parser; d1141 7 a1147 1 case '-': if(strcmp(argv[I],"--")==0) I++; else help=2; d1153 8 a1160 3 if(help) { print_short_help(); return help-1; } if(Help) { print_long_help(); return Help-1; } d1165 1 a1165 1 return E_UNICODE_QP_TOGETHER; d1177 1 a1177 1 exit(E_OK); d1194 1 d1197 2 a1198 3 samefile=0; }else{ samefile=samebuf(&inbuf,&outbuf); d1200 2 a1202 1 @ 3.2 log @Совсем забыл: теперь программа выходит с ненулевым кодом при какой-либо ошибке. Сами ошибки можно посмотреть в тексте: E_OK и т.д. @ text @d36 6 d43 2 a44 4 // Теперь опции вида /h допустимы только при выходной кодировки D_ALT // // По опции -- сканирование аргументов останавливается. Следующие // аргументы рассматриваются как имена файлов. d46 3 d123 1 a123 1 #define REVISION "$Revision: 3.1 $" @ 3.1 log @Теперь опции вида /h допустимы только при выходной кодировки D_ALT По опции -- сканирование аргументов останавливается. Следующие аргументы рассматриваются как имена файлов. @ text @d36 7 d116 1 a116 1 #define REVISION "$Revision: 3.0 $" @ 3.0 log @Смена версии на 3.0 команда: ci -f3.0 xcode.c @ text @d36 4 d109 1 a109 1 #define REVISION "$Revision: 2.10 $" d402 9 a410 1 d609 2 a610 2 msg_cant_write_temp_file,msg_pipe,msg_tryhelp,msg_uni_qp, msg_last} msg_id; d624 1 a624 1 exit(0); d739 1 a739 1 exit(1); d874 1 a874 1 exit(1); d891 1 a891 1 return 1; d910 4 a913 1 f=tmpfile(); d940 1 a940 1 return 1; d948 1 a948 1 return 1; d979 1 a979 1 return 0; d1004 6 a1009 1 for(I=1;argc>I&&(*argv[I]=='+'||*argv[I]=='-'||*argv[I]=='/');I++) { d1013 1 a1013 1 print_short_help(); return 0; d1016 1 a1016 1 print_short_help(); return 0; d1022 1 a1022 1 default: help=2; goto do_help; d1038 3 d1044 1 a1044 1 do_help: d1052 1 a1052 1 return 1; d1064 1 a1064 1 exit(0); d1089 3 a1091 2 do_recode(filename,outfname,enc,force,chkQP,unicode_html,wt,samefile,silent); return 0; @ 2.10 log @Поправлена ошибка в кодировке "mac", на которую любезно указал Сергей Скотников (неверный код буквы ``я''). Используемая библиотека перестановочной перекодировки с http://www.rusf.ru/books/yo/encoding.html получила название SRECODE.C и явно выделена в тексте программы комментариями. @ text @d36 9 d105 1 a105 1 #define REVISION "$Revision: 2.9 $" @ 2.9 log @Текст приведён к стандарту C99 (по модулю предупреждений о конвертации между знаковыми/беззнаковыми буквами). Бороться с этим можно явным заданием преобразования указателей, но не нужно в силу усложнения кода. @ text @d36 6 d96 1 a96 1 #define REVISION "$Revision: 2.8 $" d104 1 d106 2 a107 8 /* Подпрограммы на языке Си, обеспечивающие перестановочную перекодировку */ /* 14 кодировок русских букв друг в друга. */ /* Functions for C, providing exchange transformation of */ /* 14 russian encodings to each other. */ /* Автор кода: Д.В.Хмелёв, Март 2002 */ /* Подробности: http://www.rusf.ru/books/yo */ d109 40 a148 14 /* Следующий код является Ё-ware, Именно, его можно свободно распространять */ /* модифицировать, и даже дизассемблировать как в двоичном виде, так и в */ /* исходном тексте. Однако, используя этот код, вы должны использовать букву */ /* Ё во всех текстах, которые набираете на компьютерах: начиная с */ /* электронных писем и заканчивая крупной прозаической формой. */ /* This code was written by D.V.Khmelev, March 2002 */ /* More information at http://www.rusf.ru/books/yo */ /* The following code is YO-ware. YO-ware means that you can freely copy, */ /* modify and disassemble it in binary and/or source text. */ /* However, if you use this program code, you should use Russian letter YO */ /* in all texts in Russian you type in computer from e-mails */ /* to novells. */ d185 1 d195 1 d205 1 d215 1 d225 1 d229 1 a229 1 "\375\376\377" d235 1 d245 1 d255 1 d265 1 d275 1 d285 1 d295 1 d305 1 d315 1 d326 2 a327 1 int *full_encoding_list(encoding_t encoding, int table[]){ d343 3 a345 1 int *fill_recode_table(int table[],encoding_t from, encoding_t to){ d356 3 a358 1 unsigned char *srecode(unsigned char *s, encoding_t from, encoding_t to){ d370 4 a373 1 unsigned char *srecode2(unsigned char *s, unsigned char *t, encoding_t from, encoding_t to){ d386 5 d453 7 a459 1 "(see http://www.rusf.ru/books/yo/xcode.html for details)\n", d531 8 a538 1 "(подробности см. http://www.rusf.ru/books/yo/xcode.html)\n", @ 2.8 log @Поправлено предупреждение "suspicious pointer conversion" @ text @d36 3 d90 1 a90 1 #define REVISION "$Revision: 2.7 $" d637 1 a637 1 }; @ 2.7 log @Добавлено декодирование html-Уникоденных текстов (вроде Дима) @ text @d36 4 d87 1 a87 1 #define REVISION "$Revision: 2.6 $" d703 1 a703 1 static unsigned int recode_table[256]; @ 2.6 log @Информация о режиме silent добавленая в справку @ text @d2 1 a2 1 /* Written by 2002 D.V.Khmelev */ d36 3 d83 1 a83 1 #define REVISION "$Revision: 2.5 $" d395 1 a395 1 " "XCODE" -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] [in [out]]\n" d401 1 d432 3 d474 1 d505 3 d514 1 a514 1 msg_cant_write_temp_file,msg_pipe,msg_tryhelp, d697 72 d786 2 a787 1 int enc, int force, int chkQP, char*wt, d805 8 a812 2 fprintf(stderr,msg(msg_forceinp),encoding_name[force]); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); d818 2 d830 1 a830 1 }else if(outfname){ d834 2 d901 1 a901 1 d928 1 d943 7 d983 1 a983 1 do_recode(filename,outfname,enc,force,chkQP,wt,samefile,silent); @ 2.5 log @Добавлен режим silent по опции -s @ text @d36 3 d80 1 a80 1 #define REVISION "$Revision: 2.4 $" d400 1 d469 1 @ 2.4 log @Исправлено неправильное поведение при одном имени файла @ text @d36 3 d77 1 a77 1 #define REVISION "$Revision: 2.3 $" d699 1 a699 1 int samefile){ d715 4 a718 2 fprintf(stderr,msg(msg_forceinp),encoding_name[force]); fprintf(stderr,msg(msg_outpenc),encoding_name[enc]); d766 1 d798 1 d828 1 d876 1 a876 1 do_recode(filename,outfname,enc,force,chkQP,wt,samefile); @ 2.3 log @Теперь программа компилируется bc 3.1 без предупреждений и ошибок. @ text @d36 3 d851 2 a852 2 outfname=filename; samefile=1; @ 2.2 log @Режим трубы теперь по умолчанию только в Досе/Виндах. (Дос/Win определяется по переключателю D_ALT) @ text @d36 4 d71 1 a71 1 #define REVISION "$Revision: 2.1 $" d377 1 a377 1 " " SELF_URL_BASE "/encoding.html\n", d380 1 a380 1 "(see http://www.rusf.ru/books/yo/encoding.html for details)\n", d444 1 a444 1 " " SELF_URL_BASE "/encoding.html\n", d447 1 a447 1 "(подробности см. http://www.rusf.ru/books/yo/encoding.html)\n", d500 1 a500 1 void print_version(){ d510 1 a510 1 void print_short_help(){ d523 1 a523 1 void print_long_help(){ d602 1 a602 1 int chkQP = 0; d638 1 a638 1 } d717 1 a717 1 fclose(in); d752 1 a752 1 d756 1 a756 1 d778 1 a778 1 return (a->st_size==b->st_size) d785 2 a786 1 int c=0, force=-1; d792 1 a792 1 d801 1 a801 1 print_short_help(argv[0]); return 0; d804 1 a804 1 print_short_help(argv[0]); return 0; d810 1 a810 1 default: help=1; break; d816 1 a816 1 case 't': wt="wt"; break; d825 1 a825 1 if(argv[I][2]) help=1; d827 4 a831 2 if(help) print_short_help(); if(Help) print_long_help(); @ 2.1 log @*** empty log message *** @ text @d36 3 d67 1 a67 1 #define REVISION "$Revision: 2.0 $" d829 1 a829 1 //# ifdef D_ALT d835 1 a835 1 //# endif @ 2.0 log @Смена номера версии на 2.0 @ text @d36 3 d41 1 a41 1 // имеется опция с трубой -p, а под Досовской консольку по умолчанию d64 1 a64 1 #define REVISION "$Revision: 1.14 $" @ 1.14 log @Значительные улучшения по сравнению с предыдущей версией. Теперь имеется опция с трубой -p, а под Досовской консольку по умолчанию программа выводит краткую помощь. Если входная кодировка уже указана, то программа не определяет её автоматически, а сразу производит перекодировку. Единственный тонкий момент: когда надо перекодировать файл на месте. В этом случае используется временный файл на диске, как и всегда. @ text @d36 10 d61 1 a61 1 #define REVISION "$Revision: 1.13 $" d421 1 a421 1 "не воспользовались дополнительными опциями -q и -t),\n" @ 1.13 log @Добавил Revision @ text @a0 2 /* If you want to output Russian messages in KOI8, uncomment definition */ /* of D_KOI (see later) !!! */ d4 6 a9 10 #include #include #include #include #include #define VERSION "1.2" #define REVISION "$Revision: $" #define SELF_URL_BASE "http://www.rusf.ru/books/yo" #define SELF_URL SELF_URL_BASE "/src/xcode.c" d11 1 a11 2 // Выходная кодировка по умолчанию // Output encoding by default d36 3 d43 16 d343 2 a344 1 "RESTORE source file by backward conversion\n" d358 3 a361 3 "Program %s version " VERSION " written by D.V.Khmelev\n" "(see http://www.rusf.ru/books/yo/encoding.html for details)\n" "\n" d363 1 a363 1 " %s -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] [in [out]]\n" d365 1 d369 2 d394 4 d410 2 a411 1 "ВОССТАНОВИТЬ исходный файл обратным преобразованием\n" d425 3 a428 3 "Программу %s версия "VERSION" написал Д.В.Хмелёв\n" "(подробности см. http://www.rusf.ru/books/yo/encoding.html)\n" "\n" d430 1 a430 1 " %s -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " d433 1 d437 2 d462 4 d469 1 a469 1 typedef enum{msg_descr, msg_encodings,msg_help,msg_out, d472 1 a472 1 msg_cant_write_temp_file, d480 9 d490 1 a490 2 void print_short_help(char *selfname){ char * c = selfname + strlen(selfname); d493 1 a493 3 while( (c != selfname) && (*c != '\\') && (*c != '/')) c--; if (c != selfname) c++; printf(msg(msg_help),c,c); d503 1 a503 1 void print_long_help(char *selfname){ d506 1 a506 1 print_short_help(selfname); d660 6 a665 39 int main(int argc,char ** argv) { int c=0, a=0, i, j, force=-1; int decide[NUMCOD]; FILE *f,*out=stdout,*in=stdin; int I=0; determine_self_encoding(argv[0]); for(I=1;argc>I&&(*argv[I]=='+'||*argv[I]=='-'||*argv[I]=='/');I++) { if(isdigit(argv[I][1])){ int code; if(sscanf(argv[I]+1,"%d",&code)!=1){ print_short_help(argv[0]); return 0; } if((code<1)||(code>TOTAL_ENCODING_NUMBER)){ print_short_help(argv[0]); return 0; } if(*argv[I]=='+') force=code-1; else enc=code-1; continue; } switch(argv[I][1]) { default: print_short_help(argv[0]); return 1; case 'e': case 'E': Russian=0; break; case 'h': case '?': print_short_help(argv[0]); return 0; case 'H': print_long_help(argv[0]); return 0; case 'a': case 'A': if(*argv[I]=='+') force=0; else enc=0; break; case 'w': case 'W': if(*argv[I]=='+') force=1; else enc=1; break; case 'k': case 'K': if(*argv[I]=='+') force=2; else enc=2; break; case 'i': case 'I': if(*argv[I]=='+') force=3; else enc=3; break; case 'm': case 'M': if(*argv[I]=='+') force=4; else enc=4; break; case 'q': case 'Q': chkQP = 1; break; d668 2 d671 8 a678 2 if(I=0) fprintf(stderr,msg(msg_forceinp),encoding_name[a=force]); a718 8 if(I '9') first = toupper(first) - 'A' + 1 +'9'; if (second > '9') second = toupper(second) - 'A' + 1 +'9'; d547 69 a619 1 double rating[NUMCOD]; d658 1 a658 1 in=fopen(argv[I++],"rt"); d660 1 a660 4 char *errfile=Russian? "Не могу открыть входной файл %s\n": "Unable to open input file %s\n"; fprintf(stderr,_rec(errfile),argv[I-1]); d669 1 a669 4 char *errfile=Russian? "Не могу создать временный файл. Нет места на диске?\n": "Unable to create input file. No free space on disk?\n"; fprintf(stderr,_rec(errfile)); a671 24 while((c=getc(in))!=EOF) { //c_old=c; // Added by KIV if (chkQP && (c == '=')) { //Maybe, QP? int q1 = getc(in); if (!isxdigit(q1)) { if (hasQP && ((q1 == '\r')||(q1 == '\n'))) { q1 = getc(in); if ((q1 == '\r')||(q1 == '\n')) continue; }; ungetc(q1,in); } else { int q2 = getc(in); if (!isxdigit(q2)) { ungetc(q2,in); ungetc(q1,in); } else { c = getQP(q1,q2); hasQP = 1; }; } }; d673 5 a677 8 if(c>=128) for(i=0; i=192) rating[i]+=letter_frequency [((int)recode_table[i][c-128]- 192)%32]; fputc(c,f); } a684 1 d686 1 a686 8 char *guessinp=Russian? "Угадана входная кодировка %s\n":"Guessed input encoding: %s\n"; char *forceinp=Russian? "В качестве входной вынужденно используется кодировка %s\n": "Forced input encoding: %s\n"; char *outpenc=Russian? "Выходная кодировка %s\n":"Output encoding: %s\n"; fprintf(stderr,_rec(guessinp),encoding_name[a]); d688 1 a688 1 fprintf(stderr,_rec(forceinp),encoding_name[a=force]); d690 1 a690 1 fprintf(stderr,_rec(outpenc),encoding_name[enc]); d698 1 a698 4 char *errfile=Russian? "Не могу открыть выходной файл %s\n": "Unable to open output file %s\n"; fprintf(stderr,_rec(errfile),argv[I-1]); d704 2 a705 2 while((c=fgetc(f))!=EOF){ fputc(work_recode_table[c],out); @ 1.6 log @Добавил предупреждение, чтобы с использованием переключателя -E не забывали писать -h или -H @ text @d331 1 a331 1 "начинная с электронных писем и заканчивая крупной прозаической формой.\n" d600 1 a600 1 "Угаданая входная кодировка %s\n":"Guessed input encoding: %s\n"; @ 1.5 log @Добавлен вывод помощи при ошибке открытия файла @ text @d353 1 a353 1 "-E help in English\n", d368 1 a368 1 "-E help in English\n", @ 1.4 log @Поправлена орфографическая ошибка в Ё-комментарии @ text @d1 2 a6 1 #include d258 4 a261 3 //#define D_ALT #ifdef D_ALT #define OUTPUT_ENC 0 // либо "альтернативная" (т.е. досовская) d263 2 a264 1 #define OUTPUT_ENC 2 // либо "KOI". d357 1 d372 1 d538 8 a545 1 assert(in!=0); d550 7 a556 1 if(f==NULL){ perror("\"tmpfile\""); exit(1);} d617 8 a624 1 assert(out!=0); @ 1.3 log @Теперь выходная кодировка сообщений не зависит от переключателей командной строки @ text @d26 1 a26 1 /* Ё во всех текстах, которые набираете на компьютерах: начинная с */ @ 1.2 log @Версия 1.0 @ text @d257 1 d259 1 a259 1 int enc=0; // либо "альтернативная" (т.е. досовская) d261 1 a261 1 int enc=2; // либо "KOI". d264 3 d290 1 a290 1 return srecode2(temps,s,self_encoding,enc); d348 1 a348 1 " %s -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " d362 1 a362 1 " %s -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " d482 1 a482 1 inline int getQP(int first, int second) d491 1 a491 1 int c=0, a=0, c_old, i, j, force=-1; d510 1 a510 1 (*argv[I]=='+'?force:enc)=code-1; d517 2 a518 2 case 'h': case '?': print_short_help(argv[0]); d522 5 a526 5 case 'a': case 'A': (*argv[I]=='+'?force:enc)=0; break; case 'w': case 'W': (*argv[I]=='+'?force:enc)=1; break; case 'k': case 'K': (*argv[I]=='+'?force:enc)=2; break; case 'i': case 'I': (*argv[I]=='+'?force:enc)=3; break; case 'm': case 'M': (*argv[I]=='+'?force:enc)=4; break; d540 1 a540 1 c_old=c; d548 1 a548 1 if ((q1 == '\r')||(q1 == '\n')) d563 1 a563 1 d580 11 a590 3 fprintf(stderr,"Guessed input encoding: %s\n",encoding_name[a]); if(force>=0) fprintf(stderr,"Forced input encoding: %s\n",encoding_name[a=force]); d592 2 a593 1 fprintf(stderr,"Output encoding: %s\n",encoding_name[enc]); d607 1 @ 1.1 log @Initial revision @ text @d1 3 d10 28 a37 1 /* Russian encodings with care to letter YO from www.rusf.ru/yo */ d39 2 a40 2 ALT=0, WIN_CP1251, d42 1 a42 1 GOSTCII, d56 2 a57 2 "alt", /* ALT */ "win-cp1251", /* WIN_CP1251 */ d59 1 a59 1 "iso8859-5", /* GOSTCII */ d72 1 a72 1 /* ALT */ d81 1 a81 1 /* WIN_CP1251 */ d99 1 a99 1 /* GOSTCII */ d227 1 a227 1 unsigned char *recode(unsigned char *s, encoding_t from, encoding_t to){ d239 12 d254 3 a256 1 // Выходная кодировка d258 1 a258 1 int enc=0; d260 1 a260 1 int enc=2; d263 26 a288 1 char encLetter[]={'a','w','k','i','m'}; d290 48 d340 2 a341 6 "This program tries to determine input document encoding\n", "and to convert it into a desired one.\n" "The important feature of this program is ONE-TO-ONE conversion,\n", "which prevents you from damaging your file. If conversion is\n", "incorrect or if you even converted a binary file, you can always\n", "RESTORE source file by backward conversion\n", d343 13 a355 3 "Written by D.Khmelev, 17.03.2002\n", "(Based on a program written originally by Andrey V. Lukyanov, May 14, 1997,\n", "and updated later by Cyril Rotmistrovsky and Igor V. Krassikov)\n", d357 2 a358 1 "Usage: %s -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] " d360 4 a363 2 "-H print full help on 14 encodings ", "-q to enable quoted-pritable decoding\n", d367 2 d371 10 d382 1 d385 1 a385 1 for(j=0;help[j];j++) printf(help[j],c); d387 1 a387 1 printf("-%c to set %-10s output",encLetter[j], encoding_name[j]); d389 1 a389 1 else printf(" (default)\n"); d392 1 a392 1 printf("+%c to force %-10s input\n",encLetter[j], encoding_name[j]); d397 6 d404 2 a405 5 printf("The following switches could be used for input " "and output encoding. \nHowever, " "automatical recognition is supported for first 5 encodings only.\n" "More information can be found at \n" " http://www.rusf.ru/books/analysis/yo/encoding.html\n"); d407 1 a407 1 printf("-%d to set %-10s output +%d to set %-10s input\n", d495 3 a497 1 for(I=1;argc>I&&(*argv[I]=='+'||*argv[I]=='-');I++) { d511 2 @