Fixed combining function.
[chise/kage.git] / kagecgi / kagechar.c
index 7cb65e8..6223377 100755 (executable)
 #include "kagecgi.h"\r
 #include "sysdep.h"\r
 \r
-int isIDS(const GString *in){\r
-       //check IDC "u2ff*"\r
-       if(strncmp(in->str, "u2ff", 4) == 0){\r
-               //check the last char\r
-               if('0' <= (in->str)[4] && (in->str)[4] <= 'a') return TRUE;\r
-       }\r
-       return FALSE;\r
+int isIDS(const KGString *in){\r
+  //check IDC "u2ff*"\r
+  if(strncmp(in->str, "u2ff", 4) == 0){\r
+    //check the last char\r
+    if('0' <= (in->str)[4] && (in->str)[4] <= 'a') return 1; //true\r
+  }\r
+  return 0; //false\r
 }\r
 \r
-void divideInto2(const GString *in, GString *partIDS1, GString *partIDS3){\r
-       GString *buffer[16];\r
-       char tmp[kMaxIDCLength + 1];\r
-       int i, counter, pointer, flag;\r
-       \r
-       g_string_set_size(partIDS1, 0);\r
-       \r
-       counter = 0;\r
-       pointer = 0;\r
-       for(i = 0; i < in->len; i++){\r
-               if((in->str)[i] == '.'){\r
-                       strncpy(tmp, (in->str) + pointer, i - pointer);\r
-                       tmp[i - pointer] = '\0';\r
-                       buffer[counter] = g_string_new(tmp);\r
-                       counter++;\r
-                       pointer = i + 1;\r
-               }\r
-       }\r
-       strncpy(tmp, (in->str) + pointer, i - pointer);\r
-       tmp[i - pointer] = '\0';\r
-       buffer[counter] = g_string_new(tmp);\r
-       counter++;\r
-       \r
-       //reject over-length of IDS\r
-       if(counter > kMaxIDSSequenceLength) return;\r
-       \r
-       //1st scan\r
-       pointer = 1;\r
-       flag = 0;\r
-       while(flag >= 0 && pointer < counter){\r
-               g_string_append(partIDS1, (buffer[pointer])->str);\r
-               g_string_append(partIDS1, ".");\r
-               if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
-                       switch (((buffer[pointer])->str)[4]){\r
-                               case '0':\r
-                               case '1':\r
-                               case '4':\r
-                               case '5':\r
-                               case '6':\r
-                               case '7':\r
-                               case '8':\r
-                               case '9':\r
-                               case 'a':\r
-                               case 'b':\r
-                                       flag++;\r
-                                       break;\r
-                               case '2':\r
-                               case '3':\r
-                                       flag = flag + 2;\r
-                                       break;\r
-                       }\r
-               }\r
-               else flag--;\r
-               pointer++;\r
-       }\r
-       g_string_erase(partIDS1, partIDS1->len - 1, 1);\r
-       \r
-       //2nd scan\r
-       flag = 0;\r
-       while(flag >= 0 && pointer < counter){\r
-               g_string_append(partIDS3, (buffer[pointer])->str);\r
-               g_string_append(partIDS3, ".");\r
-               if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
-                       switch (((buffer[pointer])->str)[4]){\r
-                               case '0':\r
-                               case '1':\r
-                               case '4':\r
-                               case '5':\r
-                               case '6':\r
-                               case '7':\r
-                               case '8':\r
-                               case '9':\r
-                               case 'a':\r
-                               case 'b':\r
-                                       flag++;\r
-                                       break;\r
-                               case '2':\r
-                               case '3':\r
-                                       flag = flag + 2;\r
-                                       break;\r
-                       }\r
-               }\r
-               else flag--;\r
-               pointer++;\r
-       }\r
-       g_string_erase(partIDS3, partIDS3->len - 1, 1);\r
+void divideInto2(const KGString *in, KGString *partIDS1, KGString *partIDS3){\r
+  KGString *buffer[16];\r
+  char tmp[kMaxIDCLength + 1];\r
+  int i, counter, pointer, flag;\r
+  \r
+  kg_string_set_size(partIDS1, 0);\r
+  \r
+  counter = 0;\r
+  pointer = 0;\r
+  for(i = 0; i < in->len; i++){\r
+    if((in->str)[i] == '.'){\r
+      strncpy(tmp, (in->str) + pointer, i - pointer);\r
+      tmp[i - pointer] = '\0';\r
+      buffer[counter] = kg_string_new(tmp);\r
+      counter++;\r
+      pointer = i + 1;\r
+    }\r
+  }\r
+  strncpy(tmp, (in->str) + pointer, i - pointer);\r
+  tmp[i - pointer] = '\0';\r
+  buffer[counter] = kg_string_new(tmp);\r
+  counter++;\r
+  \r
+  //reject over-length of IDS\r
+  if(counter > kMaxIDSSequenceLength) return;\r
+  \r
+  //1st scan\r
+  pointer = 1;\r
+  flag = 0;\r
+  while(flag >= 0 && pointer < counter){\r
+    kg_string_append(partIDS1, (buffer[pointer])->str);\r
+    kg_string_append(partIDS1, ".");\r
+    if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
+      switch (((buffer[pointer])->str)[4]){\r
+      case '0':\r
+      case '1':\r
+      case '4':\r
+      case '5':\r
+      case '6':\r
+      case '7':\r
+      case '8':\r
+      case '9':\r
+      case 'a':\r
+      case 'b':\r
+       flag++;\r
+       break;\r
+      case '2':\r
+      case '3':\r
+       flag = flag + 2;\r
+       break;\r
+      }\r
+    }\r
+    else flag--;\r
+    pointer++;\r
+  }\r
+  kg_string_erase(partIDS1, partIDS1->len - 1, 1);\r
+  \r
+  //2nd scan\r
+  flag = 0;\r
+  while(flag >= 0 && pointer < counter){\r
+    kg_string_append(partIDS3, (buffer[pointer])->str);\r
+    kg_string_append(partIDS3, ".");\r
+    if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
+      switch (((buffer[pointer])->str)[4]){\r
+      case '0':\r
+      case '1':\r
+      case '4':\r
+      case '5':\r
+      case '6':\r
+      case '7':\r
+      case '8':\r
+      case '9':\r
+      case 'a':\r
+      case 'b':\r
+       flag++;\r
+       break;\r
+      case '2':\r
+      case '3':\r
+       flag = flag + 2;\r
+       break;\r
+      }\r
+    }\r
+    else flag--;\r
+    pointer++;\r
+  }\r
+  kg_string_erase(partIDS3, partIDS3->len - 1, 1);\r
 }\r
 \r
-void divideInto3(const GString *in, GString *partIDS1, GString *partIDS2, GString *partIDS3){\r
-       GString *buffer[16];\r
-       char tmp[kMaxIDCLength + 1];\r
-       int i, counter, pointer, flag;\r
-       \r
-       g_string_set_size(partIDS1, 0);\r
-       \r
-       counter = 0;\r
-       pointer = 0;\r
-       for(i = 0; i < in->len; i++){\r
-               if((in->str)[i] == '.'){\r
-                       strncpy(tmp, (in->str) + pointer, i - pointer);\r
-                       tmp[i - pointer] = '\0';\r
-                       buffer[counter] = g_string_new(tmp);\r
-                       counter++;\r
-                       pointer = i + 1;\r
-               }\r
-       }\r
-       strncpy(tmp, (in->str) + pointer, i - pointer);\r
-       tmp[i - pointer] = '\0';\r
-       buffer[counter] = g_string_new(tmp);\r
-       counter++;\r
-       \r
-       //reject over-length of IDS\r
-       if(counter > kMaxIDSSequenceLength) return;\r
-       \r
-       //1st scan\r
-       pointer = 1;\r
-       flag = 0;\r
-       while(flag >= 0 && pointer < counter){\r
-               g_string_append(partIDS1, (buffer[pointer])->str);\r
-               g_string_append(partIDS1, ".");\r
-               if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
-                       switch (((buffer[pointer])->str)[4]){\r
-                               case '0':\r
-                               case '1':\r
-                               case '4':\r
-                               case '5':\r
-                               case '6':\r
-                               case '7':\r
-                               case '8':\r
-                               case '9':\r
-                               case 'a':\r
-                               case 'b':\r
-                                       flag++;\r
-                                       break;\r
-                               case '2':\r
-                               case '3':\r
-                                       flag = flag + 2;\r
-                                       break;\r
-                       }\r
-               }\r
-               else flag--;\r
-               pointer++;\r
-       }\r
-       g_string_erase(partIDS1, partIDS1->len - 1, 1);\r
-       \r
-       //2nd scan\r
-       flag = 0;\r
-       while(flag >= 0 && pointer < counter){\r
-               g_string_append(partIDS2, (buffer[pointer])->str);\r
-               g_string_append(partIDS2, ".");\r
-               if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
-                       switch (((buffer[pointer])->str)[4]){\r
-                               case '0':\r
-                               case '1':\r
-                               case '4':\r
-                               case '5':\r
-                               case '6':\r
-                               case '7':\r
-                               case '8':\r
-                               case '9':\r
-                               case 'a':\r
-                               case 'b':\r
-                                       flag++;\r
-                                       break;\r
-                               case '2':\r
-                               case '3':\r
-                                       flag = flag + 2;\r
-                                       break;\r
-                       }\r
-               }\r
-               else flag--;\r
-               pointer++;\r
-       }\r
-       g_string_erase(partIDS2, partIDS2->len - 1, 1);\r
-       \r
-       //3rd scan\r
-       flag = 0;\r
-       while(flag >= 0 && pointer < counter){\r
-               g_string_append(partIDS3, (buffer[pointer])->str);\r
-               g_string_append(partIDS3, ".");\r
-               if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
-                       switch (((buffer[pointer])->str)[4]){\r
-                               case '0':\r
-                               case '1':\r
-                               case '4':\r
-                               case '5':\r
-                               case '6':\r
-                               case '7':\r
-                               case '8':\r
-                               case '9':\r
-                               case 'a':\r
-                               case 'b':\r
-                                       flag++;\r
-                                       break;\r
-                               case '2':\r
-                               case '3':\r
-                                       flag = flag + 2;\r
-                                       break;\r
-                       }\r
-               }\r
-               else flag--;\r
-               pointer++;\r
-       }\r
-       g_string_erase(partIDS3, partIDS3->len - 1, 1);\r
+void divideInto3(const KGString *in, KGString *partIDS1, KGString *partIDS2, KGString *partIDS3){\r
+  KGString *buffer[16];\r
+  char tmp[kMaxIDCLength + 1];\r
+  int i, counter, pointer, flag;\r
+  \r
+  kg_string_set_size(partIDS1, 0);\r
+  \r
+  counter = 0;\r
+  pointer = 0;\r
+  for(i = 0; i < in->len; i++){\r
+    if((in->str)[i] == '.'){\r
+      strncpy(tmp, (in->str) + pointer, i - pointer);\r
+      tmp[i - pointer] = '\0';\r
+      buffer[counter] = kg_string_new(tmp);\r
+      counter++;\r
+      pointer = i + 1;\r
+    }\r
+  }\r
+  strncpy(tmp, (in->str) + pointer, i - pointer);\r
+  tmp[i - pointer] = '\0';\r
+  buffer[counter] = kg_string_new(tmp);\r
+  counter++;\r
+  \r
+  //reject over-length of IDS\r
+  if(counter > kMaxIDSSequenceLength) return;\r
+  \r
+  //1st scan\r
+  pointer = 1;\r
+  flag = 0;\r
+  while(flag >= 0 && pointer < counter){\r
+    kg_string_append(partIDS1, (buffer[pointer])->str);\r
+    kg_string_append(partIDS1, ".");\r
+    if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
+      switch (((buffer[pointer])->str)[4]){\r
+      case '0':\r
+      case '1':\r
+      case '4':\r
+      case '5':\r
+      case '6':\r
+      case '7':\r
+      case '8':\r
+      case '9':\r
+      case 'a':\r
+      case 'b':\r
+       flag++;\r
+       break;\r
+      case '2':\r
+      case '3':\r
+       flag = flag + 2;\r
+       break;\r
+      }\r
+    }\r
+    else flag--;\r
+    pointer++;\r
+  }\r
+  kg_string_erase(partIDS1, partIDS1->len - 1, 1);\r
+  \r
+  //2nd scan\r
+  flag = 0;\r
+  while(flag >= 0 && pointer < counter){\r
+    kg_string_append(partIDS2, (buffer[pointer])->str);\r
+    kg_string_append(partIDS2, ".");\r
+    if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
+      switch (((buffer[pointer])->str)[4]){\r
+      case '0':\r
+      case '1':\r
+      case '4':\r
+      case '5':\r
+      case '6':\r
+      case '7':\r
+      case '8':\r
+      case '9':\r
+      case 'a':\r
+      case 'b':\r
+       flag++;\r
+       break;\r
+      case '2':\r
+      case '3':\r
+       flag = flag + 2;\r
+       break;\r
+      }\r
+    }\r
+    else flag--;\r
+    pointer++;\r
+  }\r
+  kg_string_erase(partIDS2, partIDS2->len - 1, 1);\r
+  \r
+  //3rd scan\r
+  flag = 0;\r
+  while(flag >= 0 && pointer < counter){\r
+    kg_string_append(partIDS3, (buffer[pointer])->str);\r
+    kg_string_append(partIDS3, ".");\r
+    if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){\r
+      switch (((buffer[pointer])->str)[4]){\r
+      case '0':\r
+      case '1':\r
+      case '4':\r
+      case '5':\r
+      case '6':\r
+      case '7':\r
+      case '8':\r
+      case '9':\r
+      case 'a':\r
+      case 'b':\r
+       flag++;\r
+       break;\r
+      case '2':\r
+      case '3':\r
+       flag = flag + 2;\r
+       break;\r
+      }\r
+    }\r
+    else flag--;\r
+    pointer++;\r
+  }\r
+  kg_string_erase(partIDS3, partIDS3->len - 1, 1);\r
 }\r
 \r
-void addStrokeWithTransform(const GString *stroke, const int num, const int *tf, GString *out, int mode){\r
-       int *buf, i, size;\r
-       GString *tmp;\r
-       \r
-       tmp = g_string_new("");\r
-       buf = convertStroke(stroke->str, buf, &size);\r
-       \r
-       for(i = 0; i < size; i++){\r
-               if(buf[i * 11 + 0] != 0 && buf[i * 11 + 0] != 99){\r
-                       buf[i * 11 + 3] =\r
-                        tf[(num - 1) * 4 + 0] + buf[i * 11 + 3] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
-                       buf[i * 11 + 5] =\r
-                        tf[(num - 1) * 4 + 0] + buf[i * 11 + 5] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
-                       buf[i * 11 + 7] =\r
-                        tf[(num - 1) * 4 + 0] + buf[i * 11 + 7] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
-                       buf[i * 11 + 9] =\r
-                        tf[(num - 1) * 4 + 0] + buf[i * 11 + 9] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
-                       buf[i * 11 + 4] =\r
-                        tf[(num - 1) * 4 + 1] + buf[i * 11 + 4] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
-                       buf[i * 11 + 6] =\r
-                        tf[(num - 1) * 4 + 1] + buf[i * 11 + 6] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
-                       buf[i * 11 + 8] =\r
-                        tf[(num - 1) * 4 + 1] + buf[i * 11 + 8] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
-                       buf[i * 11 + 10] =\r
-                        tf[(num - 1) * 4 + 1] + buf[i * 11 + 10] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
-               }\r
-       }\r
-       convertArray(buf, tmp, size, mode);\r
-       if(out->len != 0) g_string_append(out, "$");\r
-       g_string_append(out, tmp->str);\r
-       \r
-       free((void *)buf);\r
+void addStrokeWithTransform(const KGString *stroke, const int num, const int *tf, KGString *out, int mode){\r
+  int *buf, i, size;\r
+  KGString *tmp;\r
+  \r
+  tmp = kg_string_new("");\r
+  buf = convertStroke(stroke->str, buf, &size);\r
+  \r
+  for(i = 0; i < size; i++){\r
+    if(buf[i * 11 + 0] != 0 && buf[i * 11 + 0] != 99){\r
+      buf[i * 11 + 3] =\r
+       tf[(num - 1) * 4 + 0] + buf[i * 11 + 3] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
+      buf[i * 11 + 5] =\r
+       tf[(num - 1) * 4 + 0] + buf[i * 11 + 5] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
+      buf[i * 11 + 7] =\r
+       tf[(num - 1) * 4 + 0] + buf[i * 11 + 7] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
+      buf[i * 11 + 9] =\r
+       tf[(num - 1) * 4 + 0] + buf[i * 11 + 9] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;\r
+      buf[i * 11 + 4] =\r
+       tf[(num - 1) * 4 + 1] + buf[i * 11 + 4] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
+      buf[i * 11 + 6] =\r
+       tf[(num - 1) * 4 + 1] + buf[i * 11 + 6] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
+      buf[i * 11 + 8] =\r
+       tf[(num - 1) * 4 + 1] + buf[i * 11 + 8] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
+      buf[i * 11 + 10] =\r
+       tf[(num - 1) * 4 + 1] + buf[i * 11 + 10] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;\r
+    }\r
+  }\r
+  convertArray(buf, tmp, size, mode);\r
+  if(out->len != 0) kg_string_append(out, "$");\r
+  kg_string_append(out, tmp->str);\r
+  \r
+  free((void *)buf);\r
 }\r
 \r
-void convertArray(int *buf, GString *out, int size, int mode){\r
-       int i;\r
-       char tmp[kMaxStrokeDataLength];\r
-       \r
-       for(i = 0; i < size; i++){\r
-               if(!(mode == 1 && (buf[i * 11 + 0] == 0 || buf[i * 11 + 0] == 99))){\r
-                       sprintf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d$",\r
-                        buf[i * 11 + 0],\r
-                        buf[i * 11 + 1],\r
-                        buf[i * 11 + 2],\r
-                        buf[i * 11 + 3],\r
-                        buf[i * 11 + 4],\r
-                        buf[i * 11 + 5],\r
-                        buf[i * 11 + 6],\r
-                        buf[i * 11 + 7],\r
-                        buf[i * 11 + 8],\r
-                        buf[i * 11 + 9],\r
-                        buf[i * 11 + 10]);\r
-                       g_string_append(out, tmp);\r
-               }\r
-       }\r
-       g_string_erase(out, (out->len - 1), 1);\r
+void convertArray(int *buf, KGString *out, int size, int mode){\r
+  int i;\r
+  char tmp[kMaxStrokeDataLength];\r
+  \r
+  for(i = 0; i < size; i++){\r
+    if(!(mode == 1 && (buf[i * 11 + 0] == 0 || buf[i * 11 + 0] == 99))){\r
+      sprintf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d$",\r
+             buf[i * 11 + 0],\r
+             buf[i * 11 + 1],\r
+             buf[i * 11 + 2],\r
+             buf[i * 11 + 3],\r
+             buf[i * 11 + 4],\r
+             buf[i * 11 + 5],\r
+             buf[i * 11 + 6],\r
+             buf[i * 11 + 7],\r
+             buf[i * 11 + 8],\r
+             buf[i * 11 + 9],\r
+             buf[i * 11 + 10]);\r
+      kg_string_append(out, tmp);\r
+    }\r
+  }\r
+  out = kg_string_erase(out, (out->len - 1), 1);\r
 }\r
 \r
 int * convertStroke(const char *in, int *a, int *size){\r
-       int i, counter, pointer;\r
-       int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;\r
-       char tmp[kMaxStrokeDataLength + 1];\r
-       \r
-       a = (int *)malloc(0);\r
-       counter = 0;\r
-       pointer = 0;\r
-       for(i = 0; i < strlen(in); i++){\r
-               if(in[i] == '$'){\r
-                       strncpy(tmp, &in[pointer], i - pointer);\r
-                       tmp[i - pointer] = '\0';\r
-                       a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));\r
-                       sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",\r
-                        &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);\r
-                       a[counter * 11 + 0] = a0;\r
-                       a[counter * 11 + 1] = a1;\r
-                       a[counter * 11 + 2] = a2;\r
-                       a[counter * 11 + 3] = a3;\r
-                       a[counter * 11 + 4] = a4;\r
-                       a[counter * 11 + 5] = a5;\r
-                       a[counter * 11 + 6] = a6;\r
-                       a[counter * 11 + 7] = a7;\r
-                       a[counter * 11 + 8] = a8;\r
-                       a[counter * 11 + 9] = a9;\r
-                       a[counter * 11 + 10] = a10;\r
-                       counter++;\r
-                       pointer = i + 1;\r
-               }\r
-       }\r
-       strncpy(tmp, &in[pointer], i - pointer);\r
-       tmp[i - pointer] = '\0';\r
-       a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));\r
-                       sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",\r
-                        &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);\r
-                       a[counter * 11 + 0] = a0;\r
-                       a[counter * 11 + 1] = a1;\r
-                       a[counter * 11 + 2] = a2;\r
-                       a[counter * 11 + 3] = a3;\r
-                       a[counter * 11 + 4] = a4;\r
-                       a[counter * 11 + 5] = a5;\r
-                       a[counter * 11 + 6] = a6;\r
-                       a[counter * 11 + 7] = a7;\r
-                       a[counter * 11 + 8] = a8;\r
-                       a[counter * 11 + 9] = a9;\r
-                       a[counter * 11 + 10] = a10;\r
-               counter++;\r
-       *(size) = counter;\r
-       return a;\r
+  int i, counter, pointer;\r
+  int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;\r
+  char tmp[kMaxStrokeDataLength + 1];\r
+  \r
+  a = (int *)malloc(0);\r
+  counter = 0;\r
+  pointer = 0;\r
+  for(i = 0; i < strlen(in); i++){\r
+    if(in[i] == '$'){\r
+      strncpy(tmp, &in[pointer], i - pointer);\r
+      tmp[i - pointer] = '\0';\r
+      a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));\r
+      sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",\r
+            &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);\r
+      a[counter * 11 + 0] = a0;\r
+      a[counter * 11 + 1] = a1;\r
+      a[counter * 11 + 2] = a2;\r
+      a[counter * 11 + 3] = a3;\r
+      a[counter * 11 + 4] = a4;\r
+      a[counter * 11 + 5] = a5;\r
+      a[counter * 11 + 6] = a6;\r
+      a[counter * 11 + 7] = a7;\r
+      a[counter * 11 + 8] = a8;\r
+      a[counter * 11 + 9] = a9;\r
+      a[counter * 11 + 10] = a10;\r
+      counter++;\r
+      pointer = i + 1;\r
+    }\r
+  }\r
+  strncpy(tmp, &in[pointer], i - pointer);\r
+  tmp[i - pointer] = '\0';\r
+  a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));\r
+  sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",\r
+        &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);\r
+  a[counter * 11 + 0] = a0;\r
+  a[counter * 11 + 1] = a1;\r
+  a[counter * 11 + 2] = a2;\r
+  a[counter * 11 + 3] = a3;\r
+  a[counter * 11 + 4] = a4;\r
+  a[counter * 11 + 5] = a5;\r
+  a[counter * 11 + 6] = a6;\r
+  a[counter * 11 + 7] = a7;\r
+  a[counter * 11 + 8] = a8;\r
+  a[counter * 11 + 9] = a9;\r
+  a[counter * 11 + 10] = a10;\r
+  counter++;\r
+  *(size) = counter;\r
+  return a;\r
 }\r
 \r
