Advertisement
Guest User

string.apc

a guest
Mar 12th, 2014
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 5.42 KB | None | 0 0
  1. //
  2.  
  3. struct string
  4.     length  : int;
  5.     data    : [char];
  6. end;
  7.  
  8. struct wstring
  9.     length  : int;
  10.     data    : [wchar];
  11. end;
  12.  
  13. /**/
  14.  
  15. def strLen (str : ^char) : int inline
  16.     ch  : char = str[0];
  17.     len : int  = 0;
  18.     //
  19.     while (ch != #0) do len++; end;
  20.     return len;
  21. end;
  22.  
  23. def setLength (var s : string; const size : int) inline
  24.     //
  25.     if (s.length == 0) then
  26.         s.length = size+1;
  27.         s.data = new char(size+1);
  28.     else
  29.         tmp : string;
  30.         tmp.data = new char(size+s.length+1);
  31.         //
  32.         for i : int = 0, s.length do
  33.             tmp.data[i] = s.data[i];
  34.         end;
  35.  
  36.         s = tmp;
  37.     end;
  38. end;
  39.  
  40. //* Operators *//
  41.  
  42. def binary + (a, b : string) : string inline
  43.     res : string;
  44.     setLength (res, a.length+b.length);
  45.     //
  46.     memcpy (@res.data[0]       , @a.data[0], a.length*sizeof(char));
  47.     memcpy (@res.data[a.length], @b.data[0], b.length*sizeof(char));
  48.     //
  49.     res.data[res.length] = #0;
  50.     return res;
  51. end;
  52.  
  53. def binary + (a : string; b : char) : string inline
  54.     res : string;
  55.     setLength (res, a.length+1);
  56.     memcpy (@res.data[0], @a.data[0], (a.length+1)*sizeof(char));
  57.     //
  58.     res.data[res.length-1] = b;
  59.     res.data[res.length]   = #0;
  60.  
  61.     return res;
  62. end;
  63.  
  64. def binary + (a : char; b : string) : string inline
  65.     res : string;
  66.     setLength (res, a.length+1);
  67.     memcpy (@res.data[1], @b.data[0], (b.length+1)*sizeof(char) );
  68.     //
  69.     res.data[0] = a;
  70.     res.data[res.length] = #0;
  71.  
  72.     return res;
  73. end;
  74.  
  75. def binary + (a : string; b : ^char) : string inline
  76.     res : string;
  77.     setLength (res, a.length+strLen(b));
  78.     //
  79.     memcpy (@res.data[0], @a.data[0], a.length*sizeof(char));
  80.     memcpy (@res.data[a.length],  b, strLen(b)*sizeof(char));
  81.     //
  82.     res.data[res.length] = #0;
  83.     return res;
  84. end;
  85.  
  86. def binary + (a : ^char; b : string) : string inline
  87.     res : string;
  88.     setLength (res, b.length+strLen(a));
  89.     //
  90.     memcpy (@res.data[0], a, strLen(a)*sizeof(char));
  91.     memcpy (@res.data[strLen(a)], @b.data[0], b.length*sizeof(char));
  92.     //
  93.     res.data[res.length] = #0;
  94.     return res;
  95. end;
  96.  
  97. def assign [] (var id : string; const ch : char; const idx : int) inline
  98.     id.data[idx] = ch;
  99. end;
  100.  
  101. def assign (var id : string; const val : char) inline
  102.     setLength (id, 1);
  103.     id.data[0] = val;
  104.     id.data[1] = #0;
  105. end;
  106.  
  107. def assign (var id : string; const val : ^char) inline
  108.     setLength (id, strLen(val));
  109.     id.data[id.length] = #0;
  110.     //
  111.     memcpy ( @id.data[0], val, strLen(val)*sizeof(char) );
  112. end;
  113.  
  114. def binary = (const a, b : string) : bool inline
  115.     if a.length != b.length then return false; end;
  116.     for i : int = 0, a.length do
  117.         if a.data[i] != b.data[i] then return false; end;
  118.     end;
  119.     //
  120.     return true;
  121. end;
  122.  
  123. def binary = (const a : string; const b : char) : bool inline swap
  124.     return (a.length == 1) and (a.data[0] == b);
  125. end;
  126.  
  127. // Cast
  128.  
  129. def cast (const from : char) : string inline
  130.     res : string;
  131.     setLength (res, 1);
  132.  
  133.     res.data[0] = from;
  134.     res.data[1] = #0;
  135.  
  136.     return res;
  137. end;
  138.  
  139. def cast (const from : string) : ^char inline
  140.     return @from.data[0];
  141. end;
  142.  
  143. def cast (const from :  ^char) : string inline
  144.     res : string;
  145.     setLength (res, strLen(from));
  146.     res.data[res.length] = #0;
  147.     //
  148.     memcpy (@res.data[0], from, strLen(from)*sizeof(char));
  149.     return res;
  150. end;
  151.  
  152. // Utils
  153.  
  154. def decodeUTF8 (uc : wchar) : string
  155.     res : string;
  156.  
  157.     if (uc == 0x0040) then return ""; end;
  158.     if (uc >= 0xD800) && (uc <= 0xDFFF) then return ""; end;
  159.     if (uc > 0x1) && (uc <= 0x007F) then
  160.         res += char(uc);
  161.     elsif (uc > 0x007F) && (uc <= 0x07FF) then
  162.         b1 : byte = 0xC0 | (uc & 0x7C0) >> 6;
  163.         b2 : byte = 0x80 | (uc & 0x3F);
  164.         //
  165.         res += b1; res += b2;
  166.     elsif (uc > 0x07FF) && (uc <= 0xFFFF) then
  167.         b1 : byte = 0xE0 | (uc & 0xF000) >> 12;
  168.         b2 : byte = 0x80 | (uc & 0xFC0) >> 6;
  169.         b3 : byte = 0x80 | (uc & 0x3F);
  170.         //
  171.         res += b1; res += b2;
  172.         res += b3;
  173.     elsif (uc > 0xFFFF) && (uc <= 0x10FFFF) then
  174.         b1 : byte = 0xF0 | (uc & 0x1C00000) >> 18;
  175.         b2 : byte = 0x80 | (uc & 0x3F000) >> 12;
  176.         b3 : byte = 0x80 | (uc & 0xFC0) >> 6;
  177.         b4 : byte = 0x80 | (uc & 0x3F);
  178.         //
  179.         res += b1; res += b2;
  180.         res += b3; res += b4;
  181.     end;
  182. end;
  183.  
  184. def isDigit (const ch : char) : bool inline
  185.     return ch >= '0' && ch <= '9';
  186. end;
  187.  
  188. def pos (a : char; b : string) : int
  189.     for i : int = 0, b.length-1 do
  190.         if b.data[i] == a then
  191.             return i;
  192.         end;
  193.     end;
  194. end;
  195.  
  196. def copy (s : string; idx, count : int) : string
  197.     res : string;
  198.     //
  199.     if (idx <  0) then idx = 0; end;
  200.     if (idx >= s.length) then return res; end;
  201.     //
  202.     setLength (res, count);
  203.     j : int = 0;
  204.  
  205.     for i : int = idx, idx+count-1 do
  206.         if (j >= count) then break; end;
  207.         res.data[j] = s.data[i];
  208.         j++;
  209.     end;
  210.  
  211.     for j = 0, 10 do
  212.     end;
  213.  
  214.     //res.data[count] = #0;
  215.     //return res;
  216. end;
  217.  
  218. def del (var src : string; startChar : int; count : int)
  219.     if (startChar+count >= src.length) then return; end;
  220.     for i : int = startChar+count, src.length-1 do
  221.         src.data[i-count] = src.data[i];
  222.     end;
  223.  
  224.     setLength(src, src.length-count);
  225. end;
  226.  
  227. def str2int (const val : string) : int
  228.     res, j : int = 0;
  229.     //
  230.     for i : int = val.length-1, 0, -1 do
  231.         if (isDigit(val.data[i])) then res += (val.data[i]-'0') * powi (10, j);
  232.         else /*Error('Val is not digit!');*/ end;
  233.         //
  234.         j++;
  235.     end;
  236.     //
  237.     return res;
  238. end;
  239.  
  240. def int2str (val : int) : string
  241.     if (val == 0) then return "0"; end;
  242.  
  243.     res : string = "";
  244.     len : int = 0;
  245.     v   : int = val;
  246.     //
  247.     while (v != 0) do
  248.         len++;
  249.         v /= 10;
  250.     end;
  251.  
  252.     setLength(res, len);
  253.  
  254.     while (len != 0) do
  255.         x : int = val % 10;
  256.         val /= 10;
  257.         len--;
  258.  
  259.         res.data[len] = x+'0';
  260.     end;
  261.  
  262.     res.data[res.length] = #0;
  263.     return res;
  264. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement