Mercurial > pidgin.yaz
comparison libpurple/util.c @ 27858:a5bb767b8644
propagate from branch 'im.pidgin.pidgin' (head 420b71541a7786d593759ead8d775f487291fb97)
to branch 'im.pidgin.pidgin.yaz' (head 63207704bdd62ed93263dbb54f5ede5d640e2e5a)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Tue, 17 Jun 2008 09:06:41 +0000 |
parents | ef4dbd2bb696 0aa090fde749 |
children | 28a7992d37b2 |
comparison
equal
deleted
inserted
replaced
23376:85fc34efe733 | 27858:a5bb767b8644 |
---|---|
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 |