comparison libpurple/util.c @ 27859:a6721f23d3d9

propagate from branch 'im.pidgin.pidgin' (head 4037e908f8c3536d50d9439ec2eec0f4d6ee3b60) to branch 'im.pidgin.pidgin.yaz' (head b7d0c4745c7208d9550e440770f20caa5aab202b)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Thu, 19 Jun 2008 11:17:48 +0000
parents a5bb767b8644
children 28a7992d37b2
comparison
equal deleted inserted replaced
23380:3f765f7e79d4 27859:a6721f23d3d9
1207 1207
1208 if (check_value != '\0' && *p == check_value) 1208 if (check_value != '\0' && *p == check_value)
1209 return FALSE; 1209 return FALSE;
1210 1210
1211 q = strstr(p, end_token); 1211 q = strstr(p, end_token);
1212 if(q == NULL) //yaz
1213 return FALSE;
1212 1214
1213 /* Trim leading blanks */ 1215 /* Trim leading blanks */
1214 while (*p != '\n' && g_ascii_isspace(*p)) { 1216 while (*p != '\n' && g_ascii_isspace(*p)) {
1215 p += 1; 1217 p += 1;
1216 } 1218 }
1219 while (q > p && g_ascii_isspace(*(q - 1))) { 1221 while (q > p && g_ascii_isspace(*(q - 1))) {
1220 q -= 1; 1222 q -= 1;
1221 } 1223 }
1222 1224
1223 /* Don't bother with null strings */ 1225 /* Don't bother with null strings */
1224 if (p == q) 1226 if (p >= q)
1225 return FALSE; 1227 return FALSE;
1226 1228
1227 if (q != NULL && (!no_value_token || 1229 if (q != NULL && (!no_value_token ||
1228 (no_value_token && strncmp(p, no_value_token, 1230 (no_value_token && strncmp(p, no_value_token,
1229 strlen(no_value_token))))) 1231 strlen(no_value_token)))))
4721 } 4723 }
4722 4724
4723 return g_string_free(string, FALSE); 4725 return g_string_free(string, FALSE);
4724 } 4726 }
4725 4727
4728
4729 #ifdef _WIN32
4730 void botch_ucs(gchar *ucs_src, gsize len)
4731 {
4732 /* no operation */
4733 }
4734 #else
4735 void botch_ucs(gchar *ucs_src, gsize len)
4736 {
4737 gint i;
4738 guchar *ucs = (guchar *)ucs_src;
4739
4740 g_return_if_fail(ucs_src != NULL);
4741 g_return_if_fail(len > 0);
4742
4743 for(i=0;i<len;i+=2){
4744 switch(*(ucs+i)){
4745 case 0x00:
4746 switch(*(ucs+i+1)){
4747 case 0xa2: // ¢
4748 *(ucs+i) = 0xff;
4749 *(ucs+i+1) = 0xe0;
4750 break;
4751 case 0xa3: // £
4752 *(ucs+i) = 0xff;
4753 *(ucs+i+1) = 0xe1;
4754 break;
4755 case 0xac: // ¬
4756 *(ucs+i) = 0xff;
4757 *(ucs+i+1) = 0xe2;
4758 break;
4759 }
4760 break;
4761 case 0x20: // ‖
4762 if(*(ucs+i+1) == 0x16){
4763 *(ucs+i) = 0x22;
4764 *(ucs+i+1) = 0x25;
4765 }
4766 break;
4767 case 0x22: // −
4768 if(*(ucs+i+1) == 0x12){
4769 *(ucs+i) = 0xff;
4770 *(ucs+i+1) = 0x0d;
4771 }
4772 break;
4773 case 0x30: // 〜
4774 if(*(ucs+i+1) == 0x1c){
4775 *(ucs+i) = 0xff;
4776 *(ucs+i+1) = 0x5e;
4777 }
4778 break;
4779 }
4780 }
4781
4782 }
4783 #endif
4784
4785 #ifdef _WIN32
4786 void sanitize_ucs(gchar *ucs, gsize len)
4787 {
4788 /* no operation */
4789 }
4790 #else
4791 void sanitize_ucs(gchar *ucs_src, gsize len)
4792 {
4793 gint i;
4794 guchar *ucs = (guchar *)ucs_src;
4795
4796 g_return_if_fail(ucs_src != NULL);
4797 g_return_if_fail(len > 0);
4798
4799 for(i=0;i<len;i+=2){
4800 switch(*(ucs+i)){
4801 case 0x22:
4802 switch(*(ucs+i+1)){
4803 case 0x25: // ‖
4804 *(ucs+i) = 0x20;
4805 *(ucs+i+1) = 0x16;
4806 break;
4807 }
4808 break;
4809 case 0xff:
4810 switch(*(ucs+i+1)){
4811 case 0x0d: // −
4812 *(ucs+i) = 0x22;
4813 *(ucs+i+1) = 0x12;
4814 break;
4815 case 0x5e: // 〜
4816 *(ucs+i) = 0x30;
4817 *(ucs+i+1) = 0x1c;
4818 break;
4819 case 0xe0: // ¢
4820 *(ucs+i) = 0x00;
4821 *(ucs+i+1) = 0xa2;
4822 break;
4823 case 0xe1: // £
4824 *(ucs+i) = 0x00;
4825 *(ucs+i+1) = 0xa3;
4826 break;
4827 case 0xe2: // ¬
4828 *(ucs+i) = 0x00;
4829 *(ucs+i+1) = 0xac;
4830 break;
4831 }
4832 break;
4833 }
4834 }
4835 }
4836 #endif
4837
4838 #ifdef _WIN32
4839 gchar *sanitize_utf(const gchar *msg, gsize len, gsize *newlen)
4840 {
4841 g_return_val_if_fail(msg != NULL, NULL);
4842 if(len == -1)
4843 len = strlen(msg);
4844 g_return_val_if_fail(len > 0, NULL);
4845
4846 if(newlen)
4847 *newlen = len;
4848
4849 return g_strndup(msg, len);
4850 }
4851 #else
4852 gchar *sanitize_utf(const gchar *msg, gsize len, gsize *newlen)
4853 {
4854 gint i;
4855 size_t bytes;
4856 guchar *utf;
4857
4858 g_return_val_if_fail(msg != NULL, NULL);
4859 if(len == -1)
4860 len = strlen(msg);
4861 g_return_val_if_fail(len > 0, NULL);
4862
4863 utf = (guchar *)g_strndup(msg, len);
4864
4865 bytes = len;
4866
4867 for(i=0;i<len;i++){
4868 switch(*(utf+i)){
4869 case 0xe2:
4870 if(*(utf+i+1) == 0x88) {
4871 if(*(utf+i+2) == 0xa5) { // ‖
4872 *(utf+i) = 0xe2;
4873 *(utf+i+1) = 0x80;
4874 *(utf+i+2) = 0x96;
4875 }
4876 }
4877 break;
4878 case 0xef:
4879 switch(*(utf+i+1)){
4880 case 0xbc:
4881 if(*(utf+i+2) == 0x8d) { // −
4882 *(utf+i) = 0xe2;
4883 *(utf+i+1) = 0x88;
4884 *(utf+i+2) = 0x92;
4885 }
4886 break;
4887 case 0xbd:
4888 if(*(utf+i+2) == 0x9e) { // 〜
4889 *(utf+i) = 0xe3;
4890 *(utf+i+1) = 0x80;
4891 *(utf+i+2) = 0x9c;
4892 }
4893 break;
4894 case 0xbf:
4895 switch(*(utf+i+2)){
4896 case 0xa0: // ¢
4897 *(utf+i) = 0xc2;
4898 *(utf+i+1) = 0xa2;
4899 memmove(utf+i+2, utf+i+3,
4900 len-i-3); //shorten by 1byte
4901 bytes--;
4902 break;
4903 case 0xa1: // £
4904 *(utf+i) = 0xc2;
4905 *(utf+i+1) = 0xa3;
4906 memmove(utf+i+2, utf+i+3,
4907 len-i-3); //shorten by 1byte
4908 bytes--;
4909 break;
4910 case 0xa2: // ¬
4911 *(utf+i) = 0xc2;
4912 *(utf+i+1) = 0xac;
4913 memmove(utf+i+2, utf+i+3,
4914 len-i-3); //shorten by 1byte
4915 bytes--;
4916 break;
4917 }
4918 break;
4919 }
4920 break;
4921 }
4922 }
4923 *(utf+bytes)= 0x00; //terminate
4924 if(newlen)
4925 *newlen = bytes;
4926 return (gchar *)utf;
4927 }
4928 #endif
4929
4930 #ifdef _WIN32
4931 gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen)
4932 {
4933 g_return_val_if_fail(msg != NULL, NULL);
4934 if(len == -1)
4935 len = strlen(msg);
4936 g_return_val_if_fail(len > 0, NULL);
4937
4938 if(newlen)
4939 *newlen = len;
4940
4941 return g_strndup(msg, len);
4942 }
4943 #else
4944 gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen)
4945 {
4946 int i,bytes;
4947 unsigned char *utf;
4948
4949 g_return_val_if_fail(msg != NULL, NULL);
4950 if(len == -1)
4951 len = strlen(msg);
4952 g_return_val_if_fail(len > 0, NULL);
4953
4954 bytes = len;
4955
4956 utf = g_malloc0(bytes*3/2+1); /* new length might be 3/2 in the worst case */
4957 memcpy(utf, msg, bytes);
4958
4959 for(i=0;i<bytes;i++){
4960 switch(*(utf+i)){
4961 case 0xc2:
4962 switch(*(utf+i+1)){
4963 case 0xa2: // ¢
4964 *(utf+i) = 0xef;
4965 *(utf+i+1) = 0xbf;
4966 memmove(utf+i+3, utf+i+2, bytes-i-2);
4967 *(utf+i+2) = 0xa0;
4968 bytes++;
4969 break;
4970 case 0xa3: // £
4971 *(utf+i) = 0xef;
4972 *(utf+i+1) = 0xbf;
4973 memmove(utf+i+3, utf+i+2, bytes-i-2);
4974 *(utf+i+2) = 0xa1;
4975 bytes++;
4976 break;
4977 case 0xac: // ¬
4978 *(utf+i) = 0xef;
4979 *(utf+i+1) = 0xbf;
4980 memmove(utf+i+3, utf+i+2, bytes-i-2);
4981 *(utf+i+2) = 0xa2;
4982 bytes++;
4983 break;
4984 }
4985 break;
4986 case 0xe2:
4987 switch(*(utf+i+1)){
4988 case 0x80: // ‖
4989 if(*(utf+i+2) == 0x96){
4990 *(utf+i) = 0xe2;
4991 *(utf+i+1) = 0x88;
4992 *(utf+i+2) = 0xa5;
4993 }
4994 break;
4995 case 0x88: // −
4996 if(*(utf+i+1) == 0x92){
4997 *(utf+i) = 0xef;
4998 *(utf+i+1) = 0xbc;
4999 *(utf+i+2) = 0x8d;
5000 }
5001 break;
5002 }
5003 break;
5004 case 0xe3: // 〜
5005 if(*(utf+i+1) == 0x80){
5006 if(*(utf+i+2) == 0x9c){
5007 *(utf+i) = 0xef;
5008 *(utf+i+1) = 0xbd;
5009 *(utf+i+2) = 0x9e;
5010 }
5011 }
5012 break;
5013 } //switch
5014 }
5015 *(utf+bytes) = 0x00; //terminate
5016 if(newlen)
5017 *newlen = bytes;
5018 return (gchar *)utf;
5019 }
5020 #endif