#include "rar.hpp" #ifndef GUI #include "log.cpp" #endif static int KbdAnsi(char *Addr,int Size); #if !defined(GUI) && !defined(SILENT) static void RawPrint(char *Msg,MESSAGE_TYPE MessageType); static uint GetKey(); #endif static MESSAGE_TYPE MsgStream=MSG_STDOUT; static bool Sound=false; const int MaxMsgSize=2*NM+2048; void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound) { ::MsgStream=MsgStream; ::Sound=Sound; } #if !defined(GUI) && !defined(SILENT) void mprintf(const char *fmt,...) { if (MsgStream==MSG_NULL || MsgStream==MSG_ERRONLY) return; safebuf char Msg[MaxMsgSize]; va_list argptr; va_start(argptr,fmt); vsprintf(Msg,fmt,argptr); RawPrint(Msg,MsgStream); va_end(argptr); } #endif #if !defined(GUI) && !defined(SILENT) void eprintf(const char *fmt,...) { if (MsgStream==MSG_NULL) return; safebuf char Msg[MaxMsgSize]; va_list argptr; va_start(argptr,fmt); vsprintf(Msg,fmt,argptr); RawPrint(Msg,MSG_STDERR); va_end(argptr); } #endif #if !defined(GUI) && !defined(SILENT) void RawPrint(char *Msg,MESSAGE_TYPE MessageType) { File OutFile; switch(MessageType) { case MSG_STDOUT: OutFile.SetHandleType(FILE_HANDLESTD); break; case MSG_STDERR: case MSG_ERRONLY: OutFile.SetHandleType(FILE_HANDLEERR); break; default: return; } #ifdef _WIN_32 CharToOem(Msg,Msg); char OutMsg[MaxMsgSize],*OutPos=OutMsg; for (int I=0;Msg[I]!=0;I++) { if (Msg[I]=='\n' && (I==0 || Msg[I-1]!='\r')) *(OutPos++)='\r'; *(OutPos++)=Msg[I]; } *OutPos=0; strcpy(Msg,OutMsg); #endif #if defined(_UNIX) || defined(_EMX) char OutMsg[MaxMsgSize],*OutPos=OutMsg; for (int I=0;Msg[I]!=0;I++) if (Msg[I]!='\r') *(OutPos++)=Msg[I]; *OutPos=0; strcpy(Msg,OutMsg); #endif OutFile.Write(Msg,strlen(Msg)); // OutFile.Flush(); } #endif #ifndef SILENT void Alarm() { #ifndef SFX_MODULE if (Sound) putchar('\007'); #endif } #endif #ifndef SILENT #ifndef GUI void GetPasswordText(char *Str,int MaxLength) { #ifdef _WIN_32 HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE); HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE); DWORD ConInMode,ConOutMode; DWORD Read=0; GetConsoleMode(hConIn,&ConInMode); GetConsoleMode(hConOut,&ConOutMode); SetConsoleMode(hConIn,ENABLE_LINE_INPUT); SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT); ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL); Str[Read]=0; OemToChar(Str,Str); SetConsoleMode(hConIn,ConInMode); SetConsoleMode(hConOut,ConOutMode); #elif defined(_EMX) || defined(_BEOS) || defined(__sparc) || defined(sparc) || defined (__VMS) fgets(Str,MaxLength-1,stdin); #else strncpyz(Str,getpass(""),MaxLength); #endif Str[MaxLength-1]=0; RemoveLF(Str); } #endif #endif #ifndef SILENT bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength) { Alarm(); while (true) { char PromptStr[NM+256]; #if defined(_EMX) || defined(_BEOS) strcpy(PromptStr,St(MAskPswEcho)); #else strcpy(PromptStr,St(MAskPsw)); #endif if (Type!=PASSWORD_GLOBAL) { strcat(PromptStr,St(MFor)); char *NameOnly=PointToName(FileName); if (strlen(PromptStr)+strlen(NameOnly)4 ? "\n":" "):", "); int KeyPos=ItemKeyPos[I]; for (int J=0;J