Laurent MOULIN / Mbed 2 deprecated tinypy

Dependencies:   mbed

Committer:
gignops
Date:
Sun Oct 07 11:49:09 2012 +0000
Revision:
0:4ab1392a0142
This project is an adaptation of tinypy code. The aim is to run python code on Mbed.; ; Have fun !

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gignops 0:4ab1392a0142 1 #include "string.h"
gignops 0:4ab1392a0142 2
gignops 0:4ab1392a0142 3 tp_obj tp_string_t(TP, int n) {
gignops 0:4ab1392a0142 4 tp_obj r = tp_string_n(0,n);
gignops 0:4ab1392a0142 5 r.string.info = (_tp_string*)tp_malloc(sizeof(_tp_string)+n);
gignops 0:4ab1392a0142 6 r.string.val = r.string.info->s;
gignops 0:4ab1392a0142 7 return r;
gignops 0:4ab1392a0142 8 }
gignops 0:4ab1392a0142 9
gignops 0:4ab1392a0142 10 tp_obj tp_printf(TP, char const *fmt,...) {
gignops 0:4ab1392a0142 11 int l;
gignops 0:4ab1392a0142 12 tp_obj r;
gignops 0:4ab1392a0142 13 char *s;
gignops 0:4ab1392a0142 14 va_list arg;
gignops 0:4ab1392a0142 15 va_start(arg, fmt);
gignops 0:4ab1392a0142 16 l = vsnprintf(NULL, 0, fmt,arg);
gignops 0:4ab1392a0142 17 r = tp_string_t(tp,l);
gignops 0:4ab1392a0142 18 s = r.string.info->s;
gignops 0:4ab1392a0142 19 va_end(arg);
gignops 0:4ab1392a0142 20 va_start(arg, fmt);
gignops 0:4ab1392a0142 21 vsprintf(s,fmt,arg);
gignops 0:4ab1392a0142 22 va_end(arg);
gignops 0:4ab1392a0142 23 return tp_track(tp,r);
gignops 0:4ab1392a0142 24 }
gignops 0:4ab1392a0142 25
gignops 0:4ab1392a0142 26 int _tp_str_index(tp_obj s, tp_obj k) {
gignops 0:4ab1392a0142 27 int i=0;
gignops 0:4ab1392a0142 28 while ((s.string.len - i) >= k.string.len) {
gignops 0:4ab1392a0142 29 if (memcmp(s.string.val+i,k.string.val,k.string.len) == 0) {
gignops 0:4ab1392a0142 30 return i;
gignops 0:4ab1392a0142 31 }
gignops 0:4ab1392a0142 32 i += 1;
gignops 0:4ab1392a0142 33 }
gignops 0:4ab1392a0142 34 return -1;
gignops 0:4ab1392a0142 35 }
gignops 0:4ab1392a0142 36
gignops 0:4ab1392a0142 37 tp_obj tp_join(TP) {
gignops 0:4ab1392a0142 38 tp_obj delim = TP_OBJ();
gignops 0:4ab1392a0142 39 tp_obj val = TP_OBJ();
gignops 0:4ab1392a0142 40 int l=0,i;
gignops 0:4ab1392a0142 41 tp_obj r;
gignops 0:4ab1392a0142 42 char *s;
gignops 0:4ab1392a0142 43 for (i=0; i<val.list.val->len; i++) {
gignops 0:4ab1392a0142 44 if (i!=0) { l += delim.string.len; }
gignops 0:4ab1392a0142 45 l += tp_str(tp,val.list.val->items[i]).string.len;
gignops 0:4ab1392a0142 46 }
gignops 0:4ab1392a0142 47 r = tp_string_t(tp,l);
gignops 0:4ab1392a0142 48 s = r.string.info->s;
gignops 0:4ab1392a0142 49 l = 0;
gignops 0:4ab1392a0142 50 for (i=0; i<val.list.val->len; i++) {
gignops 0:4ab1392a0142 51 tp_obj e;
gignops 0:4ab1392a0142 52 if (i!=0) {
gignops 0:4ab1392a0142 53 memcpy(s+l,delim.string.val,delim.string.len); l += delim.string.len;
gignops 0:4ab1392a0142 54 }
gignops 0:4ab1392a0142 55 e = tp_str(tp,val.list.val->items[i]);
gignops 0:4ab1392a0142 56 memcpy(s+l,e.string.val,e.string.len); l += e.string.len;
gignops 0:4ab1392a0142 57 }
gignops 0:4ab1392a0142 58 return tp_track(tp,r);
gignops 0:4ab1392a0142 59 }
gignops 0:4ab1392a0142 60
gignops 0:4ab1392a0142 61 tp_obj tp_string_slice(TP,tp_obj s, int a, int b) {
gignops 0:4ab1392a0142 62 tp_obj r = tp_string_t(tp,b-a);
gignops 0:4ab1392a0142 63 char *m = r.string.info->s;
gignops 0:4ab1392a0142 64 memcpy(m,s.string.val+a,b-a);
gignops 0:4ab1392a0142 65 return tp_track(tp,r);
gignops 0:4ab1392a0142 66 }
gignops 0:4ab1392a0142 67
gignops 0:4ab1392a0142 68 tp_obj tp_split(TP)
gignops 0:4ab1392a0142 69 {
gignops 0:4ab1392a0142 70 tp_obj v = TP_OBJ();
gignops 0:4ab1392a0142 71 tp_obj d = TP_OBJ();
gignops 0:4ab1392a0142 72 tp_obj r = tp_list(tp);
gignops 0:4ab1392a0142 73
gignops 0:4ab1392a0142 74 int i;
gignops 0:4ab1392a0142 75 while ((i=_tp_str_index(v,d))!=-1) {
gignops 0:4ab1392a0142 76 _tp_list_append(tp,r.list.val,tp_string_slice(tp,v,0,i));
gignops 0:4ab1392a0142 77 v.string.val += i + d.string.len; v.string.len -= i + d.string.len;
gignops 0:4ab1392a0142 78 /* tp_grey(tp,r); // should stop gc or something instead*/
gignops 0:4ab1392a0142 79 }
gignops 0:4ab1392a0142 80 _tp_list_append(tp,r.list.val,tp_string_slice(tp,v,0,v.string.len));
gignops 0:4ab1392a0142 81 /* tp_grey(tp,r); // should stop gc or something instead*/
gignops 0:4ab1392a0142 82 return r;
gignops 0:4ab1392a0142 83 }
gignops 0:4ab1392a0142 84
gignops 0:4ab1392a0142 85
gignops 0:4ab1392a0142 86 tp_obj tp_find(TP) {
gignops 0:4ab1392a0142 87 tp_obj s = TP_OBJ();
gignops 0:4ab1392a0142 88 tp_obj v = TP_OBJ();
gignops 0:4ab1392a0142 89 return tp_number(_tp_str_index(s,v));
gignops 0:4ab1392a0142 90 }
gignops 0:4ab1392a0142 91
gignops 0:4ab1392a0142 92 tp_obj tp_str_index(TP) {
gignops 0:4ab1392a0142 93 tp_obj s = TP_OBJ();
gignops 0:4ab1392a0142 94 tp_obj v = TP_OBJ();
gignops 0:4ab1392a0142 95 int n = _tp_str_index(s,v);
gignops 0:4ab1392a0142 96 if (n >= 0) { return tp_number(n); }
gignops 0:4ab1392a0142 97 tp_raise(tp_None,"tp_str_index(%s,%s)",s,v);
gignops 0:4ab1392a0142 98 }
gignops 0:4ab1392a0142 99
gignops 0:4ab1392a0142 100 tp_obj tp_str2(TP) {
gignops 0:4ab1392a0142 101 tp_obj v = TP_OBJ();
gignops 0:4ab1392a0142 102 return tp_str(tp,v);
gignops 0:4ab1392a0142 103 }
gignops 0:4ab1392a0142 104
gignops 0:4ab1392a0142 105 tp_obj tp_chr(TP) {
gignops 0:4ab1392a0142 106 int v = TP_NUM();
gignops 0:4ab1392a0142 107 return tp_string_n(tp->chars[(unsigned char)v],1);
gignops 0:4ab1392a0142 108 }
gignops 0:4ab1392a0142 109 tp_obj tp_ord(TP) {
gignops 0:4ab1392a0142 110 char const *s = TP_STR();
gignops 0:4ab1392a0142 111 return tp_number((unsigned char)s[0]);
gignops 0:4ab1392a0142 112 }
gignops 0:4ab1392a0142 113
gignops 0:4ab1392a0142 114 tp_obj tp_strip(TP) {
gignops 0:4ab1392a0142 115 char const *v = TP_STR();
gignops 0:4ab1392a0142 116 int i, l = strlen(v); int a = l, b = 0;
gignops 0:4ab1392a0142 117 tp_obj r;
gignops 0:4ab1392a0142 118 char *s;
gignops 0:4ab1392a0142 119 for (i=0; i<l; i++) {
gignops 0:4ab1392a0142 120 if (v[i] != ' ' && v[i] != '\n' && v[i] != '\t' && v[i] != '\r') {
gignops 0:4ab1392a0142 121 a = _tp_min(a,i); b = _tp_max(b,i+1);
gignops 0:4ab1392a0142 122 }
gignops 0:4ab1392a0142 123 }
gignops 0:4ab1392a0142 124 if ((b-a) < 0) { return tp_string(""); }
gignops 0:4ab1392a0142 125 r = tp_string_t(tp,b-a);
gignops 0:4ab1392a0142 126 s = r.string.info->s;
gignops 0:4ab1392a0142 127 memcpy(s,v+a,b-a);
gignops 0:4ab1392a0142 128 return tp_track(tp,r);
gignops 0:4ab1392a0142 129 }
gignops 0:4ab1392a0142 130
gignops 0:4ab1392a0142 131
gignops 0:4ab1392a0142 132 tp_obj tp_replace(TP) {
gignops 0:4ab1392a0142 133 tp_obj s = TP_OBJ();
gignops 0:4ab1392a0142 134 tp_obj k = TP_OBJ();
gignops 0:4ab1392a0142 135 tp_obj v = TP_OBJ();
gignops 0:4ab1392a0142 136 tp_obj p = s;
gignops 0:4ab1392a0142 137 int i,n = 0;
gignops 0:4ab1392a0142 138 int c;
gignops 0:4ab1392a0142 139 int l;
gignops 0:4ab1392a0142 140 tp_obj rr;
gignops 0:4ab1392a0142 141 char *r;
gignops 0:4ab1392a0142 142 char *d;
gignops 0:4ab1392a0142 143 tp_obj z;
gignops 0:4ab1392a0142 144 while ((i = _tp_str_index(p,k)) != -1) {
gignops 0:4ab1392a0142 145 n += 1;
gignops 0:4ab1392a0142 146 p.string.val += i + k.string.len; p.string.len -= i + k.string.len;
gignops 0:4ab1392a0142 147 }
gignops 0:4ab1392a0142 148 /* fprintf(stderr,"ns: %d\n",n); */
gignops 0:4ab1392a0142 149 l = s.string.len + n * (v.string.len-k.string.len);
gignops 0:4ab1392a0142 150 rr = tp_string_t(tp,l);
gignops 0:4ab1392a0142 151 r = rr.string.info->s;
gignops 0:4ab1392a0142 152 d = r;
gignops 0:4ab1392a0142 153 z = p = s;
gignops 0:4ab1392a0142 154 while ((i = _tp_str_index(p,k)) != -1) {
gignops 0:4ab1392a0142 155 p.string.val += i; p.string.len -= i;
gignops 0:4ab1392a0142 156 memcpy(d,z.string.val,c=(p.string.val-z.string.val)); d += c;
gignops 0:4ab1392a0142 157 p.string.val += k.string.len; p.string.len -= k.string.len;
gignops 0:4ab1392a0142 158 memcpy(d,v.string.val,v.string.len); d += v.string.len;
gignops 0:4ab1392a0142 159 z = p;
gignops 0:4ab1392a0142 160 }
gignops 0:4ab1392a0142 161 memcpy(d,z.string.val,(s.string.val + s.string.len) - z.string.val);
gignops 0:4ab1392a0142 162
gignops 0:4ab1392a0142 163 return tp_track(tp,rr);
gignops 0:4ab1392a0142 164 }
gignops 0:4ab1392a0142 165