-void convert99(const GString *in, GString *out){\r
-       int i, pointer;\r
-       char tmp[kMaxStrokeDataLength + 1];\r
-       GString *buf;\r
-       \r
-       g_string_set_size(out, 0);\r
-       buf = g_string_new("");\r
-       pointer = 0;\r
-       for(i = 0; i < in->len; i++){\r
-               if((in->str)[i] == '$'){\r
-                       strncpy(tmp, in->str + pointer, i - pointer);\r
-                       tmp[i - pointer] = '\0';\r
-                       if(strncmp(tmp, "99:", 3) == 0){\r
-                               convert99calc(tmp, buf);\r
-                               if(buf->len == 0){\r
-                                       g_string_set_size(out, 0);\r
-                                       return;\r
-                               }\r
-                               g_string_append(out, buf->str);\r
-                       }\r
-                       else g_string_append(out, tmp);\r
-                       g_string_append(out, "$");\r
-                       \r
-                       pointer = i + 1;\r
-               }\r
-       }\r
-       strncpy(tmp, in->str + pointer, i - pointer);\r
-       tmp[i - pointer] = '\0';\r
-       if(strncmp(tmp, "99:", 3) == 0){\r
-               convert99calc(tmp, buf);\r
-               if(buf->len == 0){\r
-                       g_string_set_size(out, 0);\r
-                       return;\r
-               }\r
-               g_string_append(out, buf->str);\r
+void convert99(const KGString *in, KGString *out){\r
+  int i, pointer;\r
+  char tmp[kMaxStrokeDataLength + 1];\r
+  KGString *buf;\r
+  \r
+  kg_string_set_size(out, 0);\r
+  buf = kg_string_new("");\r
+  pointer = 0;\r
+  for(i = 0; i < in->len; i++){\r
+    if((in->str)[i] == '$'){\r
+      strncpy(tmp, in->str + pointer, i - pointer);\r
+      tmp[i - pointer] = '\0';\r
+      if(strncmp(tmp, "99:", 3) == 0){\r
+       convert99calc(tmp, buf);\r
+       if(buf->len == 0){\r
+         kg_string_set_size(out, 0);\r
+         return;\r
        }\r
-       else g_string_append(out, tmp);\r
+       kg_string_append(out, buf->str);\r
+      }\r
+      else kg_string_append(out, tmp);\r
+      kg_string_append(out, "$");\r
+      \r
+      pointer = i + 1;\r
+    }\r
+  }\r
+  strncpy(tmp, in->str + pointer, i - pointer);\r
+  tmp[i - pointer] = '\0';\r
+  if(strncmp(tmp, "99:", 3) == 0){\r
+    convert99calc(tmp, buf);\r
+    if(buf->len == 0){\r
+      kg_string_set_size(out, 0);\r
+      return;\r
+    }\r
+    kg_string_append(out, buf->str);\r
+  }\r
+  else kg_string_append(out, tmp);\r
 }\r
 \r
-void convert99calc(const char *in, GString *out){\r
-       GString *buf1, *buf2;\r
-       int a1,x1,y1,x2,y2,option,option2;\r
-       char pname[kMaxStrokeDataLength];\r
-       int tf[12];\r
-       char *end;\r
-       \r
-       g_string_set_size(out, 0);\r
-       buf2 = g_string_new("");\r
-       \r
-       //get parts data\r
-       sscanf(in, "%d:%d:%d:%d:%d:%d:%d:%s",\r
-               &a1,&option,&option2,&x1,&y1,&x2,&y2,pname);\r
-       //end = strchr(pname, ':');\r
-       //*end = '\0';\r
-       buf1 = g_string_new(pname);\r
-       generateGlyph(buf1, buf2);\r
-       if(buf2->len == 0) return;\r
-       \r
-       //convert\r
-       tf[0] = x1;\r
-       tf[1] = y1;\r
-       tf[2] = x2;\r
-       tf[3] = y2;\r
-       addStrokeWithTransform(buf2, 1, tf, out, 1);\r
+void convert99calc(const char *in, KGString *out){\r
+  KGString *buf1, *buf2;\r
+  int a1,x1,y1,x2,y2,option,option2;\r
+  char pname[kMaxStrokeDataLength];\r
+  int tf[12];\r
+  \r
+  kg_string_set_size(out, 0);\r
+  buf2 = kg_string_new("");\r
+  \r
+  //get parts data\r
+  sscanf(in, "%d:%d:%d:%d:%d:%d:%d:%s",\r
+        &a1,&option,&option2,&x1,&y1,&x2,&y2,pname);\r
+  //end = strchr(pname, ':');\r
+  //*end = '\0';\r
+  buf1 = kg_string_new(pname);\r
+  generateGlyph(buf1, buf2);\r
+  if(buf2->len == 0) return;\r
+  \r
+  //convert\r
+  tf[0] = x1;\r
+  tf[1] = y1;\r
+  tf[2] = x2;\r
+  tf[3] = y2;\r
+  addStrokeWithTransform(buf2, 1, tf, out, 1);\r
 }\r