saveStruct: mov [SaveFlg],1
mov word [saveptrLabl.ee+7],'00'
mov word [saveptrFun.ee+8],'00'
mov [EqulistString], pEqulistString
invoke CreatePipe,pipRead,pipWrite,0,outPipTxtSize
test eax,eax
jnz @f
Msg 'CreatePipe error'
@@:
        invoke GetDlgItem,esi,202
        invoke SendMessage,eax,WM_GETTEXT,126,tmpBufr
        mov dword [tmpBufr-4],eax
comboGetTxt 202
mov ebx,eax
mov dword [comboTxt+eax],'.txt'
mov byte [comboTxt+eax+4],0
mov dword [comboTxt-4],'out\'
SaveFileNotClose comboTxt-4,'struct ',7
invoke WriteFile,[fhand],comboTxt,ebx,rbait,0
invoke WriteFile,[fhand],.pp,4,rbait,0
ret
.pp db '!!',13,10
pipRead  dd 0
pipWrite dd 0

EndSaveStruct: mov [SaveFlg],0
invoke WriteFile,[fhand],struEnd,8,rbait,0

invoke ReadFile,[pipRead],pipBufer,outPipTxtSize,rbait,0
;Msg pipBufer ;nelza srazu Msg [pipRead] budget crash.
mov ecx,dword [rbait]
invoke WriteFile,[fhand],pipBufer,ecx,rbait,0

;save lists
mov ebx,[EqulistString]
mov word [ebx-1],0x0a0d
invoke WriteFile,[fhand],';',1,rbait,0
invoke WriteFile,[fhand],tmpBufr,dword [tmpBufr-4],rbait,0
invoke WriteFile,[fhand],'.listStrings dd ',16,rbait,0
mov eax,pEqulistString
sub ebx,eax
invoke WriteFile,[fhand],eax,ebx,rbait,0

invoke CloseHandle,[fhand]
invoke CloseHandle,[pipRead]
invoke CloseHandle,[pipWrite]
invoke MessageBeep,0x30

;Msg_ pEqulistString
ret
struEnd db 13,10,'ends',13,10
SaveFlg db 0

macro findZnk znk,mtk { local .1,.2
mov eax,edi
dec eax
.1:
inc eax
cmp byte [eax],0
jz mtk
cmp [eax],znk
jnz .1
.2:
}

macro ifName txt,we,pp,clear=0 { local .2
cmp [txt],we
jnz .2
pusha
if clear = 1
call clearNv
end if
call pp
popa
ret
.2:
}

SaveStructName:
        mov ecx,edi
.1:     inc ecx
cmp byte [ecx],'$'
jz .nn
;jnz .k
;dec ecx
;jmp .nn
.k:
        cmp byte [ecx],0
        jnz .1
.nn:
        sub ecx,edi
        cmp [ops_Flagg],1
        jnz .noOpss
        jmp saveOpsNxt

.noOpss:

findZnk byte ':',.ext
mov byte [eax],'.'
inc eax
ifName eax,dword 'valD',saveDD,1
ifName eax,dword 'valS',saveDW,1
ifName eax,dword 'valB',saveDB,1
ifName eax,dword 'func',saveFunCall
ifName eax,dword 'ptrF',saveptrFun
ifName eax,dword 'ptrL',saveptrLabl
ifName eax,dword 'ptrv',savePtr
ifName eax,dword 'opI4',saveVec4
ifName eax,dword 'opF4',saveVec4
ifName eax,dword 'stri',saveString
.ext:
        ret
clearNv: mov byte [eax-1],' '
        inc eax
        cmp byte [eax-1],0
        jnz clearNv
ret

saveDD:  push ebx
         mov ebx,ecx
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         
ret
.pp db ' dd 0',13,10
.ppSize = $-.pp
.p2 db ' equ mov ['
.p2Size = $-.p2
.p3 db '],',13,10
.pget db ' equ mov eax,['
.pgetSize = $-.pget
.p4 db '] ',13,10

saveDW:  push ebx
         mov ebx,ecx
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         
ret
.pp db ' dw 0',13,10
.ppSize = $-.pp
.p2 db ' equ mov word ['
.p2Size = $-.p2
.p3 db '],',13,10
.pget db ' equ mov ax,['
.pgetSize = $-.pget
.p4 db '] ',13,10

saveDB:  push ebx
         mov ebx,ecx
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         
ret
.pp db ' db 0',13,10
.ppSize = $-.pp
.p2 db ' equ mov byte ['
.p2Size = $-.p2
.p3 db '],',13,10
.pget db ' equ mov al,['
.pgetSize = $-.pget
.p4 db '] ',13,10

