{ if (strcmp (parameters[0], "delta") == 0) { // Если название метода (нулевой параметр) - "delta", то разберём остальные параметры DELTA_METHOD *p = new DELTA_METHOD; int error = 0; // Признак того, что при разборе параметров произошла ошибка // Переберём все параметры метода (или выйдем раньше при возникновении ошибки при разборе очередного параметра) while (*++parameters && !error) { char* param = *parameters; if (strlen(param)==1) switch (*param) { // Однобуквенные параметры case 'x': p->ExtendedTables = 1; continue; } switch (*param) { // Параметры, содержащие значения case 'b': p->BlockSize = parseMem (param+1, &error); continue; } // Сюда мы попадаем, если в параметре не указано его название // Если этот параметр удастся разобрать как объём памяти, // то присвоим его значение полю BlockSize p->BlockSize = parseMem (param, &error); } if (error) {delete p; return NULL;} // Ошибка при парсинге параметров метода return p; } else return NULL; // Это не метод DELTA } static int DELTA_x = AddCompressionMethod (parse_DELTA); // Зарегистрируем парсер метода DELTA
} else switch (*param) { // Параметры, содержащие значения case 'b': p->BlockSize = parseMem (param+1, &error); continue; case 'c': p->MinWeakChars = parseInt (param+1, &error); continue; case 'l': p->MinLargeCnt = parseInt (param+1, &error); continue; case 'm': p->MinMediumCnt = parseInt (param+1, &error); continue; case 's': p->MinSmallCnt = parseInt (param+1, &error); continue; case 'r': p->MinRatio = parseInt (param+1, &error); continue; } // Если параметр заканчивается знаком процента. то попробуем распарсить его как "N%" if (last_char(param) == '%') { char str[100]; strcpy(str,param); last_char(str) = '\0'; int n = parseInt (str, &error); if (!error) { p->MinCompression = n; continue; } error=0; } // Сюда мы попадаем, если в параметре не указано его название // Если этот параметр удастся разобрать как целое число (т.е. в нём - только цифры), // то присвоим его значение полю MinMatchLen, иначе попробуем разобрать его как BlockSize int n = parseInt (param, &error); if (!error) p->MinWeakChars = n; else error=0, p->BlockSize = parseMem (param, &error); } if (error) {delete p; return NULL;} // Ошибка при парсинге параметров метода return p; } else return NULL; // Это не метод DICT } static int DICT_x = AddCompressionMethod (parse_DICT); // Зарегистрируем парсер метода DICT
char* param = *parameters; switch (*param) { // Параметры, содержащие значения case 'b': p->BlockSize = parseMem (param+1, &error); continue; case 'l': p->MinMatchLen = parseInt (param+1, &error); continue; case 'd': p->Barrier = parseMem (param+1, &error); continue; case 's': p->SmallestLen = parseInt (param+1, &error); continue; case 'h': p->HashSizeLog = parseInt (param+1, &error); continue; case 'a': p->Amplifier = parseInt (param+1, &error); continue; } // Если параметр заканчивается знаком процента. то попробуем распарсить его как "N%" if (last_char(param) == '%') { char str[100]; strcpy(str,param); last_char(str) = '\0'; int n = parseInt (str, &error); if (!error) { p->MinCompression = n; continue; } error=0; } // Сюда мы попадаем, если в параметре не указано его название // Если этот параметр удастся разобрать как целое число (т.е. в нём - только цифры), // то присвоим его значение полю MinMatchLen, иначе попробуем разобрать его как BlockSize int n = parseInt (param, &error); if (!error) p->MinMatchLen = n; else error=0, p->BlockSize = parseMem (param, &error); } if (error) {delete p; return NULL;} // Ошибка при парсинге параметров метода return p; } else return NULL; // Это не метод REP } static int REP_x = AddCompressionMethod (parse_REP); // Зарегистрируем парсер метода REP