#include <string.h>
#include "macro.h"
extern int left;
extern int right;
extern int prev;
extern int is_red;
extern int last;
extern int word_cnt;
extern int len;
extern int found;
char ANSI_to_ASCII(char sym)
{
if((sym >= 'А') && (sym <= 'п'))
sym -= 64;
else if((sym >= 'р') && (sym <= 'я'))
sym -= 16;
return sym;
}
char ASCII_to_ANSI(unsigned char sym)
{
if((sym >= 128) && (sym <= 175))
sym += 64;
else if((sym >= 224) && (sym <= 239))
sym += 16;
return sym;
}
void get_ASCII_line(char* str)
{
while(*str)
{
*str = ANSI_to_ASCII(*str);
str++;
}
return;
}
int glasn(int sym)
{
if((sym == 'а') ||(sym == 'А') ||(sym == 'Е') ||(sym == 'е') ||(sym == 'Ё') ||
(sym == 'ё') ||(sym == 'И') ||(sym == 'и') ||(sym == 'О') ||(sym == 'о') ||
(sym == 'У') ||(sym == 'у') ||(sym == 'ы') ||(sym == 'Э') ||(sym == 'э') ||
(sym == 'Ю') ||(sym == 'ю') ||(sym == 'Я') ||(sym == 'я'))
return 1;
else
return 0;
}
int is_rus_letter(int sym)
{
if((sym >= 'А') && (sym <= 'я'))
return 1;
else
return 0;
}
int soglasn(int sym)
{
if(is_rus_letter(sym) && (!glasn(sym)))
return 1;
else
return 0;
}
int rus_graph(int sym)
{
if(is_rus_letter(sym) || (sym >= 0x21 && sym <= 0x7E))
return 1;
else
return 0;
}
int find_glasn(char* str)
{
while(*str)
{
if(glasn(*str))
return 1;
else if(!is_rus_letter(*str))
return 0;
str++;
}
return 0;
}
void get_lower(char* str)
{
while(*str)
{
if((*str >= 'А') && (*str <= 'Я'))
*str += 32;
str++;
}
return;
}
int bs(char sym, char** mas, int kol)
{
int x, l, r;
r = kol - 1;
l = 0;
while(l < r)
{
x = (r + l) / 2;
if(mas[x][0] >= sym)
r = x;
else
l = x + 1;
}
if(mas[l][0] == sym)
return l;
else
return -1;
}
int get_pref(char* str)
{
int i = 0;
int len = 0;
int n;
char* pref_list[] = {"без", "беc", "воз", "вос", "дез", "за", "из", "ис", "контр",
"меж", "на", "не", "низ", "нис", "обо", "об", "пан", "пол",
"пост", "под", "по", "пред", "пре", "при", "раз", "рас",
"рос", "сверх", "со", "суб", "транс", "чрез", "чрес" };
char* curr_pref;
char temp_str[MAXSTR];
int found = FALSE;
int pref_count = sizeof(pref_list) / sizeof(char*);
n = strlen(str);
strcpy(temp_str, str);
i = bs(str[0], pref_list, pref_count);
if(i == -1)
{
strcpy(str, temp_str);
return 0;
}
do
{
curr_pref = pref_list[i];
if(!(strncmp(curr_pref, str, strlen(curr_pref))))
{
found = TRUE;
break;
}
i++;
}
while((i < pref_count) && (pref_list[i][0] == str[0]));
if(found == FALSE)
{
strncpy(str, temp_str, n);
return 0;
}
len = strlen(curr_pref);
if((str[len] == 'ъ') || ((str[len] == 'й') && glasn(str[len - 1])))
len++;
else
{
if((str[len] == 'ы') && soglasn(str[len - 1]) && len > 2)
len--;
else if((str[len] == 'ы') && soglasn(str[len - 1]) && len <= 2)
len = 0;
}
strcpy(str, temp_str);
return len;
}
int rule_gl(char* str, int i, int rpos)
{
int k, j;
int pos;
pos = k = j = 0;
if(str[i + 1] == 'й')
j = 1;
if((str[i - 1] == 'ъ') ||(str[i - 1] == 'ь'))
k = 1;
if(glasn(str[i + j + 1]) && soglasn(str[i - k - 1]) &&
is_rus_letter(str[i + j + 2]))
{
pos = (pos > rpos) ? 0 : (i + j);
}
else if(soglasn(str[i + j + 1]) && soglasn(str[i - k - 1]) && find_glasn(str + i + j + 2))
{
pos = (pos > rpos) ? 0 : (i + j);
}
return pos;
}
int rule_sogl(char* str, int i, int rpos)
{
int j;
int pos = 0;
pos = j = 0;
if((str[i + 1] == 'ъ') ||(str[i + 1] == 'ь'))
j = 1;
if(soglasn(str[i + j + 1]) && glasn(str[i - 1]) &&
find_glasn(str + i + j + 2))
{
pos = (pos > rpos) ? 0 : (i + j);
}
return pos;
}
void get_perenos(char* str, int rpos, char* lpart, char* rpart)
{
int len;
int t = 0;
int st = 0;
int i;
int pos = 0;
int max = FALSE;
char temp[MAXSTR];
if(rpos <= 1)
{
*lpart = '\0';
strcpy(rpart, str);
return;
}
strcpy(temp, str);
get_lower(str);
while(str[t] && !is_rus_letter(str[t]))
{
t++;
str++;
}
if((*str == '\0') || (t >= rpos))
{
*lpart = '\0';
strcpy(rpart, temp);
return;
}
rpos -= t;
len = strlen(str);
st = get_pref(str);
if(st > rpos)
{
*lpart = '\0';
strcpy(rpart, temp);
return;
}
i = (rpos > (len - 3)) ? (len - 3) : rpos;
while(i > st)
{
if(glasn(str[i]))
{
if(pos = rule_gl(str, i, rpos))
break;
}
else if(soglasn(str[i]))
{
if(pos = rule_sogl(str, i, rpos))
break;
}
i--;
}
if(!pos && st && (((len - st) == 1) || !(find_glasn(str + st))))
{
*lpart = '\0';
strcpy(rpart, temp);
return;
}
if(!pos && !st)
{
if((len < (right - left + 1 - is_red - t)))
{
*lpart = '\0';
strcpy(rpart, temp);
return;
}
else
{
pos = len - 2;
max = TRUE;
}
}
if(!pos && st && ((len - st) > 1))
if(str[st] == 'ы')
pos = st - 2;
else
pos = st - 1;
pos += t;
strncpy(lpart, temp, pos + 1);
if(!max)
{
lpart[pos + 1] = '-';
lpart[pos + 2] = '\0';
}
else
lpart[pos + 1] = '\0';
strcpy(rpart, temp + pos + 1);
return;
}