saveSize: call   saveName_
          invoke WriteFile,[pipWrite],.p1,.p1Size,rbait,0
ret
.p1 db '.size '
.p1Size = $-.p1

savePtr:  push ebx
         mov ebx,ecx
;set
         call   saveName_
         invoke WriteFile,[pipWrite],.p1,.p1Size,rbait,0
         invoke WriteFile,[pipWrite],'macro !',7,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
         invoke WriteFile,[pipWrite],.p2b,.p2bSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],'+4',2,rbait,0
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p5,4,rbait,0
;ops @

         invoke WriteFile,[pipWrite],'macro @',7,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.o2,.o2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p5,4,rbait,0

         invoke WriteFile,[pipWrite],.o3,.o3Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p6,2,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p10,.p10Size,rbait,0


         invoke WriteFile,[pipWrite],.p4,4,rbait,0
         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         
ret
.pp db ' dd 0,0',13,10
.ppSize = $-.pp
.p1 db '.size = 4',13,10
.p1Size = $-.p1
.p10 db '.size',13,10
.p10Size = $-.p10
.p2 db ' v { mov dword ['
.p2Size = $-.p2
.p2b db ' mov dword ['
.p2bSize = $-.p2b
.p3 db '],v',13,10
.pget db ' equ mov eax,['
.pgetSize = $-.pget
.p4 db '} ',13,10
.p5 db '] ',13,10
.o2 db '  { mov eax,dword ['
.o2Size = $-.o2
.o3 db ' add dword ['
.o3Size = $-.o3
.p6 db '],'

saveptrFun: push ebx
         mov ebx,ecx
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0

invoke WriteFile,[pipWrite],.ee2+2,2,rbait,0
         invoke WriteFile,[pipWrite],tmpBufr,dword [tmpBufr-4],rbait,0
         invoke WriteFile,[pipWrite],.ee,.eeSize-2,rbait,0
         ;invoke WriteFile,[pipWrite],.ee2,.eeSize2,rbait,0
invoke WriteFile,[pipWrite],.ee2,2,rbait,0
         call savefileToPtr
invoke WriteFile,[pipWrite],.ee2+4,7,rbait,0
;equ
invoke WriteFile,[pipWrite],';  EQU call ',12,rbait,0
invoke WriteFile,[pipWrite],tmpBufr,dword [tmpBufr-4],rbait,0
invoke WriteFile,[pipWrite],.ee,.eeSize,rbait,0

         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         invoke WriteFile,[fhand],tmpBufr,dword [tmpBufr-4],rbait,0
         invoke WriteFile,[fhand],.ee,.eeSize,rbait,0
         mov ecx,.ee+9
         call inc_Val.2
         
ret
.pp db ' dd '
.ppSize = $-.pp
.p2 db ' equ call dword ['
.p2Size = $-.p2
.p3 db '] ',13,10
.pget db ' equ mov eax,['
.pgetSize = $-.pget
.p4 db '] ',13,10
.ee db '.ListFun00',13,10
.eeSize = $-.ee
.ee2 db ': ',13,10
    db 'ret',13,10,13,10
.eeSize2 = $-.ee2

saveptrLabl: push ebx
         mov ebx,ecx
;set
         ;invoke WriteFile,[pipWrite],'!',1,rbait,0
         ;call   saveName_
         ;invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         ;call   saveName_
         ;invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0

invoke WriteFile,[pipWrite],.ee2+2,2,rbait,0
         invoke WriteFile,[pipWrite],tmpBufr,dword [tmpBufr-4],rbait,0
         invoke WriteFile,[pipWrite],.ee,.eeSize-2,rbait,0
         invoke WriteFile,[pipWrite],.ee2,.eeSize2-4,rbait,0
         call savefileToPtr

         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         invoke WriteFile,[fhand],tmpBufr,dword [tmpBufr-4],rbait,0
         invoke WriteFile,[fhand],.ee,.eeSize,rbait,0
         mov ecx,.ee+8
         call inc_Val.2
         
ret
.pp db ' dd '
.ppSize = $-.pp
.p2 db ' equ call dword ['
.p2Size = $-.p2
.p3 db '] ',13,10
.pget db ' equ mov eax,['
.pgetSize = $-.pget
.p4 db '] ',13,10
.ee db '.ListLb00',13,10
.eeSize = $-.ee
.ee2 db ': ',13,10,13,10
.eeSize2 = $-.ee2

saveFunCall:  push ebx
         mov ebx,ecx
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,4,rbait,0
;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
         mov ecx,ebx
         pop ebx
         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         
