; netSpeechD by (c) Cyborg 2001
; 
; (c) 1999 Cyborg 

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

    {* String: Version="$VER: speechd 1.0 Cyborg 2001"*}

    {* 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)*}

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

    {* incVar: Addr,Zeiger*}

    {* NewProc=Fillbuffer[][A0,d0,d1]*}
    {* NewProc=getFilename[][]*}
    {* NewProc=ASC2Zahl[][a5]*}

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

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

{* IncBlock: Portname,20*}

Start:
    UsePort==21846
    Filename=="21846"
    If GetFilename()#0
     {
       UsePort=asc2zahl(&Filename)
     }
    Portname=="speechd."+Filename
    If FindPort(Portname)#0 
      {
       printf("Dämon läuft schon.\n")
       {* return *}
      }
    If (MPort=PortUp(Portname))=0
     {
      Printf("speechd Port NICHT VERFÜGBAR!\n")
      {* Return 0*}
     }
    {* FLUSH *}
    DeineNummer==0
    Printf("speechd gestartet\n")

    If (socket=TCP_Socket(AF_INET,SOCK_DGRAM,0))#-1
     {
        #AF_Inet=>sockaddr_in.sin_family
         UsePort=>sockaddr_in.sin_port
     #INADDR_ANY=>sockaddr_in.sin_addr
             #16=>sockaddr_in.sin_len
        ret=TCP_Bind(Socket,&Sockaddr_in,sizeof(sockaddr_in))
        If Ret=-1
         {
           Printf("speechd - Bind-Error \n")
           TCP_CloseSocket(Socket)
           PortDown(mPort)
           {* Return 0*}
         }
         While GetSigs()=0
          {
           Sockaddrlen==16
           {* incblock: zwischenpuffer,5000*}
           Fillbuffer(&Zwischenpuffer,0,5000)
           res1=TCP_RecvFrom(Socket,&ZwischenPuffer,3000,0,&Sockaddr_in,&sockaddrlen)
           res2=TCP_Errno()
           If res2=0 or res1>-1 
            {
              If (sh=open("speak:",#MODE_OLD))#0
               {
                 Write(SH,&Zwischenpuffer,res1)
                 close(SH)
               }
            }
           If ret=-1
            {
              Delay(25)
              RES=TCP_Errno()
              Printf("speechd - Accept-Error %ld\n",*res)
            }
          }
      {* FLUSH *}
      Printf("speechd - Dämon beendet sich jetzt\n")
      TCP_CloseSocket(Socket)
     }
    PortDown(mPort)
    {* Return *}


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

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

