; Project : Grafik Converter
; 
; (c) 2000 Cyborg 

    {* Include sys:coder/preass/Options.p *}

    {* String: Version="$VER: Grafik Converter (C) CYBORG 2000"*}

    {* Structure sockaddr_in(),sin_len(BYTE),sin_family(BYTE),sin_port(WORD)
                 sin_addr(LONG),sin_zero[8]*}
    
    {* Structure Sockaddr(),SA_Len(BYTE),SA_Family(BYTE),SA_Data[14]*}

    {* Structure Hostent,H_name(CHAR),h_aliases(APTR),h_addrtype(LONG)
                 h_length(LONG),H_addr_list(CHAR)*}

    {* Structure servent,s_name(CHAR),s_aliases(APTR),s_port(WORD),s_proto(CHAR)*}

    {* IncBlock: Puffer,2048*}

    {* Const AF_INET=2,INADDR_ANY=0
             Sock_STREAM=1
             FIONBIO=$8004667e*}

    {* incVar: Addr,Zeiger,Filelen*}

    {* NewProc=CountString[String][A0]*}
    {* NewProc=Fillbuffer[][A0,d0,d1]*}
    {* NewProc=MatchString[][A0,A1]*}
    {* NewProc=getFilename[][]*}
    {* NewProc=ConvertZahl[Zahl,Handle][D7,D6]*}
    {* NewProc=ASC2Zahl[][a5]*}
    
    {* Structure IN_ADDR,s_addr(LONG)*}

TCP_Write[d0,a0,d1,d2]:
    {* StackFrame wr,Socket=d0,msg=a0,MsgLen=d1,flags=d2*}
    While (Wr=TCP_Send(Socket,msg,msglen,flags))#msglen
      {
        if wr<1 
         {
           {* UnFramereturn -1*}
         }
        Msg==Msg+Wr
        Msglen==MsgLen-Wr
      }
    {* UnFrameReturn *}

recv[d0,d1,d2,d3]:
    {* Stackframe Socket=d0,Zeiger=d1,Laenge=d2,time=d3,Readlen*}
    While Time>0
     {
      Readlen=TCP_recv(Socket,Zeiger,Laenge,0)
      If Readlen>0 breakwhile
      Time==Time-25
      Delay(25)
     }
    {* UnFrameReturn Readlen*}

GetSigs[]:
    Signals=SetSignal(0,0)
    Signals==Signals&#$F000
    {* Return Signals*}