ret
.pp db ' dd 0',13,10
.ppSize = $-.pp
.p2 db ' equ call dword ['
.p2Size = $-.p2
.p3 db '] ',13,10
.pget db ' equ mov eax,['
.pgetSize = $-.pget
.p4 db '] ',13,10

ops_Flagg db 0
saveVec4:
         mov [ops_Flagg],1
         push ebx
         mov ebx,ecx

         invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
         ;invoke WriteFile,[pipWrite],.pp,.ppSize,rbait,0

;get
         invoke WriteFile,[pipWrite],'_',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pget,.pgetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p4,4,rbait,0
;set
         invoke WriteFile,[pipWrite],'!',1,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.pset,.psetSize,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p5,8,rbait,0
;@
         invoke WriteFile,[pipWrite],'macro @',7,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],' v1= ',5,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],',v2 { ',6,rbait,0

         pop ebx
ret

.pp db ' dd 0,0,0,0',13,10
.ppSize = $-.pp
.pget db ' equ movaps xmm0, dqword ['
.pgetSize = $-.pget
.p4 db '] ',13,10
.pset db ' equ movaps  dqword ['
.psetSize = $-.pset
.p5 db '],xmm0',13,10

saveOpsNxt: cmp byte [edi],0
            jnz .1
            mov [ops_Flagg],0
        invoke WriteFile,[pipWrite],.pp+3,5,rbait,0
            ret

.1:         push ebx
            mov ebx,ecx      ;name len
;Msg_ edi
            ;invoke WriteFile,[pipWrite],'macro ',6,rbait,0
            ;invoke WriteFile,[pipWrite],edi,ebx,rbait,0

            ;call saveName_
            ;invoke WriteFile,[pipWrite],.pp,.ppSize,rbait,0
;from file
            cmp dword [edi],'file'
            jnz .2
;Msg_ edi
            mov eax,edi
            add eax,5
            call PasteFromFile
            jmp  .3 

.2:         call saveName_2
.3:         invoke WriteFile,[pipWrite],.p2,2,rbait,0
            pop ebx
            ret

.pp db ' {   }',13,10
.ppSize = $-.pp
.p2 db 13,10

saveString:
         push ebx
         mov ebx,ecx
         mov ecx,edi
.1:      inc ecx
         cmp byte [ecx],'$'
         jnz .1
         mov ecx,dword [ecx+1]
         mov dword [.pk+3],ecx
         mov dword [.pp+4],ecx
;set
         mov    eax,EqulistString
         call   namesCollection
         call   saveSize
         invoke WriteFile,[pipWrite],.pk,9,rbait,0
         invoke WriteFile,[pipWrite],'macro !',7,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p2,.p2Size,rbait,0
         call   saveName_
         invoke WriteFile,[pipWrite],.p3,.p3Size,rbait,0
         call   saveSize
         invoke WriteFile,[pipWrite],.o1,.o1Size,rbait,0

         call   saveName_file
         mov ecx,ebx
         pop ebx
         ;invoke WriteFile,[fhand],edi,ecx,rbait,0
         invoke WriteFile,[fhand],.pp,.ppSize,rbait,0
ret
.pk db ' = 64  ',13,10
.pp db ' db 64   dup(0)',13,10
.ppSize = $-.pp
.p2 db ' from { mov edi,'
.p2Size = $-.p2
.p3     db 13,10,'mov esi,from',13,10
    ;db 'mov ecx,63',13,10
    db 'mov ecx,'
    ;db 'repnz movsb',13,10
    ;db '} ',13,10
.p3Size = $-.p3
.o1 db 13,10,'repnz movsb',13,10
    db '} ',13,10
.o1Size = $-.o1

saveName_:
          invoke WriteFile,[pipWrite],tmpBufr,dword [tmpBufr-4],rbait,0
          invoke WriteFile,[pipWrite],'.',1,rbait,0
saveName_2:
          invoke WriteFile,[pipWrite],edi,ebx,rbait,0
          ret
saveName_file:
          invoke WriteFile,[fhand],edi,ebx,rbait,0
          ret

macro mcopy from,to,znk { local .1,.2
.1:   mov cl,[from]
      test cl,cl
      jz   .2
      cmp  cl,znk
      jz   .2
      mov [to],cl
      inc to
      inc from
      jmp .1
.2:

}
namesCollection: movd xmm1,eax
          mov eax,[eax]
          push esi
          mov esi,tmpBufr
          mcopy esi,eax,0
          mov byte [eax],'.'
          inc eax
          mov esi,edi
          mcopy esi,eax,'$'
          pop  esi
          
          mov byte [eax],','
          inc eax
          movd ecx,xmm1
          mov  [ecx],eax
          ret
EqulistString dd pEqulistString
