--------------------------------------------------------------- [BUG/PRB.] VFP 9.0 FIX - LEFTC() FUNCTION January 2024 --------------------------------------------------------------- CCB 1. BUG: In vfp9 (and vfp7, vfp8), the LEFTC(cExpression, nCharacters) function returns cExpression if nCharacters < 0, now the LEFTC(cExpression, nCharacters) function returns an empty string if nCharacters < 0. The bug occurs in vfp7, vfp8 and vfp9, it does not occur in vfp6. There is a test program: *PROC testleftcfunction SET STEP OFF SET ECHO OFF SET DEBUG OFF SET ESCAPE OFF SET TALK OFF SET SAFETY OFF ?LEFT("abc",-5) && it displays "". ?LEFTC("abc",-5) && it displays "abc" in vfp9 (and vfp7, vfp8), it displays "" in vfpa (and vfp6). WAIT RETURN * END OF PROC TESTLEFTCFUNCTION. 2. CAUSE: There are some BUGs in the following code. 3. RESOLUTION: We can write some code to fix the BUG. Fun5056ee :: ; proc near push ecx ;0x005056ee : 51 push ebp ;0x005056ef : 55 push esi ;0x005056f0 : 56 push edi ;0x005056f1 : 57 call Fun420d8c ;0x005056f2 : e895b6f1ff mov esi , eax ;0x005056f7 : 8bf0 lea ebp , dword ptr [ esi + 44 ] ;0x005056f9 : 8d6e2c push ebp ;0x005056fc : 55 lea edi , dword ptr [ esp + 16 ] ;0x005056fd : 8d7c2410 call Fun420dd3 ;0x00505701 : e8cdb6f1ff test eax , eax ;0x00505706 : 85c0 jne Label505757 ;0x00505708 : 754d push ebx ;0x0050570a : 53 mov eax , esi ;0x0050570b : 8bc6 call Fun42371d ;0x0050570d : e80be0f1ff mov edi , ebp ;0x00505712 : 8bfd call Fun529a6e ;0x00505714 : e855430200 cmp byte ptr [ ebp + 0 ] , 049h ;0x00505719 : 807d0049 mov bl , 01h ;0x0050571d : b301 jne Label59104d ;0x0050571f : 0f8528b90800 Label505725 :: mov eax , dword ptr [ esp + 24 ] ;0x00505725 : 8b442418 test eax , eax ;0x00505729 : 85c0 jne Label59107b ;0x0050572b : 0f854ab90800 Label505731 :: mov ebx , dword ptr [ esi + 56 ] ;0x00505731 : 8b5e38 test ebx , ebx ;0x00505734 : 85db jl Label4500ab ;0x00505736 : 0f8c6fa9f4ff mov eax , dword ptr [ esi + 8 ] ;0x0050573c : 8b4608 cmp ebx , eax ;0x0050573f : 3bd8 jg Label50177e ;0x00505741 : 0f8f37c0ffff Label505747 :: mov eax , dword ptr [ esp + 16 ] ;0x00505747 : 8b442410 test eax , eax ;0x0050574b : 85c0 mov dword ptr [ esi + 8 ] , ebx ;0x0050574d : 895e08 pop ebx ;0x00505750 : 5b jne Label5910bd ;0x00505751 : 0f8566b90800 Label505757 :: pop edi ;0x00505757 : 5f pop esi ;0x00505758 : 5e pop ebp ;0x00505759 : 5d pop ecx ;0x0050575a : 59 ret 04h ;0x0050575b : c20400 Label59107b :: mov eax , dword ptr [ esi + 56 ] ;0x0059107b : 8b4638 mov ecx , dword ptr [ esi + 8 ] ;0x0059107e : 8b4e08 cmp eax , ecx ;0x00591081 : 3bc1 ; ; ---------------------------------------------------- ; VFP 9.0 FIX - LEFTC() FUNCTION ; June 2022 ; ---------------------------------------------------- ; CCB ; ; In vfp9, the LEFTC(cExpression, nCharacters) function returns cExpression if nCharacters < 0, ; now the LEFTC(cExpression, nCharacters) function returns an empty string if nCharacters < 0. ; ; 2022/6/27, by ccb ; ; jnb Label591087 ;0x00591083 : 7302 jnl Label591087 ;0x00591083 : 7302 mov ecx , eax ;0x00591085 : 8bc8 Label591087 :: mov eax , dword ptr [ Data9370f4 ] ;0x00591087 : a1f4709300 test byte ptr ah , 010h ;0x0059108c : f6c410 je Label5910b3 ;0x0059108f : 7422 xor eax , eax ;0x00591091 : 33c0 test ecx , ecx ;0x00591093 : 85c9 jle Label5910b5 ;0x00591095 : 7e1e mov edx , dword ptr [ esi + 32 ] ;0x00591097 : 8b5620 mov edx , dword ptr [edx] ;0x0059109a : 8b12 Label59109c :: movzx edi ,byte ptr [ eax + edx ] ;0x0059109c : 0fb63c10 test byte ptr [ edi + offset Data937120 ] , bl ;0x005910a0 : 849f20719300 je Label5910ad ;0x005910a6 : 7405 add eax , 02h ;0x005910a8 : 83c002 jmp Label5910ae ;0x005910ab : eb01 Label5910ad :: inc eax ;0x005910ad : 40 Label5910ae :: dec ecx ;0x005910ae : 49 jne Label59109c ;0x005910af : 75eb jmp Label5910b5 ;0x005910b1 : eb02 Label5910b3 :: mov eax , ecx ;0x005910b3 : 8bc1 Label5910b5 :: mov dword ptr [ esi + 56 ] , eax ;0x005910b5 : 894638 jmp Label505731 ;0x005910b8 : e97446f7ff 4. APPLIES TO: VFP 7.0.0.9262 VFP 7.0.0.9465 (SP1) VFP 8.0.0.2521 VFP 8.0.0.3117 (SP1) VFP 9.0.0.2412 VFP 9.0.0.3504 (SP1) VFP 9.0.0.4611 (SP2) VFP 9.0.0.5015 (SP2) VFP 9.0.0.5411 (SP2) VFP 9.0.0.5721 (SP2) VFP 9.0.0.5815 (SP2) VFP 9.0.0.6303 (SP2) VFP 9.0.0.6602 (SP2) VFP 9.0.0.7423 (SP2) The bug has been fixed in VFP Advanced. 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |