@@ -8,6 +8,7 @@ package builtin
8
8
import (
9
9
"fmt"
10
10
"math/big"
11
+ "strconv"
11
12
"unicode/utf8"
12
13
13
14
"github.com/go-python/gpython/compile"
@@ -53,7 +54,7 @@ func init() {
53
54
py .MustNewMethod ("min" , builtin_min , 0 , min_doc ),
54
55
py .MustNewMethod ("next" , builtin_next , 0 , next_doc ),
55
56
py .MustNewMethod ("open" , builtin_open , 0 , open_doc ),
56
- // py.MustNewMethod("oct", builtin_oct, 0, oct_doc),
57
+ py .MustNewMethod ("oct" , builtin_oct , 0 , oct_doc ),
57
58
py .MustNewMethod ("ord" , builtin_ord , 0 , ord_doc ),
58
59
py .MustNewMethod ("pow" , builtin_pow , 0 , pow_doc ),
59
60
py .MustNewMethod ("print" , builtin_print , 0 , print_doc ),
@@ -592,6 +593,56 @@ func builtin_open(self py.Object, args py.Tuple, kwargs py.StringDict) (py.Objec
592
593
int (buffering .(py.Int )))
593
594
}
594
595
596
+ const oct_doc = `oct(number) -> string
597
+
598
+ Return the octal representation of an integer.
599
+
600
+ >>> oct(342391)
601
+ '0o1234567'
602
+ `
603
+
604
+ func builtin_oct (self , v py.Object ) (py.Object , error ) {
605
+ var (
606
+ i int64
607
+ err error
608
+ )
609
+ switch v := v .(type ) {
610
+ case * py.BigInt :
611
+ vv := (* big .Int )(v )
612
+ neg := false
613
+ if vv .Cmp (big .NewInt (0 )) == - 1 {
614
+ neg = true
615
+ }
616
+ str := vv .Text (8 )
617
+ if neg {
618
+ str = "-0o" + str [1 :]
619
+ } else {
620
+ str = "0o" + str
621
+ }
622
+ return py .String (str ), nil
623
+ case py.IGoInt64 :
624
+ i , err = v .GoInt64 ()
625
+ case py.IGoInt :
626
+ var vv int
627
+ vv , err = v .GoInt ()
628
+ i = int64 (vv )
629
+ default :
630
+ return nil , py .ExceptionNewf (py .TypeError , "'%s' object cannot be interpreted as an integer" , v .Type ().Name )
631
+ }
632
+
633
+ if err != nil {
634
+ return nil , err
635
+ }
636
+
637
+ str := strconv .FormatInt (i , 8 )
638
+ if i < 0 {
639
+ str = "-0o" + str [1 :]
640
+ } else {
641
+ str = "0o" + str
642
+ }
643
+ return py .String (str ), nil
644
+ }
645
+
595
646
const ord_doc = `ord(c) -> integer
596
647
597
648
Return the integer ordinal of a one-character string.`
@@ -865,11 +916,16 @@ func builtin_hex(self, v py.Object) (py.Object, error) {
865
916
// test bigint first to make sure we correctly handle the case
866
917
// where int64 isn't large enough.
867
918
vv := (* big .Int )(v )
868
- format := "%#x"
919
+ neg := false
869
920
if vv .Cmp (big .NewInt (0 )) == - 1 {
870
- format = "%+#x"
921
+ neg = true
922
+ }
923
+ str := vv .Text (16 )
924
+ if neg {
925
+ str = "-0x" + str [1 :]
926
+ } else {
927
+ str = "0x" + str
871
928
}
872
- str := fmt .Sprintf (format , vv )
873
929
return py .String (str ), nil
874
930
case py.IGoInt64 :
875
931
i , err = v .GoInt64 ()
@@ -885,11 +941,12 @@ func builtin_hex(self, v py.Object) (py.Object, error) {
885
941
return nil , err
886
942
}
887
943
888
- format := "%#x"
944
+ str := strconv . FormatInt ( i , 16 )
889
945
if i < 0 {
890
- format = "%+#x"
946
+ str = "-0x" + str [1 :]
947
+ } else {
948
+ str = "0x" + str
891
949
}
892
- str := fmt .Sprintf (format , i )
893
950
return py .String (str ), nil
894
951
}
895
952
0 commit comments