how about? unsigned oct2int(const char *oct) { int ch; unsigned value = 0;
while (((ch = *oct++) >= '0') && (ch <= '7')) { value <<= 3; value += (ch - '0'); } return value; } Regards -Bill Knight R O SoftWare On Wed, 28 Apr 2004 23:50:02 +0200, Robert Seczkowski wrote: >Horse and saddle to that guy who find what is wrong in below code: >unsigned int oct2int(const char* oct){ >unsigned int ret = 0; >int i,j=0,k,length = strlen(oct); > > for(i=length-1;i >= 0;i--){ > if((k=(oct[i]-'0')) > 0) ret += 1<<(3*j) * k;//8 = 2^3 > j++; > } >return ret; >} >Compiler doesn't report error. However code is not working as expected >To my supprise the code disables interrupts for ever. >So the example should look like: >unsigned int oct2int(const char* oct){ >unsigned int ret = 0; >int i,j=0,k,length = strlen(oct); > > for(i=length-1;i >= 0;i--){ > if((k=(oct[i]-'0')) > 0) ret += 1<<(3*j) * k;//8 = 2^3 > j++; > asm("eint"); > } >return ret; >} >Who was so smart !!! >Explanation below ( from assembly): >unsigned int oct2int(const char* oct){ > 8c42: 0b 12 push r11 ; > 8c44: 0a 12 push r10 ; > 8c46: 09 12 push r9 ; > 8c48: 08 12 push r8 ; > 8c4a: 0c 4f mov r15, r12 ; >unsigned int ret = 0; > 8c4c: 0b 43 clr r11 ; >int i,j=0,k,length = strlen(oct); > 8c4e: 0a 43 clr r10 ; > 8c50: 1f 83 dec r15 ; > 8c52: 1f 53 inc r15 ; > 8c54: cf 93 00 00 cmp.b #0, 0(r15) ;r3 As==00 > 8c58: fc 23 jnz $-6 ;abs 0x8c52 > 8c5a: 09 4f mov r15, r9 ; > 8c5c: 09 8c sub r12, r9 ; > for(i=length-1;i >= 0;i--){ > 8c5e: 0d 49 mov r9, r13 ; > 8c60: 3d 53 add #-1, r13 ;r3 As==11 > 8c62: e7 38 jl $+464 ;abs 0x8e32 > 8c64: 18 43 mov #1, r8 ;r3 As==01 > 8c66: 0f 4d mov r13, r15 ; > 8c68: 3f e3 inv r15 ; > 8c6a: 0e 4f mov r15, r14 ; > 8c6c: 3e f0 03 00 and #3, r14 ;#0x0003 > 8c70: 0f 49 mov r9, r15 ; > 8c72: 2f 83 decd r15 ; > 8c74: 42 38 jl $+134 ;abs 0x8cfa > 8c76: 0e 93 cmp #0, r14 ;r3 As==00 > 8c78: 5f 24 jz $+192 ;abs 0x8d38 > 8c7a: 3e 90 03 00 cmp #3, r14 ;#0x0003 > 8c7e: 3d 34 jge $+124 ;abs 0x8cfa > 8c80: 2e 93 cmp #2, r14 ;r3 As==10 > 8c82: 1d 34 jge $+60 ;abs 0x8cbe > if((k=(oct[i]-'0')) > 0) ret += 1<<(3*j) * k;//8 = 2^3 > 8c84: 0f 4c mov r12, r15 ; > 8c86: 0f 5d add r13, r15 ; > 8c88: 6f 4f mov.b @r15, r15 ; > 8c8a: 8f 11 sxt r15 ; > 8c8c: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8c90: 1f 93 cmp #1, r15 ;r3 As==01 > 8c92: 13 38 jl $+40 ;abs 0x8cba > 8c94: 02 12 push r2 ; > 8c96: 32 c2 dint > 8c98: 03 43 nop > 8c9a: 82 4b 32 01 mov r11, &0x0132 ; > 8c9e: 82 4f 38 01 mov r15, &0x0138 ; > 8ca2: 1e 42 3a 01 mov &0x013a,r14 ;0x013a > 8ca6: 32 41 pop r2 ; > 8ca8: 0f 4e mov r14, r15 ; > 8caa: 0f 5f rla r15 ; > 8cac: 0f 5e add r14, r15 ; > 8cae: 0b 48 mov r8, r11 ; > 8cb0: 0f 93 cmp #0, r15 ;r3 As==00 > 8cb2: 03 24 jz $+8 ;abs 0x8cba > 8cb4: 0b 5b rla r11 ; > 8cb6: 1f 83 dec r15 ; > 8cb8: fd 23 jnz $-4 ;abs 0x8cb4 > j++; > 8cba: 1a 53 inc r10 ; > 8cbc: 3d 53 add #-1, r13 ;r3 As==11 > 8cbe: 0f 4c mov r12, r15 ; > 8cc0: 0f 5d add r13, r15 ; > 8cc2: 6f 4f mov.b @r15, r15 ; > 8cc4: 8f 11 sxt r15 ; > 8cc6: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8cca: 1f 93 cmp #1, r15 ;r3 As==01 > 8ccc: 14 38 jl $+42 ;abs 0x8cf6 > 8cce: 02 12 push r2 ; > 8cd0: 32 c2 dint > 8cd2: 03 43 nop > 8cd4: 82 4a 32 01 mov r10, &0x0132 ; > 8cd8: 82 4f 38 01 mov r15, &0x0138 ; > 8cdc: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8ce0: 32 41 pop r2 ; > 8ce2: 0e 4f mov r15, r14 ; > 8ce4: 0e 5e rla r14 ; > 8ce6: 0e 5f add r15, r14 ; > 8ce8: 0f 48 mov r8, r15 ; > 8cea: 0e 93 cmp #0, r14 ;r3 As==00 > 8cec: 03 24 jz $+8 ;abs 0x8cf4 > 8cee: 0f 5f rla r15 ; > 8cf0: 1e 83 dec r14 ; > 8cf2: fd 23 jnz $-4 ;abs 0x8cee > 8cf4: 0b 5f add r15, r11 ; > 8cf6: 1a 53 inc r10 ; > 8cf8: 3d 53 add #-1, r13 ;r3 As==11 > 8cfa: 0f 4c mov r12, r15 ; > 8cfc: 0f 5d add r13, r15 ; > 8cfe: 6f 4f mov.b @r15, r15 ; > 8d00: 8f 11 sxt r15 ; > 8d02: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8d06: 1f 93 cmp #1, r15 ;r3 As==01 > 8d08: 14 38 jl $+42 ;abs 0x8d32 > 8d0a: 02 12 push r2 ; > 8d0c: 32 c2 dint > 8d0e: 03 43 nop > 8d10: 82 4a 32 01 mov r10, &0x0132 ; > 8d14: 82 4f 38 01 mov r15, &0x0138 ; > 8d18: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8d1c: 32 41 pop r2 ; > 8d1e: 0e 4f mov r15, r14 ; > 8d20: 0e 5e rla r14 ; > 8d22: 0e 5f add r15, r14 ; > 8d24: 0f 48 mov r8, r15 ; > 8d26: 0e 93 cmp #0, r14 ;r3 As==00 > 8d28: 03 24 jz $+8 ;abs 0x8d30 > 8d2a: 0f 5f rla r15 ; > 8d2c: 1e 83 dec r14 ; > 8d2e: fd 23 jnz $-4 ;abs 0x8d2a > 8d30: 0b 5f add r15, r11 ; > 8d32: 1a 53 inc r10 ; > 8d34: 3d 53 add #-1, r13 ;r3 As==11 > 8d36: 7d 38 jl $+252 ;abs 0x8e32 > 8d38: 0f 4c mov r12, r15 ; > 8d3a: 0f 5d add r13, r15 ; > 8d3c: 6f 4f mov.b @r15, r15 ; > 8d3e: 8f 11 sxt r15 ; > 8d40: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8d44: 1f 93 cmp #1, r15 ;r3 As==01 > 8d46: 14 38 jl $+42 ;abs 0x8d70 > 8d48: 02 12 push r2 ; > 8d4a: 32 c2 dint > 8d4c: 03 43 nop > 8d4e: 82 4a 32 01 mov r10, &0x0132 ; > 8d52: 82 4f 38 01 mov r15, &0x0138 ; > 8d56: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8d5a: 32 41 pop r2 ; > 8d5c: 0e 4f mov r15, r14 ; > 8d5e: 0e 5e rla r14 ; > 8d60: 0e 5f add r15, r14 ; > 8d62: 0f 48 mov r8, r15 ; > 8d64: 0e 93 cmp #0, r14 ;r3 As==00 > 8d66: 03 24 jz $+8 ;abs 0x8d6e > 8d68: 0f 5f rla r15 ; > 8d6a: 1e 83 dec r14 ; > 8d6c: fd 23 jnz $-4 ;abs 0x8d68 > 8d6e: 0b 5f add r15, r11 ; > 8d70: 0e 4a mov r10, r14 ; > 8d72: 1e 53 inc r14 ; > 8d74: 0f 4d mov r13, r15 ; > 8d76: 0f 5c add r12, r15 ; > 8d78: 5f 4f ff ff mov.b -1(r15),r15 ; > 8d7c: 8f 11 sxt r15 ; > 8d7e: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8d82: 1f 93 cmp #1, r15 ;r3 As==01 > 8d84: 14 38 jl $+42 ;abs 0x8dae > 8d86: 02 12 push r2 ; > 8d88: 32 c2 dint > 8d8a: 03 43 nop > 8d8c: 82 4e 32 01 mov r14, &0x0132 ; > 8d90: 82 4f 38 01 mov r15, &0x0138 ; > 8d94: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8d98: 32 41 pop r2 ; > 8d9a: 0e 4f mov r15, r14 ; > 8d9c: 0e 5e rla r14 ; > 8d9e: 0e 5f add r15, r14 ; > 8da0: 0f 48 mov r8, r15 ; > 8da2: 0e 93 cmp #0, r14 ;r3 As==00 > 8da4: 03 24 jz $+8 ;abs 0x8dac > 8da6: 0f 5f rla r15 ; > 8da8: 1e 83 dec r14 ; > 8daa: fd 23 jnz $-4 ;abs 0x8da6 > 8dac: 0b 5f add r15, r11 ; > 8dae: 0e 4a mov r10, r14 ; > 8db0: 2e 53 incd r14 ; > 8db2: 0f 4d mov r13, r15 ; > 8db4: 0f 5c add r12, r15 ; > 8db6: 5f 4f fe ff mov.b -2(r15),r15 ; > 8dba: 8f 11 sxt r15 ; > 8dbc: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8dc0: 1f 93 cmp #1, r15 ;r3 As==01 > 8dc2: 14 38 jl $+42 ;abs 0x8dec > 8dc4: 02 12 push r2 ; > 8dc6: 32 c2 dint > 8dc8: 03 43 nop > 8dca: 82 4e 32 01 mov r14, &0x0132 ; > 8dce: 82 4f 38 01 mov r15, &0x0138 ; > 8dd2: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8dd6: 32 41 pop r2 ; > 8dd8: 0e 4f mov r15, r14 ; > 8dda: 0e 5e rla r14 ; > 8ddc: 0e 5f add r15, r14 ; > 8dde: 0f 48 mov r8, r15 ; > 8de0: 0e 93 cmp #0, r14 ;r3 As==00 > 8de2: 03 24 jz $+8 ;abs 0x8dea > 8de4: 0f 5f rla r15 ; > 8de6: 1e 83 dec r14 ; > 8de8: fd 23 jnz $-4 ;abs 0x8de4 > 8dea: 0b 5f add r15, r11 ; > 8dec: 0e 4a mov r10, r14 ; > 8dee: 3e 50 03 00 add #3, r14 ;#0x0003 > 8df2: 0f 4d mov r13, r15 ; > 8df4: 0f 5c add r12, r15 ; > 8df6: 5f 4f fd ff mov.b -3(r15),r15 ; > 8dfa: 8f 11 sxt r15 ; > 8dfc: 3f 50 d0 ff add #-48, r15 ;#0xffd0 > 8e00: 1f 93 cmp #1, r15 ;r3 As==01 > 8e02: 14 38 jl $+42 ;abs 0x8e2c > 8e04: 02 12 push r2 ; > 8e06: 32 c2 dint > 8e08: 03 43 nop > 8e0a: 82 4e 32 01 mov r14, &0x0132 ; > 8e0e: 82 4f 38 01 mov r15, &0x0138 ; > 8e12: 1f 42 3a 01 mov &0x013a,r15 ;0x013a > 8e16: 32 41 pop r2 ; > 8e18: 0e 4f mov r15, r14 ; > 8e1a: 0e 5e rla r14 ; > 8e1c: 0e 5f add r15, r14 ; > 8e1e: 0f 48 mov r8, r15 ; > 8e20: 0e 93 cmp #0, r14 ;r3 As==00 > 8e22: 03 24 jz $+8 ;abs 0x8e2a > 8e24: 0f 5f rla r15 ; > 8e26: 1e 83 dec r14 ; > 8e28: fd 23 jnz $-4 ;abs 0x8e24 > 8e2a: 0b 5f add r15, r11 ; > 8e2c: 2a 52 add #4, r10 ;r2 As==10 > 8e2e: 2d 82 sub #4, r13 ;r2 As==10 > 8e30: 83 37 jge $-248 ;abs 0x8d38 > } >return ret; >} > 8e32: 0f 4b mov r11, r15 ; > 8e34: 38 41 pop r8 ; > 8e36: 39 41 pop r9 ; > 8e38: 3a 41 pop r10 ; > 8e3a: 3b 41 pop r11 ; > 8e3c: 30 41 ret >-- >------------------------ > Jeszcze lepsza oferta AlphaNet > - nowe serwery wirtualne > - nowy sklep internetowy > - nowy wirtualny administrator > Sprawdz www.alpha.pl >------------------------