// // Модуль: заголовочный файл для процедур обработки командной строки // #ifndef __CMDLINE_H__ #define __CMDLINE_H__ #define MAX_FILE_NAME 255 // максимальная длина имени файла #define DEF_FILE_EXT ".HEX" // расширение имени файла по умолчанию // // Определение Флажков поля флагов // #define SWFLG_PRESENT 0x00000001 // ключ указан в командной строке #define SWFLG_HASVALUE 0x00000002 // ключ имеет дополнительное значение // // Определение Флажков для определения формата ключа // #define SWFMT_LOWLIMIT 0x0001 // проверять числовое значение не менее нижнего предела #define SWFMT_HIGHLIMIT 0x0002 // проверять числовое значение не более верхнего предела #define SWFMT_MUSTVALUE 0x0004 // ключ обязательно должен иметь значение // // Часть, определяющая параметры генерации кода разбора командной строки // // // Определение типов значений ключа, если какой-то тип ключа не используется, // то определение следует закомментировать - соответствующий код не будет // сгенерирован // #define SWTYP_NOVALUE 0x00 // ключ не может иметь никаких значений #define SWTYP_DECVALUE 0x01 // ключ может иметь беззнаковое десятичное значение #define SWTYP_HEXVALUE 0x02 // ключ может иметь беззнаковое шестнадцатиричное значение #define SWTYP_LPTPORT 0x03 // ключ является номером или адресом LPT-порта #define SWTYP_COMPORT 0x04 // ключ является номером последовательного порта #define SWTYP_BAUDRATE 0x05 // ключ является скоростью обмена по порту #define SWTYP_DATE 0x06 // ключ является датой #define SWTYP_SERNUM 0x07 // ключ является серийным номером #define SWTYP_SERNUMDAT 0x08 // ключ является серийным номером с датой #define SWTYP_PLUS 0x09 // ключ может иметь аргумент '+' #ifdef SWTYP_COMPORT #define SWCOM_MIN 1 // минимальный номер порта #define SWCOM_MAX 99 // максимальный номер порта #endif #ifdef SWTYP_DATE #define SWDAT_MIN 10100 // минимальная дата 01-01-00 #define SWDAT_MAX 311299 // максимальная дата 31-12-99 #endif #ifdef SWTYP_BAUDRATE #define SWBAUD_110 0x00000001L // бит поддержки скорости 110 Бод #define SWBAUD_150 0x00000002L // бит поддержки скорости 150 Бод #define SWBAUD_300 0x00000004L // бит поддержки скорости 300 Бод #define SWBAUD_600 0x00000008L // бит поддержки скорости 600 Бод #define SWBAUD_1200 0x00000010L // бит поддержки скорости 1200 Бод #define SWBAUD_2400 0x00000020L // бит поддержки скорости 2400 Бод #define SWBAUD_3600 0x00000040L // бит поддержки скорости 3600 Бод #define SWBAUD_4800 0x00000080L // бит поддержки скорости 4800 Бод #define SWBAUD_7200 0x00000100L // бит поддержки скорости 7200 Бод #define SWBAUD_9600 0x00000200L // бит поддержки скорости 9600 Бод #define SWBAUD_12800 0x00000400L // бит поддержки скорости 12800 Бод #define SWBAUD_14400 0x00000800L // бит поддержки скорости 14400 Бод #define SWBAUD_19200 0x00001000L // бит поддержки скорости 19200 Бод #define SWBAUD_28800 0x00002000L // бит поддержки скорости 28800 Бод #define SWBAUD_38400 0x00004000L // бит поддержки скорости 38400 Бод #define SWBAUD_57600 0x00008000L // бит поддержки скорости 57600 Бод #define SWBAUD_115200 0x00010000L // бит поддержки скорости 115200 Бод #define SWBAUD_230400 0x00020000L // бит поддержки скорости 230400 Бод #define SWBAUD_460800 0x00040000L // бит поддержки скорости 460800 Бод #define SWBAUD_921600 0x00080000L // бит поддержки скорости 921600 Бод #define SWBAUD_ANY 0x000FFFFFL // #endif // // Определение флагов присутствия ключей в командной строке // Неиспользуемые ключи следует закомментировать. // // #define KEY_A_BIT 0x00000001 // #define KEY_B_BIT 0x00000002 // #define KEY_C_BIT 0x00000004 // #define KEY_D_BIT 0x00000008 // #define KEY_E_BIT 0x00000010 // #define KEY_F_BIT 0x00000020 // #define KEY_G_BIT 0x00000040 // #define KEY_H_BIT 0x00000080 // #define KEY_I_BIT 0x00000100 // #define KEY_J_BIT 0x00000200 // #define KEY_K_BIT 0x00000400 // #define KEY_L_BIT 0x00000800 // #define KEY_M_BIT 0x00001000 // #define KEY_N_BIT 0x00002000 // #define KEY_O_BIT 0x00004000 // #define KEY_P_BIT 0x00008000 // #define KEY_Q_BIT 0x00010000 // #define KEY_R_BIT 0x00020000 // #define KEY_S_BIT 0x00040000 // #define KEY_T_BIT 0x00080000 // #define KEY_U_BIT 0x00100000 // #define KEY_V_BIT 0x00200000 // #define KEY_W_BIT 0x00400000 // #define KEY_X_BIT 0x00800000 // #define KEY_Y_BIT 0x01000000 // #define KEY_Z_BIT 0x02000000 // // Приведенные ниже значения могут управлять генерацией кода // // Если приложение не может иметь имена файлов в командной строке // то не следует определять ключи KEY_xxxFILE. Если ожидается // не более одного имени файла, то определяется только KEY_INFILE_BIT, // Если два - то также определяется и KEY_OUTFILE_BIT // // #define KEY_INFILE_BIT 0x04000000 // #define KEY_OUTFILE_BIT 0x08000000 // // // Указывает, используется ли подсистема выдачи справки при пустой командной строке // // #define KEY_HELP_BIT 0x10000000 // // Предполагает использование подсистемы выдачи диагностики на экран // // #define KEY_VERB_BIT 0x20000000 // // Ниже приводится выборка, специфичная для данного приложения // // *** Begin application specific part { // #define KEY_C_BIT 0x00000004 // определение chip-code #define KEY_F_BIT 0x00000020 // определение параметра заполнения #define KEY_INFILE_BIT 0x04000000 // имя входного файла #define KEY_OUTFILE_BIT 0x08000000 // имя выходного файла #define KEY_HELP_BIT 0x10000000 // вывод справки #define KEY_VERB_BIT 0x20000000 // вывод дополнительной информации // // } *** End Application specific part // typedef BOOL (*KEY_PROC)(PVOID); // // Определение структуры описания ключа // typedef struct _SWITCH_DESC { BYTE Letter; // буква значения ключа // используется при разборе командной строки // при сравнении используется верзний регистр BYTE Type; // тип значения ключа // должно быть одно из определенных // значений SWTYP_xxxxx BYTE Format; // описание формата ключа // описывает некоторые дополнительные // параметры формата BYTE Flags; // значение флагов обработки // заполняется при разборе строки // DWORD KeyBit; // битовая маска ключа // используется при внутреннем поиске // и работе с глобальным полем флагов DWORD IncompKey; // маска несовместимых ключей // если в глобальном поле флагов // устновлен один из указанных ключей // то будет генерироваться ошибка DWORD RequireKey; // маска обязательных ключей // если в глобальном поле флагов // не устновлен один из указанных ключей // то будет генерироваться ошибка // KEY_PROC VerifyProc; // указатель на процедуру проверки // может быть NULL - тогда производится // проверка определяемая типом и форматом KEY_PROC ValueProc; // указатель на процедуру обработки значения // вызывается при обработке ключа и используется // для обработки сложных значений // DWORD LowLimit; // нижнее допустимое значение для // ключей с целым беззнаковым значением DWORD HighLimit; // верхнее допустимое значение для // ключей с целым беззнаковым значением DWORD Value; // место для сохранения значения // ключей с целым беззнаковым значением // может использоваться как указатель // на значения других типов } SWITCH_DESC, *PSWITCH_DESC; // // Макрос проверки наличия указанного ключа // Используется для проверки в различных // глубоких циклах - повышает быстродействие // #define CL_KeyPresent(KeyMask) (CLD_KeyMask & (KeyMask)) // // Функция первичной обработки командной строки // Получает аргументы, переданные основной функции main() // В случае ошибки выводит сообщения с использованием // функции ERR_ShowText() и возвращает ненулевое значение // BOOL CL_ParseCmdLine(int arg, char* argv[]); // // Функция получения указателя на значение ключа (если было указано // в командной строке, иначе возвращается указатель на значение // по умолчанию), дальнейшая обработка зависит от типа значения // ключа. Если ключ не был указан, то возвращает NULL // // PVOID CL_GetValuePtr(DWORD KeyBit); #ifdef SWTYP_DECVALUE // // Функция преобразования строчки десятичных цифр в беззнаковое целое // В случае успеха возвращает полученное значение, в случае ошибки // возвращает 0 и устанавливает признак ошибки CLD_ConvError // // DWORD CL_GetDecValue(char* Line); #endif // // Функции получения имен входного и выходного файлов // #ifdef KEY_INFILE_BIT char* CL_GetInFile(void); #ifdef KEY_OUTFILE_BIT char* CL_GetOutFile(void); #endif #endif #ifdef __CMDLINE_INTERNAL__ // определение внутренних функций и данных // этот параметр задается при компиляции // файла cmdline.c extern SWITCH_DESC Switch[]; DWORD CLD_KeyMask = 0; // маска определенных ключей командной строки // представляет конкатенацию констант KEY_xxx_BIT BOOL CLD_ConvError = FALSE; // признак ошибки функций преобразования значений // #ifdef KEY_INFILE_BIT // char InFileName[MAX_FILE_NAME+1]; // буфер для имени входного файла #ifdef KEY_OUTFILE_BIT // char OutFileName[MAX_FILE_NAME+1]; // буфер для имени выходного файла #endif // #endif // // // Массив структур, описывающий все допустимые ключи, общие правила синтаксиса, // типы допустимых значений, указатели на процедуры проверки // Определяется индивидуально для каждого приложения // // // *** Begin application specific part { // SWITCH_DESC Switch[] = { // Chr Type Format {'C', SWTYP_DECVALUE, SWFMT_LOWLIMIT | SWFMT_HIGHLIMIT | SWFMT_MUSTVALUE, 0, KEY_C_BIT, 0, 0, NULL, NULL, 0, 7, 0}, {'F', SWTYP_HEXVALUE, SWFMT_LOWLIMIT | SWFMT_HIGHLIMIT | SWFMT_MUSTVALUE, 0, KEY_F_BIT, 0, 0, NULL, NULL, 0, 0xFF, 0}, {'?', SWTYP_NOVALUE, 0, 0, KEY_HELP_BIT, ~KEY_HELP_BIT, 0, NULL, NULL, 0, 0, 0}, {'#', SWTYP_NOVALUE, 0, 0, KEY_VERB_BIT, 0, 0, NULL, NULL, 0, 0, 0} }; // // } *** End Application specific part // #define KEY_TAB_SIZE (sizeof(Switch)/sizeof(Switch[0])) #else // __INTERNAL extern DWORD CLD_KeyMask; #endif // __INTERNAL__ #endif // __CMDLINE_H__