summaryrefslogtreecommitdiff
path: root/modules/language/python/module/os.scm
blob: b5b8a18d3322cfa627686abeecd9622ad95fe8a2 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(define-module (language python module os)
  #:use-module (system foreign)
  #:use-module (oop pf-objects)
  #:use-module (oop goops)
  #:use-module (language python for)
  #:use-module (language python yield)
  #:use-module (language python string)
  #:export (error name ctermid environ))

(define error 'OSError)
(define name  "posix")
(define ctermid
  (@ (guile) ctermid))
    

(define environ
  (let ()
    (define e (dereference-pointer (dynamic-pointer "environ" (dynamic-link))))
    (define (get-envs)
      (let lp ((e e))
        (let ((*e  (dereference-pointer e)))
          (if (null-pointer? *e)
              '()
              (cons
               (pointer->string *e)
               (lp (make-pointer (+ (pointer-address e) 8))))))))
    
    (define (getkw)
      (let lp ((es (get-envs)))
        (if (pair? es)
            (let ((x (string-split (car es) #\=)))
              (let ((k (car x))
                    (v (string-join (cdr x) "=")))
                (cons (cons k v) (lp (cdr es)))))
            '())))

    (define-python-class Env ()
      (define __init__
        (lambda (self) (values)))

      (define __getitem__
        (lambda (self k)
          (getenv (slot-ref (pystring k) 'str))))

      (define __setitem__
        (lambda (self k v) 
          (putenv (slot-ref (pystring (+ k "=" v)) 'str))))

      (define __delitem__
        (lambda (self k)
          (putenv (slot-ref (pystring k) 'str))))
      
      (define __iter__
        (lambda (self)
          ((make-generator ()
             (lambda (yield)
               (for ((x : (getkw))) ()
                    (yield (car x) (cdr x)))))))))
    
    
    (Env)))

(for ((k v : environ)) () (pk k))