* string to long routine

 name C_str6

 text

* long _strtol(str, ptr, base)
*    char *str;
*    char **ptr;
*    int base;

 global _strtol,__strtol

 ext umullong,addlong

__strtol
_strtol pshs u
 ldd #0
 std rslt
 std rslt+2
 std base
 stb sign
 stb dseen
 ldx 4,s str
2 ldb 0,x+
 cmpb #$20 skip spaces
 beq 2b
 cmpb #$9 skip tabs
 beq 2b
 cmpb #'+ check for sign
 beq 3f
 cmpb #'- minus sign?
 bne 32f
 com sign set sign
3 ldb 0,x+ get next char
32 stb digit save char
 ldd 8,s get base
 std base
 bne 36f is base == 0?
 ldb digit end of string?
 lbeq 80f
 cmpb #'0 check for leading 0 (octal)
 bne 36f
 inc dseen set digit seen
 ldb 0,x+ get next char
 stb digit save it
 lbeq 80f
 cmpb #'x
 beq 34f
 cmpb #'X xheck for hex (0x)
 bne 35f
34 ldd #16 set base 16
 std base
 clr dseen
 ldb 0,x+
 stb digit get next digit
 bra 40f
35 ldd #8 set base 8
 std base
 bra 40f
36 ldd base is base valid?
 ble 37f
 cmpd #16 max base is 16
 ble 40f
37 ldd #10 set invalid base to base 10
 std base
40 ldd base check if base 16
 cmpd #16
 bne 46f
 ldb digit get last char
 cmpb #'0 check for leading 0x
 bne 46f
 inc dseen set digit seen
 ldb 0,x+ get next char
 stb digit
 lbeq 80f
 cmpb #'x
 beq 42f
 cmpb #'X
 bne 46f
42 ldb 0,x+ get next char
 stb digit
 clr dseen
46 ldb digit get char
 beq 80f
47 cmpb #'0 check for valid character
 blo 80f
 cmpb #'9
 bhi 48f
 subd #'0
 bra 49f
48 andb #$df make upper case
 cmpb #'A
 blo 80f
 cmpb #'Z
 bhi 80f
 subb #$37 make digit
49 cmpb base+1 check if in base
 bhs 80f
 inc dseen set digit seen flag
 pshs x
 clra
 pshs d
 clrb
 pshs d
 ldd rslt+2
 pshs d
 ldd rslt
 pshs d
 ldd base multiply latest times base
 pshs d
 ldd #0
 pshs d
 jsr umullong
 jsr addlong add in digit
 puls d get result
 std rslt
 puls d
 std rslt+2
 puls x
 ldb 0,x+ get next char
 stb digit
 bne 47b end of string?
80 tst dseen valid digits?
 bne 90f
 ldd #0 set 0 result
 ldx 4,s fix pointer
 leax 1,x
 bra 92f
90 ldd rslt get result
 tst sign negative?
 beq 92f
 pshs d negate number
 ldd #0
 subd 0,s++
92 ldu 6,s get ptr
 beq 94f
 leax -1,x fix ptr
 stx 0,u
94 ldx #rslt
 puls u,pc

 bss

rslt rmb 4 result
base rmb 2 base
digit rmb 1 temp char storage
sign rmb 1 sign
dseen rmb 1 digit seen flag

 text
 end
