⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 consio.cpp

📁 source code for unrar3.3.4,uppack the .rar files,for multi-os
💻 CPP
字号:
#include "rar.hpp"#ifndef GUI#include "log.cpp"#endifstatic void RawPrint(char *Msg,MESSAGE_TYPE MessageType);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)    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:      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 SILENTvoid Alarm(){#ifndef SFX_MODULE  if (Sound)    putchar('\007');#endif}#endif#ifndef SILENT#ifndef GUIvoid 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)  fgets(Str,MaxLength-1,stdin);#else  strncpy(Str,getpass(""),MaxLength-1);#endif  RemoveLF(Str);}#endif#endif#if !defined(GUI) && !defined(SILENT)unsigned int GetKey(){#ifdef SILENT  return(0);#else  char Str[80];#ifdef __GNUC__  fgets(Str,sizeof(Str),stdin);  return(Str[0]);#else  File SrcFile;  SrcFile.SetHandleType(FILE_HANDLESTD);  SrcFile.Read(Str,sizeof(Str));  return(Str[0]);#endif#endif}#endif#ifndef SILENTbool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength){  Alarm();  while (true)  {    char PromptStr[256];#if defined(_EMX) || defined(_BEOS)    strcpy(PromptStr,St(MAskPswEcho));#else    strcpy(PromptStr,St(MAskPsw));#endif    if (Type!=PASSWORD_GLOBAL)    {      strcat(PromptStr,St(MFor));      strcat(PromptStr,PointToName(FileName));    }    eprintf("\n%s: ",PromptStr);    GetPasswordText(Password,MaxLength);    if (*Password==0 && Type==PASSWORD_GLOBAL)      return(false);    if (Type==PASSWORD_GLOBAL)    {      strcpy(PromptStr,St(MReAskPsw));      eprintf(PromptStr);      char CmpStr[256];      GetPasswordText(CmpStr,sizeof(CmpStr));      if (*CmpStr==0 || strcmp(Password,CmpStr)!=0)      {        strcpy(PromptStr,St(MNotMatchPsw));/*#ifdef _WIN_32        CharToOem(PromptStr,PromptStr);#endif*/        eprintf(PromptStr);        memset(Password,0,MaxLength);        memset(CmpStr,0,sizeof(CmpStr));        continue;      }      memset(CmpStr,0,sizeof(CmpStr));    }    break;  }  return(true);}#endif#if !defined(GUI) && !defined(SILENT)int Ask(const char *AskStr){  const int MaxItems=10;  char Item[MaxItems][40];  int ItemKeyPos[MaxItems],NumItems=0;  for (const char *NextItem=AskStr;NextItem!=NULL;NextItem=strchr(NextItem+1,'_'))  {    char *CurItem=Item[NumItems];    strncpy(CurItem,NextItem+1,sizeof(Item[0]));    char *EndItem=strchr(CurItem,'_');    if (EndItem!=NULL)      *EndItem=0;    int KeyPos=0,CurKey;    while ((CurKey=CurItem[KeyPos])!=0)    {      bool Found=false;      for (int I=0;I<NumItems && !Found;I++)        if (loctoupper(Item[I][ItemKeyPos[I]])==loctoupper(CurKey))          Found=true;      if (!Found && CurKey!=' ')        break;      KeyPos++;    }    ItemKeyPos[NumItems]=KeyPos;    NumItems++;  }  for (int I=0;I<NumItems;I++)  {    eprintf(I==0 ? (NumItems>4 ? "\n":" "):", ");    int KeyPos=ItemKeyPos[I];    for (int J=0;J<KeyPos;J++)      eprintf("%c",Item[I][J]);    eprintf("[%c]%s",Item[I][KeyPos],&Item[I][KeyPos+1]);  }  eprintf(" ");  int Ch=GetKey();#if defined(_WIN_32)  OemToCharBuff((LPCSTR)&Ch,(LPTSTR)&Ch,1);#endif  Ch=loctoupper(Ch);  for (int I=0;I<NumItems;I++)    if (Ch==Item[I][ItemKeyPos[I]])      return(I+1);  return(0);}#endifint KbdAnsi(char *Addr,int Size){  int RetCode=0;#ifndef GUI  for (int I=0;I<Size;I++)    if (Addr[I]==27 && Addr[I+1]=='[')    {      for (int J=I+2;J<Size;J++)      {        if (Addr[J]=='\"')          return(2);        if (!isdigit(Addr[J]) && Addr[J]!=';')          break;      }      RetCode=1;    }#endif  return(RetCode);}void OutComment(char *Comment,int Size){#ifndef GUI  if (KbdAnsi(Comment,Size)==2)    return;  const int MaxOutSize=0x400;  for (int I=0;I<Size;I+=MaxOutSize)  {    char Msg[MaxOutSize+1];    int CopySize=Min(MaxOutSize,Size-I);    strncpy(Msg,Comment+I,CopySize);    Msg[CopySize]=0;    mprintf("%s",Msg);  }  mprintf("\n");#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -