00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <stdlib.h>
00030
00031 #include "fftypes.h"
00032 #include "ffutil.h"
00033
00034 static const char* v_low = "aeiouyåäö";
00035 static const char* v_upp = "AEIOUYÅÄÖ";
00036 static const char* c_low = "bcdfghjklmnpqrstvwxz";
00037 static const char* c_upp = "BCDFGHJKLMNPQRSTVWXZ";
00038 static const ffuint32 v_len = 9;
00039 static const ffuint32 c_len = 20;
00040
00041 ffbool ffpriv_is_vowel(const char letter) {
00042 const char* i = v_low;
00043
00044 for (;i < v_low+v_len; ++i) {
00045 if (letter == *i ) {
00046 return 1;
00047 }
00048 }
00049
00050 i = v_upp;
00051 for (;i < v_upp+v_len; ++i) {
00052 if (letter == *i ) {
00053 return 1;
00054 }
00055 }
00056
00057 return 0;
00058 }
00059
00060 ffbool ffpriv_is_consonant(const char letter) {
00061 const char* i = c_low;
00062
00063 for (;i < c_low+c_len; ++i) {
00064 if (letter == *i ) {
00065 return 1;
00066 }
00067 }
00068
00069 i = c_upp;
00070 for (;i < c_upp+c_len; ++i) {
00071 if (letter == *i ) {
00072 return 1;
00073 }
00074 }
00075
00076 return 0;
00077 }
00078
00079 ffchar* ffpriv_vowel_harmony(const ffstring* string, ffchar* back, ffchar* front) {
00080 ffint32 i = string->len -1;
00081 ffchar c;
00082 for (; i >= 0; i--) {
00083 c = string->str[i];
00084 if (c == 'a' || c == 'A' || c == 'o' || c == 'O' || c == 'u' || c == 'U' ) {
00085 return back;
00086 } else if (c == 'ä' || c == 'Ä' || c == 'ö' || c == 'Ö' || c == 'y' || c == 'Y' ) {
00087 return front;
00088 }
00089 }
00090 return front;
00091 }
00092
00093 ffuint32 ffutil_tolower(const ffstring* source, ffstring* target) {
00094 ffuint32 i = 0;
00095 ffchar c;
00096
00097 ffstring_copy(source, target);
00098
00099 for (;i < source->len; i++) {
00100 c = source->str[i];
00101
00102 if (c >= 'A' && c <= 'Z' ) {
00103 target->str[i] = c + ('a' - 'A');
00104 continue;
00105 }
00106 switch (c) {
00107 case 'Ä':
00108 target->str[i] = 'ä';
00109 break;
00110 case 'Ö':
00111 target->str[i] = 'ö';
00112 break;
00113 case 'Å':
00114 target->str[i] = 'å';
00115 break;
00116 }
00117 }
00118 return 0;
00119 }
00120
00121 ffuint32 ffutil_toupper(const ffstring* source, ffstring* target) {
00122 ffuint32 i = 0;
00123 ffchar c;
00124
00125 ffstring_copy(source, target);
00126 for (;i < source->len; i++) {
00127 c = source->str[i];
00128
00129 if (c >= 'a' && c <= 'z' ) {
00130 target->str[i] = c - ('a' - 'A');
00131 continue;
00132 }
00133 switch (c) {
00134 case 'ä':
00135 target->str[i] = 'Ä';
00136 break;
00137 case 'ö':
00138 target->str[i] = 'Ö';
00139 break;
00140 case 'å':
00141 target->str[i] = 'Å';
00142 break;
00143 }
00144 }
00145 return 0;
00146 }
00147
00148
00149 ffchar ffutil_ffchar_tolower(ffchar c) {
00150 if (c >= 'A' && c <= 'Z' ) {
00151 return c + ('a' - 'A');
00152 }
00153
00154 switch (c) {
00155 case 'Ä':
00156 return 'ä';
00157 case 'Ö':
00158 return 'ö';
00159 case 'Å':
00160 return 'å';
00161 }
00162 return c;
00163 }