void StatusMessageList::LoadFile(TLineReader &reader) { int ms; // Found ms for delay const TCHAR **location; // Where to put the data bool some_data; // Did we find some in the last loop... // Init first entry _init_Status(StatusMessageData_Size); some_data = false; /* Read from the file */ TCHAR *buffer; const TCHAR *key, *value; while ((StatusMessageData_Size < MAXSTATUSMESSAGECACHE) && (buffer = reader.read()) != NULL) { // Check valid line? If not valid, assume next record (primative, but works ok!) if (*buffer == _T('#') || !parse_assignment(buffer, key, value)) { // Global counter (only if the last entry had some data) if (some_data) { StatusMessageData_Size++; some_data = false; _init_Status(StatusMessageData_Size); } } else { location = NULL; if (_tcscmp(key, _T("key")) == 0) { some_data = true; // Success, we have a real entry location = &StatusMessageData[StatusMessageData_Size].key; } else if (_tcscmp(key, _T("sound")) == 0) { StatusMessageData[StatusMessageData_Size].doSound = true; location = &StatusMessageData[StatusMessageData_Size].sound; } else if (_tcscmp(key, _T("delay")) == 0) { TCHAR *endptr; ms = _tcstol(value, &endptr, 10); if (endptr > value) StatusMessageData[StatusMessageData_Size].delay_ms = ms; } else if (_tcscmp(key, _T("hide")) == 0) { if (_tcscmp(value, _T("yes")) == 0) StatusMessageData[StatusMessageData_Size].doStatus = false; } // Do we have somewhere to put this && // is it currently empty ? (prevent lost at startup) if (location && (_tcscmp(*location, _T("")) == 0)) { // TODO code: this picks up memory lost from no entry, but not duplicates - fix. if (*location) { // JMW fix memory leak free((void*)*location); } *location = StringMallocParse(value); } } } // How many we really got (blank next just in case) StatusMessageData_Size++; _init_Status(StatusMessageData_Size); }
void StatusMessageList::LoadFile() { StartupStore(TEXT("Loading status file\n")); TCHAR szFile1[MAX_PATH] = TEXT("\0"); FILE *fp=NULL; // Open file from registry GetRegistryString(szRegistryStatusFile, szFile1, MAX_PATH); ExpandLocalPath(szFile1); SetRegistryString(szRegistryStatusFile, TEXT("\0")); if (_tcslen(szFile1)>0) fp = _tfopen(szFile1, TEXT("rt")); // Unable to open file if (fp == NULL) return; // TODO code: Safer sizes, strings etc - use C++ (can scanf restrict length?) TCHAR buffer[2049]; // Buffer for all TCHAR key[2049]; // key from scanf TCHAR value[2049]; // value from scanf int ms; // Found ms for delay const TCHAR **location; // Where to put the data int found; // Entries found from scanf bool some_data; // Did we find some in the last loop... // Init first entry _init_Status(StatusMessageData_Size); some_data = false; /* Read from the file */ while ( (StatusMessageData_Size < MAXSTATUSMESSAGECACHE) && _fgetts(buffer, 2048, fp) && ((found = _stscanf(buffer, TEXT("%[^#=]=%[^\n]\n"), key, value)) != EOF) ) { // Check valid line? If not valid, assume next record (primative, but works ok!) if ((found != 2) || key[0] == 0 || value[0] == 0) { // Global counter (only if the last entry had some data) if (some_data) { StatusMessageData_Size++; some_data = false; _init_Status(StatusMessageData_Size); } } else { location = NULL; if (_tcscmp(key, TEXT("key")) == 0) { some_data = true; // Success, we have a real entry location = &StatusMessageData[StatusMessageData_Size].key; } else if (_tcscmp(key, TEXT("sound")) == 0) { StatusMessageData[StatusMessageData_Size].doSound = true; location = &StatusMessageData[StatusMessageData_Size].sound; } else if (_tcscmp(key, TEXT("delay")) == 0) { if (_stscanf(value, TEXT("%d"), &ms) == 1) StatusMessageData[StatusMessageData_Size].delay_ms = ms; } else if (_tcscmp(key, TEXT("hide")) == 0) { if (_tcscmp(value, TEXT("yes")) == 0) StatusMessageData[StatusMessageData_Size].doStatus = false; } // Do we have somewhere to put this && is it currently empty ? (prevent lost at startup) if (location && (_tcscmp(*location, TEXT("")) == 0)) { // TODO code: this picks up memory lost from no entry, but not duplicates - fix. if (*location) { // JMW fix memory leak free((void*)*location); } *location = StringMallocParse(value); } } } // How many we really got (blank next just in case) StatusMessageData_Size++; _init_Status(StatusMessageData_Size); // file was ok, so save it to registry ContractLocalPath(szFile1); SetRegistryString(szRegistryStatusFile, szFile1); fclose(fp); }
void StatusMessageList::LoadFile(TLineReader &reader) { int ms; // Found ms for delay const TCHAR **location; // Where to put the data bool some_data; // Did we find some in the last loop... // Init first entry StatusMessageSTRUCT current; _init_Status(current); some_data = false; /* Read from the file */ TCHAR *buffer; const TCHAR *key, *value; while ((buffer = reader.read()) != NULL) { // Check valid line? If not valid, assume next record (primative, but works ok!) if (*buffer == _T('#') || !parse_assignment(buffer, key, value)) { // Global counter (only if the last entry had some data) if (some_data) { StatusMessageData.append(current); some_data = false; _init_Status(current); if (StatusMessageData.full()) break; } } else { location = NULL; if (_tcscmp(key, _T("key")) == 0) { some_data = true; // Success, we have a real entry location = ¤t.key; } else if (_tcscmp(key, _T("sound")) == 0) { current.doSound = true; location = ¤t.sound; } else if (_tcscmp(key, _T("delay")) == 0) { TCHAR *endptr; ms = _tcstol(value, &endptr, 10); if (endptr > value) current.delay_ms = ms; } else if (_tcscmp(key, _T("hide")) == 0) { if (_tcscmp(value, _T("yes")) == 0) current.doStatus = false; } // Do we have somewhere to put this && // is it currently empty ? (prevent lost at startup) if (location && (_tcscmp(*location, _T("")) == 0)) { // TODO code: this picks up memory lost from no entry, but not duplicates - fix. if (*location) { // JMW fix memory leak free((void*)const_cast<TCHAR *>(*location)); } *location = UnescapeBackslash(value); } } } if (some_data) StatusMessageData.append(current); }