mercoledì 12 gennaio 2011

Conversione numerica da/a qualsiasi base

Riporto il codice autocostruito per NSIS al fine di eseguire delle conversioni numeriche da base decimale a qualsiasi altra base compresa tra 2 e 36.


Function DecToBX
Exch $R2 ; base
Exch
Exch $R1 ; number
Push $R0
Exch 2
Push $R3
StrCpy $R0 "" ; result

Loop:
System::Int64Op $R1 % $R2
Pop $R3

StrCpy $R3 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 1 $R3
StrCpy $R0 "$R3$R0"

System::Int64Op $R1 / $R2
Pop $R1

StrCmp $R1 0 0 Loop

Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd

!macro DecToBX Res Num Base
Push "${Num}"
Push "${Base}"
Call DecToBX
Pop "${Res}"
!macroend

!define DecToBX "!insertmacro DecToBX"


Di seguito il codice per fare l'operazione inversa, ovvero convertire un numero da qualsiasi base numerica in decimale:


Function BXToDec
Exch $R2 ; base
Exch
Exch $R1 ; number
Push $R0 ; result
Exch 2
Push $R3
StrCpy $R0 0

Loop:
StrCpy $R3 $R1 1 0
${IndexOf} $R3 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" $R3
System::Int64Op $R0 * $R2
Pop $R0 ; vale -1 in caso di errore
System::Int64Op $R0 + $R3
Pop $R0
StrCpy $R1 $R1 "" 1
StrCmp $R1 "" 0 Loop

Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd

!macro BXToDec Res Num Base
Push "${Num}"
Push "${Base}"
Call BXToDec
Pop "${Res}"
!macroend

!define BXToDec "!insertmacro BXToDec"


La funzione BXToDec fa uso della macro IndexOf il cui codice si puo' recuperare dal seguente link: IndexOf source code

Esempio di utilizzo:

${DecToBX} $R0 0xF58DE 36 ; return LK2M
DetailPrint "result: $R0"

${BXToDec} $R0 "LK2M" 36 ; return 1005790 (0xF58DE)
DetailPrint "result: $R0"


Incrociano le due funzioni e' possibile fare una conversione da qualsiasi base numerica, ad esempio da base 16 a base 36:

${BXToDec} $R0 "F58DE" 16 ; return 1005790
${DecToBX} $R0 $R0 36 ; return LK2M
DetailPrint "result: $R0"


Entrambe le funzione non fanno alcun controllo sui parametri, ad esempio che la base sia nel range compreso tra 2 e 36.

Per verificare il risultato potete usare questo link: http://www.translatorscafe.com/cafe/units-converter/numbers/calculator/decimal-to-base-36

martedì 11 gennaio 2011

Aggiungere il supporto SourceSafe a PhpED

Deciso! Metto tutto su SourceSafe cosi' non mi rompo piu' le scatole a sincronizzare le modifiche dei sorgenti php. Il problema e' riuscire ad integrare SS con PhpED, l'ide che al momento e' in cima ai miei preferiti, anche se c'e' stato qualche vano tentativo di passare ad Eclipse.

Accedere alle variabili di ambiente di Windows e aggiungere alla PATH delle "Enviroment Variables -> System Variable" il percorso di installazione di SourceSafe, dove all'interno del folder dovra' essere presente il comando ss.exe:
C:\Program Files (x86)\Microsoft Visual SourceSafe;

Sempre nelle "Enviroment Variables -> System Variable" di Windows creare la voce SSDIR ed assegnarvi il percorso del file "srcsafe.ini", nel mio caso si trovava su un server in rete, quindi nel mio caso ho fovuto assegnarvi un indirizzo di questo tipo:
\\server_sourcesafe\Progetti\VSS

NB: e' possibile che prima di utilizzare PhpED per fare il CheckOut/CheckIn dei file di progetto si debba accedere alla cartella (SSDIR) via file system inserendo le credenziali se richieste.

Una volta preparate le due variabili di ambiente non ci rimane che aggiungere le voci di menu all'interno di PhpED:
- Selezionare Tools -> Settings -> Integration
- Premere il pulsante Add Menu, quindi editare il nome che si vuole dare alla nuova voce di menu contestuale. Per il checkout ho utilizzato "Check Out".
- Selezionare la voce di menu "Check Out" e premere Edit, quindi selezionare la voce Shell nella 'Execute with' e inserire come command line:
ss Checkout "$/SourceSafeProjectPath@RelFName@" -GL@Path@, dove '$/SourceSafeProjectPath' si riferisce al path del progetto in SS (valore adiacente alla label 'name' nelle proprieta' del progetto SS)
- Infine nelle opzioni selezionare 'Show this command in Workplace popup' e 'for files'

Proseguire aggiungendo le altre voci di menu "Check In" e "Undo Check Out" ripetendo i passi precedenti e evendo cura di modificare il comando di shell a seconda dei casi.
Qui sotto sono brevemente elencati i comandi SourceSafe in base alle funzionalita':

Check Out
ss Checkout "$/SourceSafeProjectPath@RelFName@" -GL@Path@

Check In
ss Checkin "$/SourceSafeProjectPath@RelFName@" -GL@Path@ -C

Undo Check Out
ss Undocheckout "$/SourceSafeProjectPath@RelFName@" -GL@Path@


Per conoscere i comandi riconosciuti da ss.exe fare riferimento al seguente link:
http://msdn.microsoft.com/en-us/library/003ssz4z%28v=vs.80%29.aspx

Mentre per le variabili contestuali utilizzabili nelle macro di PhpED, aprire l'help e andare alla seguente pagina:
Contents -> Customized PhpED -> Type of handlers and macros