/**********************************************************************
 Программа на языке C--, переводящая текстовые файлы из формата
 Unix(LF,KOI-8) в DOS(CR/LF, CP866) и обратно.
 Компилируется версией C-- 0.235+
 Написано и скомпилировано MASTANом  http://members.nbci.com/mastan
**********************************************************************/

?use8086
?jumptomain NEAR
?parsecommandline TRUE
?define bufsize 16384 // можно ставить любое не больше ~20Кб, чем > тем !! :)
?define xltsize 128
word xlt[xltsize] = FROM "koi8-r.xlt";
char Buf[bufsize],Buf1[bufsize*2];
byte DOS2Unix=0;
word hsrc,hdest;

:byte XLAT_DOS()
{
 $push SI
 $push CX
 CX=xltsize;
 SI=#xlt;
 loop(CX) {
  BL=DSBYTE[SI];
  IF(AL==BL) {
   AL=DSBYTE[SI+1];
   BREAK;
  }
  SI+=2;
 }
 $pop CX
 $pop SI
}

:byte XLAT_UNIX()
{
 $push SI
 $push CX
 CX=xltsize;
 SI=#xlt;
 loop(CX) {
  BL=DSBYTE[SI+1];
  IF(AL==BL) {
   AL=DSBYTE[SI];
   BREAK;
  }
  SI+=2;
 }
 $pop CX
 $pop SI
}

:word TO_UNIX(CX,SI,DI)
{
 loop(CX) {
  $lodsb
  IF(0xD==AL) CONTINUE;
  @XLAT_UNIX();
  $stosb
 }
}

:word TO_DOS(CX,SI,DI)
{
 loop(CX) {
  $lodsb
  SWITCH(AL) {
   CASE 0xD: CONTINUE;
   CASE 0xA:
    AL=0xD;$stosb;
    AL=0xA;$stosb;
    BREAK;
   default: @XLAT_DOS(); $stosb;
  }
 }
}

void main()
{
 WRITESTR("Unix->DOS, DOS->Unix text convertor by MASTAN\n");
 IF(PARAMCOUNT()<3) {
  WRITESTR("Usage: udc /{u|d} <source> <dest>\n /d converts Unix->DOS, /u converts DOS->Unix\n");
  EXIT(0);
 }
 PARAMSTR(0);
 AX><BX;
 AX=DSWORD[BX]&0xDFFF;
// @STR_DOWN(#Buf);
 IF(AX=='U/') DOS2Unix=1; ELSE
 IF(AX!='D/') {
  WRITESTR("Error: first parameter must be /d or /u\n");
  EXIT(-1);
 }
 DX=PARAMSTR(1);
 hsrc=@FOPEN(0,,,DX);
 IF(0==AX) {
  WRITESTR("Error: Source file not found!\n");
  EXIT(-1);
 }
 DX=PARAMSTR(2);
 hdest=@FCREATE(,,0,DX);
 IF(0==AX) {
  WRITESTR("Error: Can't open destination file!\n");
  EXIT(-1);
 }
 FOR(;;){
  @FREAD(,hsrc,bufsize,#Buf);
  IF(0==AX) BREAK;
  CX=AX;
  SI=#Buf;
  DI=#Buf1;
  IF(DOS2Unix)
   @TO_UNIX(CX,SI,DI);
  ELSE
   @TO_DOS(CX,SI,DI);
  CX=DI-#Buf1;
  @FWRITE(,hdest,CX,#Buf1);
 };
 FCLOSE(,hdest);
 FCLOSE(,hsrc);
}
