home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Utilities / UnRAR / src_amiga / os.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-30  |  9.2 KB  |  519 lines

  1. int MakeDir(char *Name,UDWORD Attr)
  2. {
  3. #ifdef _WIN_32
  4.   if (mkdir(Name)==0)
  5.   {
  6.     SetFileAttributes(Name,Attr);
  7.     return(0);
  8.   }
  9.   return(-1);
  10. #endif
  11. #if defined(_UNIX) || defined(_AMIGA)
  12.   return(mkdir((Name),(mode_t)(Attr)));
  13. #endif
  14. }
  15.  
  16.  
  17. /* Generating sound MSec milliseconds duration and Freq frequency
  18. */
  19.  
  20. void MakeSound(int MSec,int Freq)
  21. {
  22.   printf("\007");
  23. }
  24.  
  25. /* Return date format:
  26.    0 - Month-Day-Year
  27.    1 - Day-Month-Year
  28.    2 - Year-Month-Day
  29. */
  30.  
  31. int DateFormat(void)
  32. {
  33.   return(1);
  34. }
  35.  
  36. /* Check is drive removable
  37.    NumDrive: 0 - A, 1 - B, ...
  38. */
  39.  
  40.  
  41. int IsRemovable(int NumDrive)
  42. {
  43. #ifdef _WIN_32
  44.   char Root[10];
  45.   sprintf(Root,"%c:\\",NumDrive+'A');
  46.   return(GetDriveType(Root)==DRIVE_REMOVABLE);
  47. #else
  48.   return(0);
  49. #endif
  50. }
  51.  
  52.  
  53. /* Display ANSI comments
  54.    Addr - comment address
  55.    Size - comment length
  56. */
  57.  
  58. void ShowAnsiComment(UBYTE *Addr,unsigned int Size)
  59. {
  60.   fwrite(Addr,1,Size,stdout);
  61.   fflush(stdout);
  62. }
  63.  
  64.  
  65. /* Input string for password
  66. */
  67.  
  68. void GetPswStr(char *Str)
  69. {
  70. #ifdef _WIN_32
  71.   HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE);
  72.   HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE);
  73.   DWORD ConInMode,ConOutMode;
  74.   DWORD Read=0;
  75.   GetConsoleMode(hConIn,&ConInMode);
  76.   GetConsoleMode(hConOut,&ConOutMode);
  77.   SetConsoleMode(hConIn,ENABLE_LINE_INPUT);
  78.   SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);
  79.   ReadConsole(hConIn,Str,sizeof(Password)-1,&Read,NULL);
  80.   Str[Read]=0;
  81.   RemoveEOL(Str);
  82.   SetConsoleMode(hConIn,ConInMode);
  83.   SetConsoleMode(hConOut,ConOutMode);
  84. #else
  85.   fgets(Str,sizeof(Password)-1,stdin);
  86. #endif
  87. }
  88.  
  89.  
  90. /* return current disk number
  91.    0 - A, 1 - B, ...
  92.    or return -1 if unknown
  93. */
  94.  
  95. int GetCurDisk(void)
  96. {
  97. #ifdef _WIN_32
  98.   unsigned int Drive;
  99.   _dos_getdrive(&Drive);
  100.   return(Drive-1);
  101. #endif
  102.  
  103. #if defined(_UNIX) || defined(_AMIGA)
  104.   return(-1);
  105. #endif
  106. }
  107.  
  108.  
  109. int GetFileStat(char *Name,struct FileStat *FS)
  110. {
  111. #ifdef _WIN_32
  112.   struct find_t ff;
  113.   if (_dos_findfirst(Name,FM_ARCH|FM_DIREC|FM_RDONLY,&ff)!=0)
  114.     return(0);
  115.   FS->FileAttr=ff.attrib;
  116.   FS->IsDir=IsDir(ff.attrib);
  117.   FS->FileTime=ff.wr_time+((UDWORD)ff.wr_date<<16);
  118.   FS->FileSize=ff.size;
  119.   return(1);
  120. #endif
  121. #if defined(_UNIX) || defined(_AMIGA)
  122.   struct stat st;
  123.   if (stat(Name,&st)!=0)
  124.     return(0);
  125.   FS->FileAttr=st.st_mode;
  126.   FS->IsDir=st.st_mode & S_IFDIR;
  127.   FS->FileSize=st.st_size;
  128.   FS->FileTime=UnixTimeToDos(st.st_mtime);
  129.   return(1);
  130. #endif
  131. }
  132.  
  133.  
  134. #if defined(_UNIX) || defined(_AMIGA)
  135. UDWORD UnixTimeToDos(time_t UnixTime)
  136. {
  137.   struct tm *t;
  138.   UDWORD DosTime;
  139.   t=localtime(&UnixTime);
  140.   DosTime=(t->tm_sec/2)|(t->tm_min<<5)|(t->tm_hour<<11)|
  141.           (t->tm_mday<<16)|((t->tm_mon+1)<<21)|((t->tm_year-80)<<25);
  142.   return(DosTime);
  143. }
  144.  
  145.  
  146. time_t DosTimeToUnix(UDWORD DosTime)
  147. {
  148.   struct tm t;
  149.  
  150.   t.tm_sec=(DosTime & 0x1f)*2;
  151.   t.tm_min=(DosTime>>5) & 0x3f;
  152.   t.tm_hour=(DosTime>>11) & 0x1f;
  153.   t.tm_mday=(DosTime>>16) & 0x1f;
  154.   t.tm_mon=((DosTime>>21)-1) & 0x0f;
  155.   t.tm_year=(DosTime>>25)+80;
  156.   t.tm_isdst=-1;
  157.   return(mktime(&t));
  158. }
  159. #endif
  160.  
  161.  
  162. void ConvertDate(UDWORD ft)
  163. {
  164.   static int Format=-1;
  165.   int Year;
  166.  
  167.   Year=(int)(((ft>>25)+1980)%100);
  168.   if (Format==-1)
  169.     Format=DateFormat();
  170.   switch (Format)
  171.   {
  172.     case 0:
  173.       sprintf(DateStr,"%02d%02d%02d%02d%02d",
  174.               (int)(ft>>21)&0xf,(int)(ft>>16)&0x1f,Year,
  175.               (int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
  176.       break;
  177.     case 1:
  178.       sprintf(DateStr,"%02d%02d%02d%02d%02d",
  179.               (int)(ft>>16)&0x1f,(int)(ft>>21)&0xf,Year,
  180.               (int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
  181.       break;
  182.     default:
  183.       sprintf(DateStr,"%02d%02d%02d%02d%02d",
  184.               Year,(int)(ft>>21)&0xf,(int)(ft>>16)&0x1f,
  185.               (int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
  186.       break;
  187.   }
  188. }
  189.  
  190.  
  191. void SetOpenFileStat(FILE *FPtr)
  192. {
  193. #ifdef _WIN_32
  194.   SetOpenFileTime(FPtr,NewLhd.FileTime);
  195. #endif
  196. }
  197.  
  198.  
  199. void SetCloseFileStat(char *Name)
  200. {
  201. #ifdef _WIN_32
  202.   _dos_setfileattr(Name,NewLhd.FileAttr);
  203. #endif
  204. #ifdef _UNIX
  205.   struct utimbuf ut;
  206.   chmod(Name,(mode_t)NewLhd.FileAttr);
  207.   SetCloseFileTime(Name,NewLhd.FileTime);
  208. #endif
  209. }
  210.  
  211.  
  212. void SetOpenFileTime(FILE *FPtr,UDWORD ft)
  213. {
  214. #ifdef _WIN_32
  215.   fflush(FPtr);
  216.   _dos_setftime(fileno(FPtr),ft>>16,ft);
  217. #endif
  218. }
  219.  
  220.  
  221. void SetCloseFileTime(char *Name,UDWORD ft)
  222. {
  223. #ifdef _UNIX
  224.   struct utimbuf ut;
  225.   ut.actime=ut.modtime=DosTimeToUnix(ft);
  226.   utime(Name,&ut);
  227. #endif
  228. }
  229.  
  230.  
  231. UDWORD GetOpenFileTime(FILE *FPtr)
  232. {
  233. #ifdef _WIN_32
  234.   unsigned int FileDate,FileTime;
  235.   _dos_getftime(fileno(FPtr),&FileDate,&FileTime);
  236.   return(((UDWORD)FileDate<<16)+FileTime);
  237. #endif
  238. #if defined(_UNIX) || defined(_AMIGA)
  239.   struct stat st;
  240.   fstat(fileno(FPtr),&st);
  241.   return(UnixTimeToDos(st.st_mtime));
  242. #endif
  243. }
  244.  
  245.  
  246. int FileExist(char *FileName)
  247. {
  248. #ifdef ENABLE_ACCESS
  249.   return(access(FileName,0)==0);
  250. #else
  251.   FILE *FPtr;
  252.   if ((FPtr=fopen(FileName,READBINARY))==NULL)
  253.   {
  254.     if (errno==ENOENT)
  255.       return(0);
  256.   }
  257.   else
  258.     fclose(FPtr);
  259.   return(1);
  260. #endif
  261. }
  262.  
  263.  
  264. FILE* topen(char *Name,char *Mode,unsigned int Sharing)
  265. {
  266.   FILE *FPtr;
  267.   FPtr=ShareOpen(Name,Mode,Sharing);
  268.   if (FPtr==NULL)
  269.   {
  270.     mprintf(MCannotOpen,Name);
  271.     ErrExit(EEMPTY,OPEN_ERROR);
  272.   }
  273.   return(FPtr);
  274. }
  275.  
  276.  
  277. FILE* wopen(char *Name,char *Mode,unsigned int Sharing)
  278. {
  279.   FILE *FPtr;
  280.   FPtr=ShareOpen(Name,Mode,Sharing);
  281.   if (FPtr==NULL)
  282.     mprintf(MCannotOpen,Name);
  283.   return(FPtr);
  284. }
  285.  
  286.  
  287. FILE* ShareOpen(char *Name,char *Mode,unsigned int Sharing)
  288. {
  289.   FILE *FPtr;
  290. #ifdef _WIN_32
  291.   unsigned int ShFlags;
  292.   switch (Sharing)
  293.   {
  294.     case M_DENYREAD:
  295.       ShFlags=SH_DENYRD;
  296.       break;
  297.     case M_DENYWRITE:
  298.       ShFlags=SH_DENYWR;
  299.       break;
  300.     case M_DENYNONE:
  301.       ShFlags=SH_DENYNONE;
  302.       break;
  303.     case M_DENYALL:
  304.       ShFlags=SH_DENYNO;
  305.       break;
  306.   }
  307.   FPtr=_fsopen(Name,Mode,ShFlags);
  308. #else
  309.   FPtr=fopen(Name,Mode);
  310. #endif
  311.   return(FPtr);
  312. }
  313.  
  314.  
  315. int SplitPath(char *FullName,char *Path,char *Name,int RemoveDrive)
  316. {
  317.   char *ChPtr;
  318.   if (RemoveDrive && (ChPtr=strchr(FullName,':'))!=NULL)
  319.     ChPtr++;
  320.   else
  321.     ChPtr=FullName;
  322.   strcpy(Name,PointToName(ChPtr));
  323.   strcpy(Path,ChPtr);
  324.   Path[strlen(ChPtr)-strlen(Name)]=0;
  325.   if (strchr(ChPtr,'?')!=NULL || strchr(ChPtr,'*')!=NULL)
  326.     return(1);
  327.   else
  328.     return(0);
  329. }
  330.  
  331.  
  332. int GetPathDisk(char *Path)
  333. {
  334.   if (isalpha(*Path) && Path[1]==':')
  335.     return(toupper(*Path)-'A');
  336.   else
  337.     return(-1);
  338. }
  339.  
  340.  
  341. void ShowAttr(void)
  342. {
  343.   UDWORD A;
  344.   A=NewLhd.FileAttr;
  345.   switch(NewLhd.HostOS)
  346.   {
  347.     case MS_DOS:
  348.     case OS2:
  349.     case WIN_32:
  350.       mprintf("  %c%c%c%c%c%c  ",
  351.               (A & 0x08) ? 'V' : '.',
  352.               (A & 0x10) ? 'D' : '.',
  353.               (A & 0x01) ? 'R' : '.',
  354.               (A & 0x02) ? 'H' : '.',
  355.               (A & 0x04) ? 'S' : '.',
  356.               (A & 0x20) ? 'A' : '.');
  357.       break;
  358.     case UNIX:
  359.       mprintf("%c%c%c%c%c%c%c%c%c%c",
  360.               (A & 0x4000) ? 'd' : '-',
  361.               (A & 0x0100) ? 'r' : '-',
  362.               (A & 0x0080) ? 'w' : '-',
  363.               (A & 0x0040) ? ((A & 0x0800) ? 's':'x'):((A & 0x0800) ? 'S':'-'),
  364.               (A & 0x0020) ? 'r' : '-',
  365.               (A & 0x0010) ? 'w' : '-',
  366.               (A & 0x0008) ? ((A & 0x0400) ? 's':'x'):((A & 0x0400) ? 'S':'-'),
  367.               (A & 0x0004) ? 'r' : '-',
  368.               (A & 0x0002) ? 'w' : '-',
  369.               (A & 0x0001) ? 'x' : '-');
  370.       break;
  371.   }
  372. }
  373.  
  374.  
  375. int IsDir(UDWORD Attr)
  376. {
  377.   return(Attr & FM_DIREC);
  378. }
  379.  
  380.  
  381. int IsLabel(UDWORD Attr)
  382. {
  383.   return(Attr & FM_LABEL);
  384. }
  385.  
  386.  
  387. void ConvertFlags(void)
  388. {
  389. #ifdef _WIN_32
  390.   switch(NewLhd.HostOS)
  391.   {
  392.     case MS_DOS:
  393.     case OS2:
  394.     case WIN_32:
  395.       break;
  396.     case UNIX:
  397.       if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
  398.         NewLhd.FileAttr=FM_DIREC;
  399.       else
  400.         NewLhd.FileAttr=FM_ARCH;
  401.       break;
  402.     default:
  403.       if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
  404.         NewLhd.FileAttr=FM_DIREC;
  405.       else
  406.         NewLhd.FileAttr=FM_ARCH;
  407.       break;
  408.   }
  409. #endif
  410. #ifdef _UNIX
  411.   switch(NewLhd.HostOS)
  412.   {
  413.     case MS_DOS:
  414.     case OS2:
  415.     case WIN_32:
  416.       if (NewLhd.FileAttr & 0x10)
  417.         NewLhd.FileAttr=0x41ff;
  418.       else
  419.         if (NewLhd.FileAttr & 1)
  420.           NewLhd.FileAttr=0x816d;
  421.         else
  422.           NewLhd.FileAttr=0x81ff;
  423.       break;
  424.     case UNIX:
  425.       break;
  426.     default:
  427.       if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
  428.         NewLhd.FileAttr=0x41ff;
  429.       else
  430.         NewLhd.FileAttr=0x81ff;
  431.       break;
  432.   }
  433. #endif
  434. }
  435.  
  436.  
  437. DIR * DirOpen(char *Name)
  438. {
  439.   char DirName[NM],*NPtr,*DPtr;
  440.   int I;
  441.   if (Name[0] && Name[1]==':')
  442.   {
  443.     strncpy(DirName,Name,2);
  444.     DirName[2]=0;
  445.     NPtr=&Name[2];
  446.     DPtr=&DirName[2];
  447.   }
  448.   else
  449.   {
  450.     NPtr=Name;
  451.     DPtr=DirName;
  452.   }
  453.   if (*NPtr)
  454.   {
  455.     strcpy(DPtr,NPtr);
  456.     I=strlen(DPtr)-1;
  457.     if (IsPathDiv(DPtr[I]))
  458.       if (I>0)
  459.         DPtr[I]=0;
  460.       else
  461.         strcat(DPtr,".");
  462.   }
  463.   else
  464.     *DPtr=0;
  465.  
  466. #ifndef _AMIGA
  467.   if (*DPtr==0)
  468.     strcpy(DPtr,".");
  469. #endif
  470.  
  471.   return(opendir(DirName));
  472. }
  473.  
  474.  
  475. int IsPathDiv(int Ch)
  476. {
  477.   if (Ch=='\\' || Ch=='/')
  478.     return(1);
  479.   return(0);
  480. }
  481.  
  482.  
  483. int IsDriveDiv(int Ch)
  484. {
  485. #ifdef _UNIX
  486.   return(0);
  487. #else
  488.   return(Ch==':');
  489. #endif
  490. }
  491.  
  492.  
  493. void ConvertUnknownHeader(void)
  494. {
  495.   int I;
  496.   if (NewLhd.HostOS>UNIX)
  497.   {
  498.     NewLhd.HostOS=MS_DOS;
  499.     if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
  500.       NewLhd.FileAttr=0x10;
  501.     else
  502.       NewLhd.FileAttr=0x20;
  503.   }
  504.   for (I=0;ArcFileName[I];I++)
  505.     if (IsPathDiv(ArcFileName[I]))
  506.       ArcFileName[I]=CPATHDIVIDER;
  507. }
  508.  
  509.  
  510. int CheckForDevice(FILE *CheckFile)
  511. {
  512. #ifdef _UNIX
  513.   return(0);
  514. #else
  515.   return(isatty(fileno(CheckFile)));
  516. #endif
  517. }
  518.  
  519.