Subversion Repositories Kolibri OS

Rev

Rev 1913 | Blame | Last modification | View Log | Download | RSS feed

  1. tp_obj tp_print(TP) {
  2.     int n = 0;
  3.     tp_obj e;
  4.     TP_LOOP(e)
  5.         if (n) { con_printf(" "); }
  6.         con_printf("%s",TP_CSTR(e));
  7.         n += 1;
  8.     TP_END;
  9.     con_printf("\n");
  10.     return tp_None;
  11. }
  12.  
  13. #define BUF_SIZE 2048
  14. tp_obj tp_raw_input(TP) {
  15.     tp_obj prompt;
  16.     char *buf = malloc(BUF_SIZE);
  17.     if (tp->params.list.val->len)
  18.     {
  19.         prompt = TP_OBJ();
  20.         con_printf("%s", TP_CSTR(prompt));
  21.     }
  22.     con_gets(buf, BUF_SIZE);
  23.     return tp_string(buf);
  24. }
  25.  
  26. tp_obj tp_bind(TP) {
  27.     tp_obj r = TP_OBJ();
  28.     tp_obj self = TP_OBJ();
  29.     return tp_fnc_new(tp,r.fnc.ftype|2,r.fnc.val,self,r.fnc.info->globals);
  30. }
  31.  
  32. tp_obj tp_min(TP) {
  33.     tp_obj r = TP_OBJ();
  34.     tp_obj e;
  35.     TP_LOOP(e)
  36.         if (tp_cmp(tp,r,e) > 0) { r = e; }
  37.     TP_END;
  38.     return r;
  39. }
  40.  
  41. tp_obj tp_syscall(TP) {
  42.     tp_obj r = TP_OBJ();
  43.     int result;
  44.     asm("int $0x40":"=a"(result):
  45.         "a"((int)tp_get(tp, r, tp_string_n("eax", 3)).number.val),
  46.         "b"((int)tp_get(tp, r, tp_string_n("ebx", 3)).number.val),
  47.         "c"((int)tp_get(tp, r, tp_string_n("ecx", 3)).number.val),
  48.         "d"((int)tp_get(tp, r, tp_string_n("edx", 3)).number.val));
  49.     return tp_number(result);
  50. }
  51.  
  52. tp_obj tp_max(TP) {
  53.     tp_obj r = TP_OBJ();
  54.     tp_obj e;
  55.     TP_LOOP(e)
  56.         if (tp_cmp(tp,r,e) < 0) { r = e; }
  57.     TP_END;
  58.     return r;
  59. }
  60.  
  61. tp_obj tp_copy(TP) {
  62.     tp_obj r = TP_OBJ();
  63.     int type = r.type;
  64.     if (type == TP_LIST) {
  65.         return _tp_list_copy(tp,r);
  66.     } else if (type == TP_DICT) {
  67.         return _tp_dict_copy(tp,r);
  68.     }
  69.     tp_raise(tp_None,"tp_copy(%s)",TP_CSTR(r));
  70. }
  71.  
  72.  
  73. tp_obj tp_len_(TP) {
  74.     tp_obj e = TP_OBJ();
  75.     return tp_len(tp,e);
  76. }
  77.  
  78.  
  79. tp_obj tp_assert(TP) {
  80.     int a = TP_NUM();
  81.     if (a) { return tp_None; }
  82.     tp_raise(tp_None,"%s","assert failed");
  83. }
  84.  
  85. tp_obj tp_range(TP) {
  86.     int a,b,c,i;
  87.     tp_obj r = tp_list(tp);
  88.     switch (tp->params.list.val->len) {
  89.         case 1: a = 0; b = TP_NUM(); c = 1; break;
  90.         case 2:
  91.         case 3: a = TP_NUM(); b = TP_NUM(); c = TP_DEFAULT(tp_number(1)).number.val; break;
  92.         default: return r;
  93.     }
  94.     if (c != 0) {
  95.         for (i=a; (c>0) ? i<b : i>b; i+=c) {
  96.             _tp_list_append(tp,r.list.val,tp_number(i));
  97.         }
  98.     }
  99.     return r;
  100. }
  101.  
  102.  
  103. tp_obj tp_system(TP) {
  104.     char const *s = TP_STR();
  105.     int r = system(s);
  106.     return tp_number(r);
  107. }
  108.  
  109. tp_obj tp_istype(TP) {
  110.     tp_obj v = TP_OBJ();
  111.     char const *t = TP_STR();
  112.     if (strcmp("string",t) == 0) { return tp_number(v.type == TP_STRING); }
  113.     if (strcmp("list",t) == 0) { return tp_number(v.type == TP_LIST); }
  114.     if (strcmp("dict",t) == 0) { return tp_number(v.type == TP_DICT); }
  115.     if (strcmp("number",t) == 0) { return tp_number(v.type == TP_NUMBER); }
  116.     tp_raise(tp_None,"is_type(%s,%s)",TP_CSTR(v),t);
  117. }
  118.  
  119.  
  120. tp_obj tp_float(TP) {
  121.     tp_obj v = TP_OBJ();
  122.     int ord = TP_DEFAULT(tp_number(0)).number.val;
  123.     int type = v.type;
  124.     if (type == TP_NUMBER) { return v; }
  125.     if (type == TP_STRING) {
  126.         if (strchr(TP_CSTR(v),'.')) { return tp_number(atof(TP_CSTR(v))); }
  127.         return(tp_number(strtol(TP_CSTR(v),0,ord)));
  128.     }
  129.     tp_raise(tp_None,"tp_float(%s)",TP_CSTR(v));
  130. }
  131.  
  132.  
  133. tp_obj tp_save(TP) {
  134.     char const *fname = TP_STR();
  135.     tp_obj v = TP_OBJ();
  136.     FILE *f;
  137.     f = fopen(fname,"wb");
  138.     if (!f) { tp_raise(tp_None,"tp_save(%s,...)",fname); }
  139.     fwrite(v.string.val,v.string.len,1,f);
  140.     fclose(f);
  141.     return tp_None;
  142. }
  143.  
  144. #define READ_BLK 1024
  145. tp_obj tp_load(TP) {
  146.     FILE *f;
  147.     long l = 0;
  148.     tp_obj r;
  149.     char *s;
  150.     char const *fname = TP_STR();
  151.     long rd = 0;
  152.     long allocated = 32 * READ_BLK;
  153.  
  154.  
  155.     if (!(f = fopen(fname, "rb"))) {
  156.         tp_raise(tp_None,"tp_load(%s)",fname);
  157.     }
  158.     if (!(s = malloc(allocated)))
  159.       tp_raise(tp_None, "tp_load(%s): out of memory", fname);
  160.     rd = 0;
  161.     do {
  162.         if (l + READ_BLK < allocated) {
  163.             allocated += READ_BLK;
  164.             if (!(s = realloc(s, allocated))) {
  165.                 tp_raise(tp_None, "tp_load(%s): out of memory", fname);
  166.             }
  167.         }
  168.         rd = fread(s + l, 1, READ_BLK, f);
  169.         l += rd;
  170.     } while (rd == READ_BLK);
  171.     r = tp_string_n(s, l);
  172.     fclose(f);
  173.     return tp_track(tp,r);
  174. }
  175.  
  176.  
  177. tp_obj tp_fpack(TP) {
  178.     tp_num v = TP_NUM();
  179.     tp_obj r = tp_string_t(tp,sizeof(tp_num));
  180.     *(tp_num*)r.string.val = v;
  181.     return tp_track(tp,r);
  182. }
  183.  
  184. tp_obj tp_abs(TP) {
  185.     return tp_number(fabs(tp_float(tp).number.val));
  186. }
  187. tp_obj tp_int(TP) {
  188.     return tp_number((long)tp_float(tp).number.val);
  189. }
  190. tp_num _roundf(tp_num v) {
  191.     tp_num av = fabs(v); tp_num iv = (long)av;
  192.     av = (av-iv < 0.5?iv:iv+1);
  193.     return (v<0?-av:av);
  194. }
  195. tp_obj tp_round(TP) {
  196.     return tp_number(_roundf(tp_float(tp).number.val));
  197. }
  198.  
  199. tp_obj tp_exists(TP) {
  200.     char const *s = TP_STR();
  201.     struct stat stbuf;
  202.     return tp_number(!stat(s,&stbuf));
  203. }
  204. tp_obj tp_mtime(TP) {
  205.     char const *s = TP_STR();
  206.     struct stat stbuf;
  207.     if (!stat(s,&stbuf)) { return tp_number(stbuf.st_mtime); }
  208.     tp_raise(tp_None,"tp_mtime(%s)",s);
  209. }
  210.