TCP_Sendfile[a0,d0]:
    {* StackFrame Filehandle=#0,Socket=d0,Name=a0,Puffer,Len,Rl*}
    IF (Puffer=Allocmem(100,#MEMF_Fast))=0
     {
      TCP_Write(Socket,"out of memory error - please tell admin.\n",?,0)
      Printf("Conv hat keinen Speicher mehr\n")
      {* UnframeReturn 0*}
     }
    {* FLUSH *}
    If (Filehandle=Open(Name,Mode_old))=0
     {
      Freemem(Puffer,100)
      TCP_Write(Socket,"file not found error - please tell admin.\n",?,0)
      Printf("Conv kann file nicht oeffnen\n")
      {* UnframeReturn 0*}
     }
    {* FLUSH *}
    Seek(Filehandle,0,offset_end)
    Len=Seek(Filehandle,0,offset_begin)
    While Len>0
     {
       Rl=Read(Filehandle,Puffer,100)
       If TCP_Write(Socket,Puffer,rl,0)<1 breakwhile
       LEN==LEN-RL
     }
    Close(Filehandle)
    Freemem(Puffer,100)
    {* UnFrameReturn 0*}

TCP_Getfile[a0,d0]:
    {* StackFrame Filehandle=#0,Socket=d0,Name=a0,Puffer,Len,Rl*}
    IF (Puffer=Allocmem(100,#MEMF_Fast))=0
     {
      TCP_Write(Socket,"out of memory error - please tell admin.\n",?,0)
      Printf("Conv hat keinen Speicher mehr\n")
      {* UnframeReturn 0*}
     }
    {* FLUSH *}
    If (Filehandle=Open(Name,Mode_new))=0
     {
      Freemem(Puffer,100)
      TCP_Write(Socket,"file not found error - please tell admin.\n",?,0)
      Printf("Conv kann file nicht oeffnen\n")
      {* UnframeReturn 0*}
     }
    {* FLUSH *}
    Rl=TCP_recv(Socket,Zeiger,Laenge,0)
    TCP_IoCtlSocket(Socket,FIONBIO,#FIONBIOTags)
    Write(Filehandle,Puffer,rl)
    While RL>0
     {
       Rl=recv(Socket,Puffer,100,500)
     }
    Close(Filehandle)
    Freemem(Puffer,100)
    {* UnFrameReturn 0*}

CopyNextString[a0,a3]:
        cmpi.l #0,laenge
        beq .l13
        cmpi.l #1,laenge
        beq .l13
        suba.l a2,a2
        suba.l a1,a1
.l1:    cmpi.b #`"`,(a0)
        beq .l10
        cmpi.b #` `,(a0)+
        beq .l1
        lea -1(a0),a1
.l2:    cmpi.b #`"`,(a0)
        beq .l11
        cmpi.b #$0a,(a0)
        beq .l12
        cmpi.b #$00,(a0)
        beq .l12
        cmpi.b #` `,(a0)+
        bne .l2
        Lea -1(a0),a2
.l3:    suba.l a1,a2
        move.l A0,NextArg
        Copymem(a1,a3,a2)
        Move.l a2,d0
        rts
.l10:   lea 1(a0),a1
        movea.l a1,a0
        bra .l22
.l11:   move.l a0,a2
        bra .l3
.l12:   move.l a0,a2
        bra .l3
.l13:   moveq.l #0,d0
        RTS
.l22:   cmpi.b #`"`,(a0)
        beq .l11
        cmpi.b #$0a,(a0)
        beq .l12
        cmpi.b #$00,(a0)
        beq .l12
        lea 1(a0),a0
        bne .l22

{* IncBlock: Hostname,200*}
{* IncBlock: Filename2,200*}

Start:
    OH=output()
    UsePort==24000
    If CopyNextString(Adresse,&Hostname)=0 
     {
       printf("Kein Hostname angegeben\n")
       {* Return 5*}
     }
    If CopyNextString(NextArg,&Filename)=0 
     {
       printf("Keinen Dateinamen angegeben\n")
       {* Return 5*}
     }
    If CopyNextString(NextArg,&Filename2)=0 
     {
       printf("Keinen Zieldateinamen angegeben\n")
       {* Return 5*}
     }
    {* FLUSH *}
    Printf("Conv gestartet\n")
    If (socket=TCP_Socket(AF_INET,SOCK_STREAM,0))#-1
     {
        If (he=TCP_gethostbyname(&Hostname))#0
         {
          Printf("Hostname ok...\n")
          #AF_Inet=>sockaddr_in.sin_family
          UsePort=>sockaddr_in.sin_port
          Zeiger=.lhostent.H_addr_list(he)
          addr==(Zeiger)
          addr==(Addr)
          addr=>sockaddr_in.sin_addr
          ret=TCP_Connect(Socket,&Sockaddr_in,sizeof(sockaddr_in))
          If ret#-1
           {
             printf("Connected...\n")
             If TCP_IoCtlSocket(Socket,FIONBIO,>FIONBIOTags:1,0)=-1
              {
               TCP_Errno()
              }
             If (Filehandle=Open(&Filename,#Mode_old))#0
              { 
                seek(Filehandle,0,offset_end)
                len=seek(Filehandle,0,offset_begin)
                TCP_Write(Socket,&len,4,0)
                Close(Filehandle)
                TCP_SendFile(&Filename,Socket)
                TCP_IoCtlSocket(Socket,FIONBIO,>FIONBIONBTags:0,0)
                TCP_GetFile(&Filename2,Socket)
                   
              }
           }
         
         }
      {* FLUSH *}
      Printf("Conv beendet sich jetzt\n")
      TCP_CloseSocket(Socket)
     }
    {* Return *}


CountString:
        move.l a1,-(Sp)
        move.l a0,a1
.l1:    cmpi.b #$00,(a1)+
        bne .l1
        lea -1(a1),a1
        sub.l a0,a1
        move.l a1,d0
        move.l (sp)+,a1
        RTS

FillBuffer:
    subq.l #1,d1
.l1:move.b d0,(a0)+
    dbra  d1,.l1
    RTS

Matchstring:
    cmpi.b #0,(a0)
    beq .error1
    cmpi.b #0,(a1)
    beq .error
    move.b (a0)+,d0
    move.b (a1)+,d1
    bset #5,d0
    bset #5,d1
    cmp.b d0,d1
    beq MatchString
    bra.s .ende1
.ok:moveq.l #1,d0
    rts
.error:
    cmpi.b #0,(a0)
    beq .ok
    cmpi.b #$a,(a0)
    beq .ok
    bra.s .ende1
.error1:
    cmpi.b #0,(a1)
    beq .ok
    cmpi.b #$a,(a1)
    beq .ok
.ende1:
    moveq.l #0,d0
    RTS

GetFilename:
    {* IncBlock: Filename,256*}
    {* IncVar: NextArg*}
        cmpi.l #0,laenge
        beq .l13
        cmpi.l #1,laenge
        beq .l13
        suba.l a2,a2
        suba.l a1,a1
        Move.l Adresse,a0
.l1:    cmpi.b #`"`,(a0)
        beq .l10
        cmpi.b #` `,(a0)+
        beq .l1
        lea -1(a0),a1
.l2:    cmpi.b #`"`,(a0)
        beq .l11
        cmpi.b #$0a,(a0)
        beq .l12
        cmpi.b #$00,(a0)
        beq .l12
        cmpi.b #` `,(a0)+
        bne .l2
        Lea -1(a0),a2
.l3:    suba.l a1,a2
        move.l A0,NextArg
        Copymem(a1,#Filename,a2)
        Move.l a2,d0
        rts
.l10:   lea 1(a0),a1
        movea.l a1,a0
        bra .l22
.l11:   move.l a0,a2
        bra .l3
.l12:   move.l a0,a2
        bra .l3
.l13:   moveq.l #0,d0
        RTS
.l22:   cmpi.b #`"`,(a0)
        beq .l11
        cmpi.b #$0a,(a0)
        beq .l12
        cmpi.b #$00,(a0)
        beq .l12
        lea 1(a0),a0
        bne .l22

ConvertZahl:
    {* IncVar: Zusatz,Zahl,Zahlyyy*}
    Move.l #"    ",Zusatz
    Move.l #"   0",Zahl
ConvertZahl1:
    Movem.l a0-a5,-(sp)
    Lea Zusatz,a0
    Cmpi.l #0,d7
    bpl .l0
    Neg.l d7
    move.b #"-",zahl
    Cmpi.l #9999,d7
    bgt .l0
    move.b #"-",zusatz
.l0:Move.l d7,d0
    MoveQ.l #-1,d1
.l1:AddQ.l #1,d1
    Subi.l #10000000,d0
    Bpl .l1
    Addi.l #10000000,d0
    addi.l #$30,d1
    cmpi.b #"0",d1
    Beq .l11
    move.b d1,0(a0)
.l11:MoveQ.l #-1,d1
.l2:AddQ.l #1,d1
    Subi.l #1000000,d0
    Bpl .l2
    Addi.l #1000000,d0
    addi.l #$30,d1
    cmpi.b #" ",0(a0)
    bne .l22
    cmpi.b #"0",d1
    Beq .l21
.l22:
    move.b d1,1(a0)
.l21:MoveQ.l #-1,d1
.l3:AddQ.l #1,d1
    Subi.l #100000,d0
    Bpl .l3
    Addi.l #100000,d0
    addi.l #$30,d1
    cmpi.b #" ",1(a0)
    bne .l32
    cmpi.b #"0",d1
    Beq .l31
.l32:
    move.b d1,2(a0)
.l31:MoveQ.l #-1,d1
.l4:AddQ.l #1,d1
    Subi.l #10000,d0
    Bpl .l4
    Addi.l #10000,d0
    addi.l #$30,d1
    cmpi.b #" ",2(a0)
    bne .l42
    cmpi.b #"0",d1
    Beq .l41
.l42:
    move.b d1,3(a0)
.l41:MoveQ.l #-1,d1
.l5:AddQ.l #1,d1
    Subi.l #1000,d0
    Bpl .l5
    Addi.l #1000,d0
    addi.l #$30,d1
    cmpi.b #" ",3(a0)
    bne .l52
    cmpi.b #"0",d1
    Beq .l51
.l52:
    move.b d1,4(a0)
.l51:MoveQ.l #-1,d1
.l6:AddQ.l #1,d1
    Subi.l #100,d0
    Bpl .l6
    Addi.l #100,d0
    addi.l #$30,d1
    cmpi.b #" ",4(a0)
    bne .l62
    cmpi.b #"0",d1
    Beq .l61
.l62:
    move.b d1,5(a0)
.l61:MoveQ.l #-1,d1
.l7:AddQ.l #1,d1
    Subi.l #10,d0
    Bpl .l7
    Addi.l #10,d0
    addi.l #$30,d1
    cmpi.b #" ",5(a0)
    bne .l72
    cmpi.b #"0",d1
    Beq .l71
.l72:
    move.b d1,6(a0)
.l71:
    addi.l #$30,d0
    move.b d0,7(a0)
    Movem.l (sp)+,a0-a5
    Checkf D6,.ende   
    Write(D6,#Zusatz,8)
.ende:RTS

CountString2[a0]:
        move.l a1,-(Sp)
        move.l a0,a1
.l1:    cmpi.b #$0a,(a1)
        beq .l2
        cmpi.b #",",(a1)
        beq .l2
        cmpi.b #" ",(a1)
        beq .l2
        cmpi.b #$00,(a1)+
        bne .l1
        lea -1(a1),a1
.l2:    sub.l a0,a1
        move.l a1,d0
        move.l (sp)+,a1
        RTS

ASC2Zahl[a5]:
    {* IncVar: Potenz*}
    Countstring2(a5)
    move.l d0,d7
    subq.l #2,d7
    move.l #1,d0
    cmpi.w #$FFFF,d7
    beq .la
.l0:mulu.l #10,d0
    dbra d7,.l0
.la:move.l d0,d6
    moveq.l #0,d1
    move.l a5,a0
    move.b #"+",d5
.l1:moveq.l #0,d0
    move.b (A0)+,d0
    cmpi.b #"-",d0
    bne .l2
    move.b d0,d5
    Divs.l #10,d6
    bra .l1
.l2:subi.b #$30,d0
    andi.l #$FF,d0
    Muls.l d6,d0
    divs.l #10,d6
    add.l d0,d1
    cmpi.l #0,d6
    bne .l1
    lea 1(a0),a0
;    move.l a0,NextArg
    move.l d1,d0
    cmpi.b #"+",d5
    beq .l3
    neg.l d0
.l3:RTS
