void IntToExt(const char *Src,char *Dest) { #ifdef _WIN_ALL OemToCharA(Src,Dest); #else if (Dest!=Src) strcpy(Dest,Src); #endif }
BOOL CConverter::Open(LPCTSTR pszFileName, UINT nOpenFlags, CFileException* pException) { USES_CONVERSION; // we convert to oem and back because of the following case // test(c).txt becomes testc.txt in OEM and stays testc.txt to Ansi char buf[_MAX_PATH]; strcpy(buf, T2CA(pszFileName)); CharToOemA(buf, buf); OemToCharA(buf, buf); LPTSTR lpszFileNameT = A2T(buf); // let's make sure we could do what is wanted directly even though we aren't m_bCloseOnDelete = FALSE; #if _MSC_VER >= 1400 m_hFile = hFileNull; #else m_hFile = (UINT)hFileNull; #endif BOOL bOpen = CFile::Open(lpszFileNameT, nOpenFlags, pException); CFile::Close(); if (!bOpen) return FALSE; m_bForeignToRtf = !(nOpenFlags & (CFile::modeReadWrite | CFile::modeWrite)); // check for reading empty file if (m_bForeignToRtf) { CFileStatus stat; if (CFile::GetStatus(lpszFileNameT, stat) && stat.m_size == 0) return TRUE; } //set security attributes to inherit handle SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; //create the events m_hEventFile = CreateEvent(&sa, TRUE, FALSE, NULL); m_hEventConv = CreateEvent(&sa, TRUE, FALSE, NULL); //create the converter thread and create the events CharToOemA(buf, buf); ASSERT(m_hFileName == NULL); m_hFileName = StringToHGLOBAL(buf); m_pThis = this; m_bDone = FALSE; m_hBuff = GlobalAlloc(GHND, BUFFSIZE); ASSERT(m_hBuff != NULL); AfxBeginThread(ConverterThread, this, THREAD_PRIORITY_NORMAL, 0, 0, &sa); return TRUE; }
void LocalUpperInit() { for (unsigned int I=0; I<ARRAYSIZE(LowerToUpper); I++) { char CvtStr[]={I,L'\0'},ReverseCvtStr[2]; LowerToUpper[I]=UpperToLower[I]=I; OemToCharA(CvtStr,CvtStr); CharToOemA(CvtStr,ReverseCvtStr); IsUpperOrLower[I]=0; if (IsCharAlphaA(CvtStr[0]) && ReverseCvtStr[0]==static_cast<char>(I)) { IsUpperOrLower[I]=IsCharLowerA(CvtStr[0])?1:(IsCharUpperA(CvtStr[0])?2:0); CharUpperA(CvtStr); CharToOemA(CvtStr,CvtStr); LowerToUpper[I]=CvtStr[0]; CvtStr[0]=I; OemToCharA(CvtStr,CvtStr); CharLowerA(CvtStr); CharToOemA(CvtStr,CvtStr); UpperToLower[I]=CvtStr[0]; } } }
LPCSTR CConvOem::fromOemA(LPCSTR const lpszSrc) { if (m_blInvalidBuff || !lpszSrc) { SetLastError(ERROR_INVALID_ADDRESS); return 0; } size_t len(strlen(lpszSrc)); len++; if (len > m_BuffSize) { SetLastError(ERROR_INVALID_ADDRESS); return 0; } OemToCharA(lpszSrc, m_szBuff); return m_szBuff; }
/*********************************************************************** * OemToAnsi (KEYBOARD.6) */ INT16 WINAPI OemToAnsi16( LPCSTR s, LPSTR d ) { OemToCharA( s, d ); return -1; }
int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW) { DataSet *Data=(DataSet *)hArcData; try { Data->Cmd.DllError=0; if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT || Operation==RAR_SKIP && !Data->Arc.Solid) { if (Data->Arc.Volume && Data->Arc.GetHeaderType()==FILE_HEAD && (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Extract.SignatureFound=false; Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return(0); } else return(ERAR_EOPEN); Data->Arc.SeekToNext(); } else { Data->Cmd.DllOpMode=Operation; if (DestPath!=NULL || DestName!=NULL) { #ifdef _WIN_ALL OemToCharA(NullToEmpty(DestPath),Data->Cmd.ExtrPath); #else strcpy(Data->Cmd.ExtrPath,NullToEmpty(DestPath)); #endif AddEndSlash(Data->Cmd.ExtrPath); #ifdef _WIN_ALL OemToCharA(NullToEmpty(DestName),Data->Cmd.DllDestName); #else strcpy(Data->Cmd.DllDestName,NullToEmpty(DestName)); #endif } else { *Data->Cmd.ExtrPath=0; *Data->Cmd.DllDestName=0; } if (DestPathW!=NULL || DestNameW!=NULL) { wcsncpy(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2); AddEndSlash(Data->Cmd.ExtrPathW); wcsncpy(Data->Cmd.DllDestNameW,NullToEmpty(DestNameW),NM-1); if (*Data->Cmd.DllDestNameW!=0 && *Data->Cmd.DllDestName==0) WideToChar(Data->Cmd.DllDestNameW,Data->Cmd.DllDestName); } else { *Data->Cmd.ExtrPathW=0; *Data->Cmd.DllDestNameW=0; } strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T"); Data->Cmd.Test=Operation!=RAR_EXTRACT; bool Repeat=false; Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); // Now we process extra file information if any. // // Archive can be closed if we process volumes, next volume is missing // and current one is already removed or deleted. So we need to check // if archive is still open to avoid calling file operations on // the invalid file handle. Some of our file operations like Seek() // process such invalid handle correctly, some not. while (Data->Arc.IsOpened() && Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD) { Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); Data->Arc.SeekToNext(); } Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); } } catch (RAR_EXIT ErrCode) { return(Data->Cmd.DllError!=0 ? Data->Cmd.DllError:RarErrorToDll(ErrCode)); } return(Data->Cmd.DllError); }
int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *D) { DataSet *Data=(DataSet *)hArcData; try { if ((Data->HeaderSize=(int)Data->Arc.SearchBlock(FILE_HEAD))<=0) { if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD && (Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Extract.SignatureFound=false; Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return(RARReadHeaderEx(hArcData,D)); } else return(ERAR_EOPEN); return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE); } if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)!=0) { int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL); if (Code==0) return(RARReadHeaderEx(hArcData,D)); else return(Code); } strncpyz(D->ArcName,Data->Arc.FileName,ASIZE(D->ArcName)); if (*Data->Arc.FileNameW) wcsncpy(D->ArcNameW,Data->Arc.FileNameW,ASIZE(D->ArcNameW)); else CharToWide(Data->Arc.FileName,D->ArcNameW); strncpyz(D->FileName,Data->Arc.NewLhd.FileName,ASIZE(D->FileName)); if (*Data->Arc.NewLhd.FileNameW) wcsncpy(D->FileNameW,Data->Arc.NewLhd.FileNameW,ASIZE(D->FileNameW)); else { #ifdef _WIN_ALL char AnsiName[NM]; OemToCharA(Data->Arc.NewLhd.FileName,AnsiName); if (!CharToWide(AnsiName,D->FileNameW,ASIZE(D->FileNameW))) *D->FileNameW=0; #else if (!CharToWide(Data->Arc.NewLhd.FileName,D->FileNameW,ASIZE(D->FileNameW))) *D->FileNameW=0; #endif } D->Flags=Data->Arc.NewLhd.Flags; D->PackSize=Data->Arc.NewLhd.PackSize; D->PackSizeHigh=Data->Arc.NewLhd.HighPackSize; D->UnpSize=Data->Arc.NewLhd.UnpSize; D->UnpSizeHigh=Data->Arc.NewLhd.HighUnpSize; D->HostOS=Data->Arc.NewLhd.HostOS; D->FileCRC=Data->Arc.NewLhd.FileCRC; D->FileTime=Data->Arc.NewLhd.FileTime; D->UnpVer=Data->Arc.NewLhd.UnpVer; D->Method=Data->Arc.NewLhd.Method; D->FileAttr=Data->Arc.NewLhd.FileAttr; D->CmtSize=0; D->CmtState=0; } catch (RAR_EXIT ErrCode) { return(Data->Cmd.DllError!=0 ? Data->Cmd.DllError:RarErrorToDll(ErrCode)); } return(0); }
int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW) { DataSet *Data=(DataSet *)hArcData; try { Data->Cmd.DllError=0; if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT || Operation==RAR_SKIP && !Data->Arc.Solid) { if (Data->Arc.Volume && Data->Arc.GetHeaderType()==HEAD_FILE && Data->Arc.FileHead.SplitAfter) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return ERAR_SUCCESS; } else return ERAR_EOPEN; Data->Arc.SeekToNext(); } else { Data->Cmd.DllOpMode=Operation; *Data->Cmd.ExtrPath=0; *Data->Cmd.DllDestName=0; if (DestPath!=NULL) { char ExtrPathA[NM]; strncpyz(ExtrPathA,DestPath,ASIZE(ExtrPathA)-2); #ifdef _WIN_ALL // We must not apply OemToCharBuffA directly to DestPath, // because we do not know DestPath length and OemToCharBuffA // does not stop at 0. OemToCharA(ExtrPathA,ExtrPathA); #endif CharToWide(ExtrPathA,Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath)); AddEndSlash(Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath)); } if (DestName!=NULL) { char DestNameA[NM]; strncpyz(DestNameA,DestName,ASIZE(DestNameA)-2); #ifdef _WIN_ALL // We must not apply OemToCharBuffA directly to DestName, // because we do not know DestName length and OemToCharBuffA // does not stop at 0. OemToCharA(DestNameA,DestNameA); #endif CharToWide(DestNameA,Data->Cmd.DllDestName,ASIZE(Data->Cmd.DllDestName)); } if (DestPathW!=NULL) { wcsncpy(Data->Cmd.ExtrPath,DestPathW,ASIZE(Data->Cmd.ExtrPath)); AddEndSlash(Data->Cmd.ExtrPath,ASIZE(Data->Cmd.ExtrPath)); } if (DestNameW!=NULL) wcsncpyz(Data->Cmd.DllDestName,DestNameW,ASIZE(Data->Cmd.DllDestName)); wcscpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? L"X":L"T"); Data->Cmd.Test=Operation!=RAR_EXTRACT; bool Repeat=false; Data->Extract.ExtractCurrentFile(Data->Arc,Data->HeaderSize,Repeat); // Now we process extra file information if any. // // Archive can be closed if we process volumes, next volume is missing // and current one is already removed or deleted. So we need to check // if archive is still open to avoid calling file operations on // the invalid file handle. Some of our file operations like Seek() // process such invalid handle correctly, some not. while (Data->Arc.IsOpened() && Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==HEAD_SERVICE) { Data->Extract.ExtractCurrentFile(Data->Arc,Data->HeaderSize,Repeat); Data->Arc.SeekToNext(); } Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); } } catch (std::bad_alloc&) { return ERAR_NO_MEMORY; } catch (RAR_EXIT ErrCode) { return Data->Cmd.DllError!=0 ? Data->Cmd.DllError : RarErrorToDll(ErrCode); } return Data->Cmd.DllError; }
bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW, OVERWRITE_MODE Mode,bool *UserReject,int64 FileSize, uint FileTime,bool WriteOnly) { if (UserReject!=NULL) *UserReject=false; #if defined(_WIN_ALL) && !defined(_WIN_CE) bool ShortNameChanged=false; #endif while (FileExist(Name,NameW)) { #if defined(_WIN_ALL) && !defined(_WIN_CE) if (!ShortNameChanged) { // Avoid the infinite loop if UpdateExistingShortName returns // the same name. ShortNameChanged=true; // Maybe our long name matches the short name of existing file. // Let's check if we can change the short name. wchar WideName[NM]; GetWideName(Name,NameW,WideName,ASIZE(WideName)); if (UpdateExistingShortName(WideName)) { if (Name!=NULL && *Name!=0) WideToChar(WideName,Name); if (NameW!=NULL && *NameW!=0) wcscpy(NameW,WideName); continue; } } // Allow short name check again. It is necessary, because rename and // autorename below can change the name, so we need to check it again. ShortNameChanged=false; #endif if (Mode==OVERWRITE_NONE) { if (UserReject!=NULL) *UserReject=true; return(false); } // Must be before Cmd->AllYes check or -y switch would override -or. if (Mode==OVERWRITE_AUTORENAME) { if (!GetAutoRenamedName(Name,NameW)) Mode=OVERWRITE_DEFAULT; continue; } #ifdef SILENT Mode=OVERWRITE_ALL; #endif // This check must be after OVERWRITE_AUTORENAME processing or -y switch // would override -or. if (Cmd->AllYes || Mode==OVERWRITE_ALL) break; if (Mode==OVERWRITE_DEFAULT || Mode==OVERWRITE_FORCE_ASK) { char NewName[NM]; wchar NewNameW[NM]; *NewNameW=0; eprintf(St(MFileExists),Name); int Choice=Ask(St(MYesNoAllRenQ)); if (Choice==1) break; if (Choice==2) { if (UserReject!=NULL) *UserReject=true; return(false); } if (Choice==3) { Cmd->Overwrite=OVERWRITE_ALL; break; } if (Choice==4) { if (UserReject!=NULL) *UserReject=true; Cmd->Overwrite=OVERWRITE_NONE; return(false); } if (Choice==5) { #ifndef GUI mprintf(St(MAskNewName)); #ifdef _WIN_ALL File SrcFile; SrcFile.SetHandleType(FILE_HANDLESTD); int Size=SrcFile.Read(NewName,sizeof(NewName)-1); NewName[Size]=0; OemToCharA(NewName,NewName); #else if (fgets(NewName,sizeof(NewName),stdin)==NULL) { // Process fgets failure as if user answered 'No'. if (UserReject!=NULL) *UserReject=true; return(false); } #endif RemoveLF(NewName); #endif if (PointToName(NewName)==NewName) strcpy(PointToName(Name),NewName); else strcpy(Name,NewName); if (NameW!=NULL) { if (PointToName(NewNameW)==NewNameW) wcscpy(PointToName(NameW),NewNameW); else wcscpy(NameW,NewNameW); } continue; } if (Choice==6) ErrHandler.Exit(RARX_USERBREAK); } } uint FileMode=WriteOnly ? FMF_WRITE|FMF_SHAREREAD:FMF_UPDATE|FMF_SHAREREAD; if (NewFile!=NULL && NewFile->Create(Name,NameW,FileMode)) return(true); PrepareToDelete(Name,NameW); CreatePath(Name,NameW,true); return(NewFile!=NULL ? NewFile->Create(Name,NameW,FileMode):DelFile(Name,NameW)); }
bool ReadTextFile( const char *Name, const wchar *NameW, StringList *List, bool Config, bool AbortOnError, RAR_CHARSET SrcCharset, bool Unquote, bool SkipComments, bool ExpandEnvStr) { char FileName[NM]; *FileName=0; if (Name!=NULL) { if (Config) GetConfigName(Name,FileName,true); else strcpy(FileName,Name); } wchar FileNameW[NM]; *FileNameW=0; #ifdef _WIN_ALL if (NameW!=NULL) { if (Config) GetConfigName(NameW,FileNameW,true); else wcscpy(FileNameW,NameW); } #endif File SrcFile; if ((FileName!=NULL && *FileName!=0) || (FileNameW!=NULL && *FileNameW!=0)) { bool OpenCode=AbortOnError ? SrcFile.WOpen(FileName,FileNameW):SrcFile.Open(FileName,FileNameW,0); if (!OpenCode) { if (AbortOnError) ErrHandler.Exit(RARX_OPEN); return(false); } } else SrcFile.SetHandleType(FILE_HANDLESTD); unsigned int DataSize=0,ReadSize; const int ReadBlock=1024; Array<char> Data(ReadBlock+5); while ((ReadSize=SrcFile.Read(&Data[DataSize],ReadBlock))!=0) { DataSize+=ReadSize; Data.Add(ReadSize); } memset(&Data[DataSize],0,5); if ((SrcCharset==RCH_UNICODE) || (SrcCharset==RCH_DEFAULT && IsUnicode((byte *)&Data[0],DataSize))) { // Unicode in native system format, can be more than 2 bytes per character. Array<wchar> DataW(Data.Size()/2+1); for (size_t I=2;I<Data.Size()-1;I+=2) { // Need to convert Data to (byte) first to prevent the sign extension // to higher bytes. DataW[(I-2)/2]=(wchar)((byte)Data[I])+(wchar)((byte)Data[I+1])*256; } wchar *CurStr=&DataW[0]; Array<char> AnsiName; while (*CurStr!=0) { wchar *NextStr=CurStr,*CmtPtr=NULL; while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0) { if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/') { *NextStr=0; CmtPtr=NextStr; } NextStr++; } *NextStr=0; for (wchar *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--) { if (*SpacePtr!=' ' && *SpacePtr!='\t') break; *SpacePtr=0; } if (*CurStr) { // Length and AddSize must be defined as signed, because AddSize // can be negative. int Length=(int)wcslen(CurStr); int AddSize=4*(Length-(int)AnsiName.Size()+1); if (AddSize>0) AnsiName.Add(AddSize); if (Unquote && *CurStr=='\"' && CurStr[Length-1]=='\"') { CurStr[Length-1]=0; CurStr++; } WideToChar(CurStr,&AnsiName[0],AnsiName.Size()); bool Expanded=false; #if defined(_WIN_ALL) && !defined(_WIN_CE) if (ExpandEnvStr && *CurStr=='%') { // Expanding environment variables in Windows version. char ExpName[NM]; wchar ExpNameW[NM]; *ExpNameW=0; int ret,retw=1; ret=ExpandEnvironmentStringsA(&AnsiName[0],ExpName,ASIZE(ExpName)); if (ret!=0 && WinNT()) retw=ExpandEnvironmentStringsW(CurStr,ExpNameW,ASIZE(ExpNameW)); Expanded=ret!=0 && ret<ASIZE(ExpName) && retw!=0 && retw<ASIZE(ExpNameW); if (Expanded) List->AddString(ExpName,ExpNameW); } #endif if (!Expanded) List->AddString(&AnsiName[0],CurStr); } CurStr=NextStr+1; while (*CurStr=='\r' || *CurStr=='\n') CurStr++; } } else { char *CurStr=&Data[0]; while (*CurStr!=0) { char *NextStr=CurStr,*CmtPtr=NULL; while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0) { if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/') { *NextStr=0; CmtPtr=NextStr; } NextStr++; } *NextStr=0; for (char *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--) { if (*SpacePtr!=' ' && *SpacePtr!='\t') break; *SpacePtr=0; } if (*CurStr) { if (Unquote && *CurStr=='\"') { size_t Length=strlen(CurStr); if (CurStr[Length-1]=='\"') { CurStr[Length-1]=0; CurStr++; } } #if defined(_WIN_ALL) if (SrcCharset==RCH_OEM) OemToCharA(CurStr,CurStr); #endif bool Expanded=false; #if defined(_WIN_ALL) && !defined(_WIN_CE) if (ExpandEnvStr && *CurStr=='%') { // Expanding environment variables in Windows version. char ExpName[NM]; int ret=ExpandEnvironmentStringsA(CurStr,ExpName,ASIZE(ExpName)); Expanded=ret!=0 && ret<ASIZE(ExpName); if (Expanded) List->AddString(ExpName); } #endif if (!Expanded) List->AddString(CurStr); } CurStr=NextStr+1; while (*CurStr=='\r' || *CurStr=='\n') CurStr++; } } return(true); }
/************************************************************************* * DoEnvironmentSubst [SHELL.37] * * Replace %KEYWORD% in the str with the value of variable KEYWORD * from "DOS" environment. If it is not found the %KEYWORD% is left * intact. If the buffer is too small, str is not modified. * * PARAMS * str [I] '\0' terminated string with %keyword%. * [O] '\0' terminated string with %keyword% substituted. * length [I] size of str. * * RETURNS * str length in the LOWORD and 1 in HIWORD if subst was successful. */ DWORD WINAPI DoEnvironmentSubst16(LPSTR str,WORD length) { LPSTR lpEnv = MapSL(GetDOSEnvironment16()); LPSTR lpstr = str; LPSTR lpend; LPSTR lpBuffer = HeapAlloc( GetProcessHeap(), 0, length); WORD bufCnt = 0; WORD envKeyLen; LPSTR lpKey; WORD retStatus = 0; WORD retLength = length; CharToOemA(str,str); TRACE("accept %s\n", str); while( *lpstr && bufCnt <= length - 1 ) { if ( *lpstr != '%' ) { lpBuffer[bufCnt++] = *lpstr++; continue; } for( lpend = lpstr + 1; *lpend && *lpend != '%'; lpend++) /**/; envKeyLen = lpend - lpstr - 1; if( *lpend != '%' || envKeyLen == 0) goto err; /* "%\0" or "%%" found; back off and whine */ *lpend = '\0'; lpKey = SHELL_FindString(lpEnv, lpstr+1); *lpend = '%'; if( lpKey ) { int l = strlen(lpKey); if( bufCnt + l > length - 1 ) goto err; memcpy(lpBuffer + bufCnt, lpKey, l); bufCnt += l; } else { /* Keyword not found; Leave the %KEYWORD% intact */ if( bufCnt + envKeyLen + 2 > length - 1 ) goto err; memcpy(lpBuffer + bufCnt, lpstr, envKeyLen + 2); bufCnt += envKeyLen + 2; } lpstr = lpend + 1; } if (!*lpstr && bufCnt <= length - 1) { memcpy(str,lpBuffer, bufCnt); str[bufCnt] = '\0'; retLength = bufCnt + 1; retStatus = 1; } err: if (!retStatus) WARN("-- Env subst aborted - string too short or invalid input\n"); TRACE("-- return %s\n", str); OemToCharA(str,str); HeapFree( GetProcessHeap(), 0, lpBuffer); return (DWORD)MAKELONG(retLength, retStatus); }
/************************************************************************* * DoEnvironmentSubst [SHELL.37] * * Replace %KEYWORD% in the str with the value of variable KEYWORD * from "DOS" environment. */ DWORD WINAPI DoEnvironmentSubst16(LPSTR str,WORD length) { LPSTR lpEnv = MapSL(GetDOSEnvironment16()); LPSTR lpBuffer = (LPSTR)HeapAlloc( GetProcessHeap(), 0, length); LPSTR lpstr = str; LPSTR lpbstr = lpBuffer; CharToOemA(str,str); TRACE("accept %s\n", str); while( *lpstr && lpbstr - lpBuffer < length ) { LPSTR lpend = lpstr; if( *lpstr == '%' ) { do { lpend++; } while( *lpend && *lpend != '%' ); if( *lpend == '%' && lpend - lpstr > 1 ) /* found key */ { LPSTR lpKey; *lpend = '\0'; lpKey = SHELL_FindString(lpEnv, lpstr+1); if( lpKey ) /* found key value */ { int l = strlen(lpKey); if( l > length - (lpbstr - lpBuffer) - 1 ) { WARN("-- Env subst aborted - string too short\n"); *lpend = '%'; break; } strcpy(lpbstr, lpKey); lpbstr += l; } else break; *lpend = '%'; lpstr = lpend + 1; } else break; /* back off and whine */ continue; } *lpbstr++ = *lpstr++; } *lpbstr = '\0'; if( lpstr - str == strlen(str) ) { strncpy(str, lpBuffer, length); length = 1; } else length = 0; TRACE("-- return %s\n", str); OemToCharA(str,str); HeapFree( GetProcessHeap(), 0, lpBuffer); /* Return str length in the LOWORD * and 1 in HIWORD if subst was successful. */ return (DWORD)MAKELONG(strlen(str), length); }
int main(void) { setlocale(LC_ALL, ".1251");// Русификация // Создание входящего потока и его открытие ifstream inStream("readme.txt"); // Проверка на открытие файла if (!inStream.is_open()) { cout << "Ошибка открытия файла file.txt" << endl; system("pause"); exit(1); } // Создание динамического массива NOTE NOTE *notes = new NOTE[8]; char tmpSurname[200];// Временная переменная фамилии int tmpPhoneNumber(0);// Временная переменная номера телефона int tmpBirthday[3] = { 0 };// Временная переменная даты рождения char tmpSeparator(' ');// Символ разделяющий дату рождения // Цикл чтения из файла for (int i = 0; i < 8; i++) { // Считывание данных во временные переменные inStream >> tmpSurname >> tmpPhoneNumber >> tmpBirthday[0] >> tmpSeparator >> tmpBirthday[1] >> tmpSeparator >> tmpBirthday[2]; // Создание временного объекта NOTE NOTE tmpNote(tmpSurname, tmpPhoneNumber, tmpBirthday[0], tmpBirthday[1], tmpBirthday[2]); // Вставка временного объекта в массив notes notes[i] = tmpNote; } // Закрываем поток inStream.close(); /* Вывод массива до сортировки */ cout << endl << "Вывод массива до сортировки: " << endl << endl; for (int i = 0; i < 8; i++) notes[i].show(); // Сортируем массив NOTE selectSort(notes, 8); /* Вывод массива после сортировки */ cout << endl << "Вывод массива после сортировки: " << endl << endl; for (int i = 0; i < 8; i++) notes[i].show(); // Ввод месяца cout << "Введите пожалуйста фамилию для сравнения: "; cin >> tmpSurname; // Преобразование символов из иероглифов в русскую раскладку OemToCharA(tmpSurname, tmpSurname); // Очистка экрана system("cls"); // Поиск информации for (int i = 0, count = 0; i <= 8; i++) { // Если пройдясь по всем записям и не нашлось ни одного совпадения if ((i == 8) && count == 0) cout << "Нет соответствующей записи" << endl; // Если прошлись по всем записям и нашлись совпадения else if (i == 8 && count != 0) break; // Если не закончились записи, ищем совпадения else if (notes[i] == tmpSurname) { // Вывод notes[i].show(); // Увеличение счётчика count++; } } // Приостановка программы для просмотра результата system("pause"); return NULL;// Передача управления операционной системе }
bool Archive::GetComment(Array<wchar> *CmtData) { if (!MainComment) return false; SaveFilePos SavePos(*this); #ifndef SFX_MODULE ushort CmtLength; if (Format==RARFMT14) { Seek(SFXSize+SIZEOF_MAINHEAD14,SEEK_SET); CmtLength=GetByte(); CmtLength+=(GetByte()<<8); } else #endif { if (MainHead.CommentInHeader) { // Old style (RAR 2.9) archive comment embedded into the main // archive header. Seek(SFXSize+SIZEOF_MARKHEAD3+SIZEOF_MAINHEAD3,SEEK_SET); ReadHeader(); } else { // Current (RAR 3.0+) version of archive comment. Seek(GetStartPos(),SEEK_SET); return SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData); } #ifndef SFX_MODULE // Old style (RAR 2.9) comment header embedded into the main // archive header. if (BrokenHeader) { uiMsg(UIERROR_CMTBROKEN,FileName); return false; } CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD; #endif } #ifndef SFX_MODULE if (Format==RARFMT14 && MainHead.PackComment || Format!=RARFMT14 && CommHead.Method!=0x30) { if (Format!=RARFMT14 && (CommHead.UnpVer < 15 || CommHead.UnpVer > VER_UNPACK || CommHead.Method > 0x35)) return(false); ComprDataIO DataIO; DataIO.SetTestMode(true); uint UnpCmtLength; if (Format==RARFMT14) { #ifdef RAR_NOCRYPT return(false); #else UnpCmtLength=GetByte(); UnpCmtLength+=(GetByte()<<8); CmtLength-=2; DataIO.SetCmt13Encryption(); CommHead.UnpVer=15; #endif } else UnpCmtLength=CommHead.UnpSize; DataIO.SetFiles(this,NULL); DataIO.EnableShowProgress(false); DataIO.SetPackedSizeToRead(CmtLength); DataIO.UnpHash.Init(HASH_CRC32,1); Unpack CmtUnpack(&DataIO); CmtUnpack.Init(0x10000,false); CmtUnpack.SetDestSize(UnpCmtLength); CmtUnpack.DoUnpack(CommHead.UnpVer,false); if (Format!=RARFMT14 && (DataIO.UnpHash.GetCRC32()&0xffff)!=CommHead.CommCRC) { uiMsg(UIERROR_CMTBROKEN,FileName); return false; } else { byte *UnpData; size_t UnpDataSize; DataIO.GetUnpackedData(&UnpData,&UnpDataSize); #ifdef _WIN_ALL OemToCharBuffA((char *)UnpData,(char *)UnpData,(DWORD)UnpDataSize); #endif CmtData->Alloc(UnpDataSize+1); memset(CmtData->Addr(0),0,CmtData->Size()*sizeof(wchar)); CharToWide((char *)UnpData,CmtData->Addr(0),UnpDataSize); CmtData->Alloc(wcslen(CmtData->Addr(0))); } } else { Array<byte> CmtRaw(CmtLength); Read(&CmtRaw[0],CmtLength); if (Format!=RARFMT14 && CommHead.CommCRC!=(~CRC32(0xffffffff,&CmtRaw[0],CmtLength)&0xffff)) { uiMsg(UIERROR_CMTBROKEN,FileName); return false; } CmtData->Alloc(CmtLength+1); CmtRaw.Push(0); #ifdef _WIN_ALL OemToCharA((char *)&CmtRaw[0],(char *)&CmtRaw[0]); #endif CharToWide((char *)&CmtRaw[0],CmtData->Addr(0),CmtLength); CmtData->Alloc(wcslen(CmtData->Addr(0))); } #endif return CmtData->Size() > 0; }