Crc32 Proc far push bp mov bp,sp push ds push es push si push di
mov ax, 0 push ax call __parinfo ; how many params? add sp,2 cmp al,1 ; should be 1 jne @@bad_exit ; if not, we're out of here..
mov ax, 1 ; check the type push ax call __parinfo add sp,2 and ax,1 ; is it a string? cmp ax, 1 jne @@bad_exit ; if not, we're out of here..
mov ax, 1 push ax call __parclen ; how big is the string? add sp,2 cmp ax,0 je @@bad_exit ; don't bother with null strings
mov cx,ax ; save the length push cx ; because clipper screws it up
mov ax, 1 push ax call __parc ; where is the string? add sp,2 ; address in DX:AX pop cx ; get the length back
mov es, dx ; ES:DI point to it mov di, ax
mov ax, seg datasg ; use our data segment instead mov ds, ax ; of Clippers
mov ax,0ffffh ; pre-load initial CRC = FFFFFFFFh mov dx,ax ; so the first byte gets included ; in the CRC calculation @@nextbyte: mov bl,es:[di] ; Get byte from buffer inc di ; Set next buffer pointer xor bh,bh ; Convert BL to BX xor bl,al ; Calculate table index shl bx,1 ; Word offset shl bx,1 ; DWord offset
; 0 -> DH -> DL -> AH -> AL -> bit bucket mov al,ah ; Shr AH into AL mov ah,dl ; Shr DL into AH mov dl,dh ; Shr DH into DL xor dh,dh ; DH = 0
;Get new CRC from table xor ax,word ptr crc32_tbl[bx] ; Get new CRC-LO xor dx,word ptr crc32_tbl[bx][2] ; Get new CRC-HI
loop @@nextbyte ; Go until done
;Post-condition returned CRC not ax ; Invert AX not dx ; Invert DX
mov bx, seg crcstring ; point ds:si to our string mov ds, bx mov si, offset crcstring
mov bx, dx ; start converting bin -> ascii call bin2asc ; from the left (upper word)
mov bx, ax ; do the lower word call bin2asc ; leaves ASCII in [crcstring] jmp short @@returnstring
@@bad_exit: call __ret ; return NIL jmp short @@pops ; the funny jump is because ; Initial CRC pre-conditioning is 0FFFFFFFFh. ; we're out of range for a ; conditional jump on the 80xxx
@@returnstring: mov bx, offset crcstring ; point to our string mov ax, seg crcstring ; so Clipper can find it push ax ; push seg:ofs on stack push bx
mov ax, seg dgroup ; point ds to Clipper's dataseg mov ds, ax ; so it doesn't get all confused
call __retc ; send the data back to Clipper
add sp,4 ; fix the stack
@@pops: pop di pop si pop es pop ds pop bp Ret Crc32 Endp
bin2asc proc near ; displays the contents of BX as ASCII
push ax push bx push cx push dx
mov ch, 4h rotate: mov cl, 4h rol bx, cl mov al, bl and al, 0fh add al, '0' cmp al, '9' jle printit add al, 7 ; skip over the funny punctuation, ; do the alpha digits A - F
мне желательно на Клиппере, т.к. стандартный алгоритм изменен (добавлено crc ^= CRC_MASK;). Нужно от инициализации таблицы, то самой ф-ции. На Си это красиво.
crc32::crc32(){ const unsigned CRC_POLY = 0xEDB88320; unsigned i, j, r; for (i = 0; i < 256; i++){ for (r = i, j = 8; j; j--) r = r & 1? (r >> 1) ^ CRC_POLY: r >> 1; m_uiTable = r; } }
Function hstobin(hexs) Local ret:="",i:=1 for i=1 to 4 ret+= CHR(CTON( (substr(hexs,2*i-1,2)),16)) next i return ret
Function bintohs(bins) Local ret:="",i:=1,byte,n,n1,n2 Static arr:={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"} for i=1 to 4 byte:=substr(bins,i,1); n:=asc(byte) n1:=int(n/16); n2:=n-n1*16 ret+= arr[n1+1]+arr[n2+1] next i return ret
Так и переделать! Оставить функцию на Си, но только вставить передачу параметров и возвращение значение согласно соглашениям Clipper. Например, первая функция lista пишет:
цитата:
crc32::crc32(){ const unsigned CRC_POLY = 0xEDB88320; unsigned i, j, r; for (i = 0; i < 256; i++){ for (r = i, j = 8; j; j--) r = r & 1? (r >> 1) ^ CRC_POLY: r >> 1; m_uiTable = r; } }
один к одному будет работать для Clipper. Единственное, что нужно, так это убрать пространство имен, то есть написать просто void crc32( void ) { ....// как вышеуказанном примере. }
Для второй функции уже придется включать функции Clipper из расширения для обработки параметров и возвращаемого значения, как это сделано в примере Григория Филатова.
Все даты в формате GMT
3 час. Хитов сегодня: 239
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет