static uintptr_t memarea_limit(const char *s) { number n; unsigned char *q; if ( str_number((unsigned char *)s, &q, &n, FALSE) == NUM_OK && intNumber(&n) ) { switch((int)*q) { case 'k': case 'K': case EOS: return (intptr_t)n.value.i K; case 'm': case 'M': return (intptr_t)n.value.i K K; case 'g': case 'G': return (intptr_t)n.value.i K K K; case 'b': case 'B': return (intptr_t)n.value.i; } } return MEMAREA_INVALID_SIZE; }
/* Functions to manage NSSM-specific settings in the registry. */ static int setting_set_number(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { HKEY key = (HKEY) param; if (! key) return -1; unsigned long number; long error; /* Resetting to default? */ if (! value || ! value->string) { error = RegDeleteValue(key, name); if (error == ERROR_SUCCESS || error == ERROR_FILE_NOT_FOUND) return 0; print_message(stderr, NSSM_MESSAGE_REGDELETEVALUE_FAILED, name, service_name, error_string(error)); return -1; } if (str_number(value->string, &number)) return -1; if (default_value && number == (unsigned long) default_value) { error = RegDeleteValue(key, name); if (error == ERROR_SUCCESS || error == ERROR_FILE_NOT_FOUND) return 0; print_message(stderr, NSSM_MESSAGE_REGDELETEVALUE_FAILED, name, service_name, error_string(error)); return -1; } if (set_number(key, (TCHAR *) name, number)) return -1; return 1; }
static int setting_set_exit_action(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { unsigned long exitcode; TCHAR *code; TCHAR action_string[ACTION_LEN]; if (additional) { /* Default action? */ if (is_default(additional)) code = 0; else { if (str_number(additional, &exitcode)) return -1; code = (TCHAR *) additional; } } HKEY key = open_registry(service_name, name, KEY_WRITE); if (! key) return -1; long error; int ret = 1; /* Resetting to default? */ if (value && value->string) _sntprintf_s(action_string, _countof(action_string), _TRUNCATE, _T("%s"), value->string); else { if (code) { /* Delete explicit action. */ error = RegDeleteValue(key, code); RegCloseKey(key); if (error == ERROR_SUCCESS || error == ERROR_FILE_NOT_FOUND) return 0; print_message(stderr, NSSM_MESSAGE_REGDELETEVALUE_FAILED, code, service_name, error_string(error)); return -1; } else { /* Explicitly keep the default action. */ if (default_value) _sntprintf_s(action_string, _countof(action_string), _TRUNCATE, _T("%s"), (TCHAR *) default_value); ret = 0; } } /* Validate the string. */ for (int i = 0; exit_action_strings[i]; i++) { if (! _tcsnicmp((const TCHAR *) action_string, exit_action_strings[i], ACTION_LEN)) { if (default_value && str_equiv(action_string, (TCHAR *) default_value)) ret = 0; if (RegSetValueEx(key, code, 0, REG_SZ, (const unsigned char *) exit_action_strings[i], (unsigned long) (_tcslen(action_string) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) { print_message(stderr, NSSM_MESSAGE_SETVALUE_FAILED, code, service_name, error_string(GetLastError())); RegCloseKey(key); return -1; } RegCloseKey(key); return ret; } } print_message(stderr, NSSM_MESSAGE_INVALID_EXIT_ACTION, action_string); for (int i = 0; exit_action_strings[i]; i++) _ftprintf(stderr, _T("%s\n"), exit_action_strings[i]); return -1; }
static int setting_get_exit_action(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) { unsigned long exitcode = 0; unsigned long *code = 0; if (additional) { if (! is_default(additional)) { if (str_number(additional, &exitcode)) return -1; code = &exitcode; } } TCHAR action_string[ACTION_LEN]; bool default_action; if (get_exit_action(service_name, code, action_string, &default_action)) return -1; value_from_string(name, value, action_string); if (default_action && ! _tcsnicmp((const TCHAR *) action_string, (TCHAR *) default_value, ACTION_LEN)) return 0; return 1; }
int str_number(const TCHAR *string, unsigned long *number) { TCHAR *bogus; return str_number(string, number, &bogus); }
bool ParseAviris::Parse(QString fileName, HyperCube& cube) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { return false; } QString *Text = new QString[10000]; int number_lines = 0; while (!file.atEnd()) { //считывание текста в массив строк Text[number_lines] = file.readLine(); number_lines++; } QString str_name[6]; str_name[0] = "samples"; str_name[1] = "lines"; str_name[2] = "bands"; str_name[3] = "header offset"; str_name[4] = "data type"; str_name[5] = "byte order"; int samples = 0, lines = 0, bands = 0, header_offset = 0, data_type = 0, byte_order = 0; int array_name[6] = { samples, lines, bands, header_offset, data_type, byte_order }; QString str_number; for (int n = 0, l = 0; n < 6; n++) { for (int k = 0; k < number_lines; k++) { QString str_file(Text[k]); // создаем строку-копию из строки Text[k] bool search = str_file.contains(str_name[n],Qt::CaseInsensitive); // поиск подстроки в строке str с 0 позиции if (search){ for (l = 0; l < str_file.length(); l++) { if (str_file[l] >= '0' && str_file[l] <= '9') break; // если цифра найдена - то выходим из цикла } str_number = str_file.remove(0, l - 1); // str_number – подстрока str_file всех символов с l позиции array_name[n] = str_number.toInt(); } } } // запись значений параметров в куб cube.SetSamples(array_name[0]); cube.SetLines(array_name[1]); cube.SetBands(array_name[2]); cube.SetHeaderOffset(array_name[3]); cube.SetDataType(array_name[4]); cube.SetByteOrder(array_name[5]); // qDebug() << ""; double wavelength[300]; int first_wavelength = 0; // номер строки "wavelength" в файле for(int n = 0; n < number_lines; n++) { QString str_file(Text[n]); // создаем строку-копию из строки Text[k] bool search = str_file.contains("wavelength",Qt::CaseInsensitive); // поиск подстроки в строке str с 0 позиции if (search) { first_wavelength = n; break; } } for(int n = first_wavelength + 1, w = 0; n < first_wavelength + 225; n++) { QString str_file(Text[n]); // создаем строку-копию из строки Text[k] int end_line = str_file.length(); // длина строки QString str_number; int first_digit = -1, comma = -1; // первая цифра, запятая for(int i = 0; i < end_line; i++) { if(i < end_line) { if (str_file[i] >= '0' && str_file[i] <= '9') { first_digit = i; // поиск первой цифры for(int c = first_digit; c < end_line; c++) { if(str_file[c] == ',' || str_file[c] == '}') { comma = c; break; } if(str_file[c] == ' ' ) { comma = c; break; } } QString str_number(str_file); // копия строки str_number = str_file.remove(0, first_digit - 1); str_number = str_file.remove(comma + 1, end_line + 1); wavelength[w] = str_number.toDouble(); // qDebug() << wavelength[w]; w++; str_file = str_file.remove(0, comma - 1); end_line = str_file.length(); // длина строки } } } } file.close(); // закрытие файла с параметрами char** dataCube = new char*[array_name[2]]; // bands int ChunkSize = array_name[0] * array_name[1] * array_name[4]; // samples*lines*datatype for (int i = 0; i < array_name[2]; i++) { dataCube[i] = new char[ChunkSize]; // samples*lines*datatype } int end_line_FileName = fileName.length(); // длина строки int point; for(int i = end_line_FileName; i > 0; i--) { if (i > 0) { if (fileName[i] == '.') {point = i; break;} } } fileName = fileName.remove(point, end_line_FileName); QFile dataFile(fileName); // открытие файла с данными if (!dataFile.open(QIODevice::ReadOnly)) { return false; } for(int i = 0; i < array_name[2]; i++) // i < bands { //char* TempBuf = new char[ChunkSize]; if(!dataFile.atEnd()) { if(dataFile.read(dataCube[i], ChunkSize) != ChunkSize) { return false; } // cube->DataCube(i, TempBuf, ChunkSize, 0); } //delete [] TempBuf; } dataFile.close(); return true; }