/****************************************************************************/
//                                                                          //
//                        +----------------------+                          //
//                        | BASE CONVERTER V 2.0 |                          //
//                        +----------------------+                          //
//                                                                          //
// Permet de convertir un nombre d'une base quelconque en un nombre de la   //
// base dsire. A t fait pour les cours de SPE Maths.                    //
//                                                                          //
//    compil avec tigcc.					            //
//    command line : tigcc -O2 chgbase.c		                    //
//                                                                          //
//  Par Stanowski Etienne alias IronMan                                     //
//  Si vous avez des commentaires : Stan.Etienne@caramail.com               //
//  Date : 18:56 20/10/2000						    //
//                                                                          //
/****************************************************************************/


* Pourquoi le mode nostub :
---------------------------

  le mode nostub est prfrable au mode Doors, tout d'abord parce que le code est beaucoup plus petit, peu tre utilis sans avoir install de kernel (comme une fonction du CAS) et enfin, les mssages d'erreur ne s'affichent pas en mode Doors. Nanmoins, vous tes autoriss  le compiler en mode Doors si vous le voulez ( vos risques et prils : il n'a pas t test!), vous devrez alors imprativemt ajouter cette ligne :
char _comment[] = "Base Converter V 1.0 par Stanowki Etienne";


* Principe d'un changement de base :
------------------------------------

  Les nombres utiliss communment en Maths sont de base 10 (une convention puisque les Maths sont totalement abstraits). Base 10 veut dire qu'un nombre peut tre form de 10 chiffres : 0,1,2,3,4,5,6,7,8 et 9. De mme en informatique, on utilise des nombres binaires (de base 2) composs de 2 chiffres 0 et 1; et hexadcimaux (de base 16) composs de 16 chiffres : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E et F. Mais il est possible de convertir des nombres de base 10 en base 2, de base 10 en base 16, de base 2 en base 16, et inversement. De mme, il existe une infinite de bases; le but de ce programme est de convertir un nombre d'une base quelconque en un nombre d'une base choisie. (l'algorithme est assez facile  comprendre mais comme c'est moi qui l'est ralis il en existe surement de plus fficaces).

  Un changement de base avec des nombres ngatifs existe uniquement en informatique. Ce mode de conversion m'est connu uniquement pour les nombres binaires et hxadcimaux, je ne sais pas s'il existe pour d'autres base. La conversion nanmoins fonctionne pour toutes les bases, le rultats est donn sur le mme principe que pour les nombres binaires et hxadcimaux.


* Utiliser le programme :
-------------------------

  Le code a t optimis pour prendre le moins de place possible sur la Ti donc le calcul ou les vrifications d'erreur pourraient tre un peu plus rapide mais de toute faon a ne se verrait pas puisque une conversion est instantanne pour n'importe quel nombre et base.
Le programme est limit a 36 bases  cause du nombre de lettres et chiffres existants : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' (inutile d'ajouter des pauvres lettres comme les lettres grecs ou autres..., nanmoins vous pouvez le faire pour votre utilisation PERSONNELLE en le recompilant avec plus de lettres).
  chgbase(A,B,"String") o A et B sont des nombres entiers naturels compris entre 2 et 36, String le nombre de base A qui doit tre converti en base B.
String doit tre entr sous forme de String (chaine de caractres).
Le rsultat est donn sous la forme d'une chaine de caractres.
  Exemples :
* pour les conversions normales :
   - chgbase(31,18,"salut") -> "DF6B34"
       'salut' est un nombre de base 31 et 'DF6B34' de base 18. Le programme transforme automatiquement les minuscules en majuscules donc les 2 sont accepts.
   - chgbase(32,10,"salut") -> "FD0685"
       'salut' est un nombre de base 32 et 'FD0685' de base 18. On obtient pas le mme rsultat que dans l'exemple prcdent parce 'salut' n'est plus de la mme base!
   - chgbase(32,10,"000salut") -> "FD0685"
       le nbr de 0 est gr, et ne crer aucuns problmes de convertions

* Pour les conversions signes :
 les conversions signes sont prises en charge du moment que '+' ou '-' apparait au dbut du string. Sinon les conversions seront normales. En base 10, le resultat sera compris entre -(2^31-1) et 2^31-1.
   - chgbase(10,2,"-45") -> "+11111111111111111111111111010011"
   - chgbase(10,2,"+45") -> "+101101"
   - chgbase(10,10,"+2147483700") -> "-2147483596". Le nombre '+2147483700' est suprieur  2^31-1, sa correspondance signe est '-2147483596'.
   - chgbase(2,10,"+11111111100001111101010101011010") -> "-7875238"


* Limitation : 
--------------

  Le nombre entr ne peut tre suprieur  2^32-1 quelle que soit sa base (ex : en base 15, on ne peut entrer un nombre suprieur  '1A20DCD80'). La limite sera repousse  2^64-1 quand les nombres long long seront grs par TiGccLib ou TiGcc. De mme la chane ne peut avoir plus de 32 caractres sans comter les 0 du dbut.


* Bugs et erreurs : 
-------------------

  Le programme dtecte automatiquement les erreurs pouvant tre commises afin d'viter que la calculette plante, c'est d'ailleur pourquoi le code fait prs de 1200 octets. Erreurs dtectes :
   - Syntaxe : le nombre d'arguments est diffrent de 3
               A n'est pas un entier relatif (positif)
               B n'est pas un entier relatif (positif)
               String n'est pas une chaine de caractres
               A n'est pas compris entre 2 et 36
               B n'est pas compris entre 2 et 36
   - Nombre ne correspond pas  la base A (ex : '101012' pour une base de 2)
   - Syntaxe du nombre incorrecte : un caractre autre qu'un chiffre ou une lettre  t entre.
   - Nombre trop grand (voir limitation)
  Aucun bug connu. Toutes les conversions essayes marchent parfaitement et ont t vrifies par le CAS de la calculatrice (pour les base 2 et 16) et par un petit programme informatique pour les autres bases : les rsultats sont donc sres!
  Si vous trouvez le moindre problme, contactez-moi : Stan.Etienne@caramail.com et donnez les circonstances qui ont fait apparaitre ce problme. Merci.
  Je ne pourrai en aucun cas tre tenu responsable des dgats causs par ce programme sur votre calculette (aucune chance que a arrive , ne vous inquitez pas!)


* Historique :
--------------

Version :

   v 2.0     20/10/2000    Correction du bug sur rom 2.05, le programme fon-  
			   ctionne  prsent sur toutes les roms 2.0x
			   Nouveau : mode sign de conversion.
			   taille : 1393

   v 1.0     02/10/2000    Premire version. L'algorithme fonctionne parfaite-
                           ment. Aucun bug connu, erreurs gres. Existe en 2
                           versions Franaise et Anglaise.
			   Compil avec TiGccLib v 2.2
                           taille : 1169


* Remerciements :
-----------------

 - merci  l'quipe de TiGcc pour leur formidable travail et explications.
 -  SigmaPhi pour l'avoir test et un certain 'AA' pour m'avoir demand d'ajouter un mode sign.
 -  moi pour l'avoir programm (hh!)
 -  vous pour l'avoir tlcharg : j'espre qu'il pourra vous aider.


* License :
-----------

  Il s'agit d'un freeware. Vous tes libre de le redistribuer  condition de joindre ce texte non modifi.


Tous vos commentaires seront les bienvenus. envoyez les  : Stan.Etienne@caramail.com.