/***************************************************************************
* *
* Copyright (C) 2005 Piotr Wawrzyniak (
[email protected] *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
//The class and functions responsible for conversions to various numbering styles
#include"system_zapisu.h"
#include <iostream>
using namespace std;
extern int ignore_formating;
extern int language;
//constructor
r_numerow::r_numerow(int a, int b, int c, int d, int e)
{
zwroc_num_etykiet[0]=a;
zwroc_num_etykiet[1]=b;
zwroc_num_etykiet[2]=c;
zwroc_num_etykiet[3]=d;
zwroc_num_etykiet[4]=e;
domyslny_styl_numeracji=2;
}
int r_numerow::ustaw_zmienna_numer_etykietki(char *etykieta)
{
if(etykieta[0]==':'&&strlen(etykieta)>=3&&!ignore_formating)
{
switch (etykieta[1])
{
case 'r':
zwroc_numer_etykiety(0);
break;
case 'R':
zwroc_numer_etykiety(1);
break;
case 'a':
zwroc_numer_etykiety(2);
break;
case 'l':
zwroc_numer_etykiety(3);
break;
case 'L':
zwroc_numer_etykiety(4);
break;
default:
zwroc_numer_etykiety(domyslny_styl_numeracji);
}
}
else
zwroc_numer_etykiety(domyslny_styl_numeracji);
return 0;
}
int r_numerow::set_up_all(int roman,int Roman,int arabic,int letters,int Letters,int def)
{
zwroc_num_etykiet[0]=roman;
zwroc_num_etykiet[1]=Roman;
zwroc_num_etykiet[2]=arabic;
zwroc_num_etykiet[3]=letters;
zwroc_num_etykiet[4]=Letters;
domyslny_styl_numeracji=def;
return 0;
}
int r_numerow::set_up_all(int what, int what_number)
{
if(what==5)
{
domyslny_styl_numeracji=what_number;
return 0;
}
else
{
zwroc_num_etykiet[what]=what_number;
return 0;
}
}
int r_numerow::zwroc_numer_etykiety(int numer)
{
zeruj_numer_etykietki();
//wartosci_num_etykiet[numer]++;
// zwroc_num_etykiet[numer]++;
switch(numer)
{
case 0:
if(int_na_rom_char(zwroc_num_etykiet[0],0))
return 2;;//By� problem z zalokowaniem pami�ci
break;
case 1:
if(int_na_rom_char(zwroc_num_etykiet[1],1))
return 2;;//By� problem z zalokowaniem pami�ci
break;
case 2:
if(int_na_char(zwroc_num_etykiet[2]))
return 2;//By� problem z zaalokowaniem pami�ci
break;
case 3:
if(int_na_lit_char(zwroc_num_etykiet[3],0))
return 2;//By� problem z zaalokowaniem pami�ci
break;
case 4:
if(int_na_lit_char(zwroc_num_etykiet[4],1))
return 2;//By� problem z zaalokowaniem pami�ci
break;
};
zwroc_num_etykiet[numer]++;
return 0;
}
int r_numerow::int_na_char(int a)
{
kol_liczb *pierwszy=NULL;
kol_liczb *ostatni=NULL;
kol_liczb *pomocnicza=NULL;
// kol_liczb *poprzedni=NULL;
int b=a;
int d;
float c;
while(b>0.1)
{
c=b/10;
pomocnicza=new kol_liczb;
if (!pomocnicza)
{
if(language==0)
{
cout<<"Problem z zaalokowaniem wolnej pami�ci"<<endl;
}
else
{
cout<<"Error! Couldn't allocate free memory."<<endl;
}
return 1;//B��d alokacji pami�ci
}
if(!pierwszy)
{
pierwszy=ostatni=pomocnicza;
pierwszy->next=pierwszy->prev=NULL;
}
else
{
ostatni->next=pomocnicza;
pomocnicza->prev=ostatni;
pomocnicza->next=NULL;
ostatni=pomocnicza;
}
d=(int)c;
pomocnicza->liczba=b-d*10;
//cout<<pomocnicza->liczba<<endl;
b=d;
}
pomocnicza=ostatni;
b=0;
while(pomocnicza)
{
// cout<<pomocnicza->liczba<<endl;
switch (pomocnicza->liczba)
{
case 0:
numer_etykietki[b]='0';
numer_etykietki[b+1]='\0';
break;
case 1:
numer_etykietki[b]='1';
numer_etykietki[b+1]='\0';
break;
case 2:
numer_etykietki[b]='2';
numer_etykietki[b+1]='\0';
break;
case 3:
numer_etykietki[b]='3';
numer_etykietki[b+1]='\0';
break;
case 4:
numer_etykietki[b]='4';
numer_etykietki[b+1]='\0';
break;
case 5:
numer_etykietki[b]='5';
numer_etykietki[b+1]='\0';
break;
case 6:
numer_etykietki[b]='6';
numer_etykietki[b+1]='\0';
break;
case 7:
numer_etykietki[b]='7';
numer_etykietki[b+1]='\0';
break;
case 8:
numer_etykietki[b]='8';
numer_etykietki[b+1]='\0';
break;
case 9:
numer_etykietki[b]='9';
numer_etykietki[b+1]='\0';
break;
};
pierwszy=pomocnicza;
pomocnicza=pomocnicza->prev;
delete pierwszy;
b++;
}
return 0;
}
int r_numerow::int_na_rom_char(int liczba,int mal_duz)
{
char tablica_liczb_rzymskich[33][5]={"i","ii","iii","iv","v","vi","vii","viii","ix","x","x","xx","xxx","xl","l","lx","lxx","lxxx","xc","c","c","cc","ccc","cd","d","dc","dcc","dccc","cm","m","m","mm","mmm"};
int ile_cyfr=0;
kol_liczb *pierwszy=NULL;
kol_liczb *ostatni=NULL;
kol_liczb *pomocnicza=NULL;
// kol_liczb *poprzedni=NULL;
int b=liczba;
int d;
float c;
if(liczba>3899)
{
if(language==0)
{
cout<<"Przekroczony maksymalny zakres dla liczb rzymskich. Maksymalnie mo�na przypisa� 3899"<<endl;
}
else
{
cout<<"Maximal range for Roman numbers is 3899. Yours numbers are to high. Sorry dude.";
}
return 1;
}
while(b>0.1)
{
c=b/10;
pomocnicza=new kol_liczb;
if (!pomocnicza)
{
if(language==0)
{
cout<<"B�ad!. Problemy z zaalokowaniem pami�ci!"<<endl;
}
else
{
cout<<"Error!. Memory allocation problem.!"<<endl;
}
return 1;
}
if(!pierwszy)
{
pierwszy=ostatni=pomocnicza;
pierwszy->next=pierwszy->prev=NULL;
}
else
{
ostatni->next=pomocnicza;
pomocnicza->prev=ostatni;
pomocnicza->next=NULL;
ostatni=pomocnicza;
}
ile_cyfr++;
d=(int)c;
pomocnicza->liczba=b-d*10;
//cout<<pomocnicza->liczba<<endl;
b=d;
}
pomocnicza=ostatni;
while(pomocnicza)
{
//cout<<pomocnicza->liczba;
// cout<<(ile_cyfr-1)*10+pomocnicza->liczba;
if(pomocnicza->liczba)//Tutaj tak musi by� bo je�li liczba wychodzi�a 0 to by�y szopki
//cout<<tablica_liczb_rzymskich[(ile_cyfr-1)*10+pomocnicza->liczba-1];
strcat(numer_etykietki,tablica_liczb_rzymskich[(ile_cyfr-1)*10+pomocnicza->liczba-1]);
// cout<<pomocnicza->liczba;
pierwszy=pomocnicza;
pomocnicza=pomocnicza->prev;
delete pierwszy;
ile_cyfr--;
}
//If mal_duz=1 then change small roman number to capital ones
if (mal_duz==1)
{
int unsigned dupa=0;
while(dupa<strlen(numer_etykietki))
{
numer_etykietki[dupa]-=('a'-'A');
dupa++;
}
}
return 0;
}
int r_numerow::int_na_lit_char(int liczba,int mal_duz)
{
char tablica_liter[26][2]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
//char liczba_rzymska[256];
//int ile_cyfr=0;
//for(int aaa=0;aaa<10;aaa++)
// { cout<<tablica_liter[aaa]<<endl;}
kol_liczb *pierwszy=NULL;
kol_liczb *ostatni=NULL;
kol_liczb *pomocnicza=NULL;
// kol_liczb *poprzedni=NULL;
int b=liczba;
b--;//trzeba znmiejszy� o 1 bo wychodz� bzdury. Problem z konwersj� system dziesi�tny - dw�dziestosz�stkowy
int d;
float c;
do
{
c=b/26;
pomocnicza=new kol_liczb;
if (!pomocnicza)
{
if(language==0)
{
cout<<"B�ad!. Problemy z zaalokowaniem pami�ci!"<<endl;
}
else
{
cout<<"Error!. Memory allocation problem.!"<<endl;
}
return 1;
}
if(!pierwszy)
{
pierwszy=ostatni=pomocnicza;
pierwszy->next=pierwszy->prev=NULL;
}
else
{
ostatni->next=pomocnicza;
pomocnicza->prev=ostatni;
pomocnicza->next=NULL;
ostatni=pomocnicza;
}
d=(int)c;
pomocnicza->liczba=b-d*26;
b=d;
}
while(b>1/26);
pomocnicza=ostatni;
while(pomocnicza)
{
strcat(numer_etykietki,tablica_liter[pomocnicza->liczba]);
pierwszy=pomocnicza;
pomocnicza=pomocnicza->prev;
delete pierwszy;
}
//If mal_duz=1 then change small letter r to capital ones
if(mal_duz==1)
{
int unsigned dupa=0;
while(dupa<strlen(numer_etykietki))
{
numer_etykietki[dupa]-=('a'-'A');
dupa++;
}
}
return 0;
}