BohShell versione prealpha

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

Ciao!

compilando con lo standard C89 se non sbaglio non rispettando gli struct ******* il compilatore da errore (è una cosa che arriva dall'ANSI C se non sbaglio e termina con il C99).
L'ho anche provato proprio adesso ed infatti mi urla contro.

Codice: Seleziona tutto

detto ciò un consiglio generale: quando definisci un puntatore fallo così:
pointerToData *ptr 
Giusto hai ragione! Stile corretto!
2- un puntatore ad intero e due interi
Se dichiaravi un panettone lo avrei fatto tante di quelle volte :D

Bye
Gio

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Messaggio da absinthe »

Blizzard ha scritto: compilando con lo standard C89 se non sbaglio non rispettando gli struct ******* il compilatore da errore (è una cosa che arriva dall'ANSI C se non sbaglio e termina con il C99).
L'ho anche provato proprio adesso ed infatti mi urla contro.
perchè compili con quello statndard?! è richiesto da posix?!
con il seguente codice:

Codice: Seleziona tutto

#include "stdio.h"

typedef struct _pippo {
int pluto;
int topolino;
} pippo;

void initPippo(struct pippo *aStruct){
aStruct->pluto=0;
aStruct->topolino=0;
}

int main (){

pippo myPippo;
initPippo(&myPippo);

fprinft(stdout,"tu c'ha le pupp'a pera!\n");

return 0;
}
il gcc della slack di incacchia parecchio e restituisce:
bash-3.1$ gcc -c eliminami.c -o fernando
eliminami.c:8: warning: 'struct pippo' declared inside parameter list
eliminami.c:8: warning: its scope is only this definition or declaration, which is probably not what you want
eliminami.c: In function 'initPippo':
eliminami.c:9: error: dereferencing pointer to incomplete type
eliminami.c:10: error: dereferencing pointer to incomplete type
eliminami.c: In function 'main':
eliminami.c:16: warning: passing argument 1 of 'initPippo' from incompatible pointer type
mentre se rimuovo lo struct, correggento la funzione con:

Codice: Seleziona tutto

void initPippo(pippo *aStruct){
aStruct->pluto=0;
aStruct->topolino=0;
}
il gcc va liscio...

se non è per motivi di standard posix, allora sto andando off-topic (non c'entra più con l'implementazione di una shell posix) quindi rispondi pure in PM.

M

Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Messaggio da gioco »

absinthe ha scritto:con il seguente codice:

Codice: Seleziona tutto

#include "stdio.h"

typedef struct _pippo {
int pluto;
int topolino;
} pippo;

void initPippo(struct pippo *aStruct){
aStruct->pluto=0;
aStruct->topolino=0;
}

int main (){

pippo myPippo;
initPippo(&myPippo);

fprinft(stdout,"tu c'ha le pupp'a pera!\n");

return 0;
}
il gcc della slack di incacchia parecchio e restituisce:
E' normale che si incacchia.
Con

Codice: Seleziona tutto

struct _pippo {
int pluto;
int topolino;
}
tu dichiari la struttura struct _pippo. Il tipo è *struct _pippo*.
Poi con la typedef crei il tipo *pippo* che altro non è che un alias del tipo *struct _pippo*.
E' normale che ti dia errore perchè il tipo *struct pippo* non è mai stato definito e ti da quell'errore perchè il parser si incasina.
Conviene usare sempre la stessa convenzione: o si usa la struct (ripetendo ogni volta struct _pippo) oppure si usano delle typedef e ci si riferisce sempre a quelle (pippo). Usare la typedef insieme alla dichiarazione della struct fa figo, ma può essere causa di confusione ;)

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

ciao,

di solito utilizzo praticamente sempre

typedef struct
{
....
}pippo;

Così dichiaro una struttura utilizzabile direttamente con pippo.

Tuttavia questa volta per scelta ho deciso di utilizzare il costrutto ANSI.
Voglio che sia compilabile anche su macchine non recentissime.... avevo quasi deciso di sviluppare sotto ANSI ma è esagerato a volte :P ( ad esempio non puoi utilizzare i // ma solo i /**/ )

E' solo una questione di scelte ( o shellte :D )

ciao
Gio

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Messaggio da absinthe »

gioco ha scritto: tu dichiari la struttura struct _pippo. Il tipo è *struct _pippo*.
Poi con la typedef crei il tipo *pippo* che altro non è che un alias del tipo *struct _pippo*.
E' normale che ti dia errore perchè il tipo *struct pippo* non è mai stato definito e ti da quell'errore perchè il parser si incasina.
Conviene usare sempre la stessa convenzione: o si usa la struct (ripetendo ogni volta struct _pippo) oppure si usano delle typedef e ci si riferisce sempre a quelle (pippo). Usare la typedef insieme alla dichiarazione della struct fa figo, ma può essere causa di confusione ;)
ma porc... scusate: sono talmente abituato ad usare gli alias che manco mi ero accorto che il codice di Blizzard non li conteneva! chiarito il dubbio! chiedo scusa per il macello.

imho senza typedef si diventa scemi alla fine... però ognuno ha il suo stile (a me hanno "inclucato" i typedef per definire la strutture già dalla prima volta che ho visto il c in vita mia e ormai è un riflesso incondizionato :p)

M

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

ciao
ma porc... scusate: sono talmente abituato ad usare gli alias che manco mi ero accorto che il codice di Blizzard non li conteneva! chiarito il dubbio! chiedo scusa per il macello.
Traquillo!
imho senza typedef si diventa scemi alla fine... però ognuno ha il suo stile
hehehe.... io gli alias li uso eccome. Tuttavia questo progetto l'ho impostato così e a dire la verità la leggibilità non è minacciata più di tanto... anzi comincio a trovarmici bene.

Bye Gio[/quote]

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Messaggio da Dani »

Blizzard ha scritto: FreeUserData, presente in userdat.c è così:

Codice: Seleziona tutto

//Free the user data structure
void FreeUserData(struct userdat* data)
{
	if(data->username) free(data->username);
	if(data->loginname) free(data->loginname);
	if(data->home) free(data->home);
	if(data->terminal) free(data->terminal);
	if(data->shell) free(data->shell);
}
Scusa ma questi if non sono superflui dato che se a free() passi NULL non accade nulla ?

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

Ciao,

sinceramente l'ho utilizzata perchè penso che comunque la free utilizzi un sistema analogo

void free(void* ptr)
{
if(!ptr) return;

....
....
}

oppure il contrario... è il modo più logico che mi è venuto in mente.
Se è così risparmio comunque parecchie manovre di stack e branch perchè effettuo lo stesso controllo evitando di effettuare una call di funzione... credo sia una buona cosa in fin dei conti. MA POSSO SBAGLIARMI

ciao
Gio

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

piuttosto non mi hai fatto notare la dimenticanza più grave che potrebbe causare dei crash a dir poco spettacolari.

MI SONO "IMBECILLEMENTE" DIMENTICATO DI SETTARE A "NULL" TUTTI QUEI PUNTATORI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Se allo stato attuale della funzione la richiamo un'altra volta non voglio neanche immaginare cosa va a deallocarmi!

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Messaggio da Dani »

Non ti seguo...Perchè devi settare i puntatori a NULL se poi devi passarli a free() ?

*** edit: No scusa, immagino tu intenda farlo DOPO averli passati a free() :oops:

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Messaggio da absinthe »

Blizzard ha scritto:piuttosto non mi hai fatto notare la dimenticanza più grave che potrebbe causare dei crash a dir poco spettacolari.

MI SONO "IMBECILLEMENTE" DIMENTICATO DI SETTARE A "NULL" TUTTI QUEI PUNTATORI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Se allo stato attuale della funzione la richiamo un'altra volta non voglio neanche immaginare cosa va a deallocarmi!
il reset dei puntatori, insieme ai memory leaks è uno degli errori più frequenti. è una soluzione bruttissima ma ho visto più di un codice con cose del tipo:

Codice: Seleziona tutto

#define myFree(x) { \
free(x); \
x=NULL; \
}
M

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

mmm ... effettivamente per quanto brutta sarebbe una soluzione da tenere in considerazione (non per altro mi dici che è abbastanza usata).

comunque per il momento cerco di procedere a mano... spero di non pentirmene con l'aumentare del codice (non ho mai negato di essere un tipo distratto :P).

bye
Gio

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

ciao,

ho implementato si può dire una parte del sistema che si occupa di gestire, parsare ed eseguire i comandi builtin della shell permettendo semplice manutenzione ed estensione.

Detto questo lo scopo del post riguarda il rilascio del codice.
Prima di una release volevo caricare volta per volta i sorgenti su un CVS o SVN... tuttavia utilizzo CrossVC sul CVS del progetto su sourceforge ma non ci ho capito una ceppa.
Difatti ho caricato con immani sforzi il sorgente della 0.1 dopodichè non sono riuscito ad aggiornare i file.

Mi chiedevo se conoscevate qualche servizio di CVS o SVN che potevo usare in tutta tranquillità e magari un client for dummies :P

ciao
Gio

Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Messaggio da gioco »

Come client puoi usare cervisia (CVS) o ksvn (SVN) entrambi per kde.
Di guide su CVS ce ne sono moltissime in rete a partire da cederqvist (approfondito) fino a guide passo passo come quella che c'è qui su slacky.eu:

http://www.slacky.eu/wikislack/index.ph ... ione_a_CVS

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio da Blizzard »

Ciao!

Grazie mille! imparate quattro informazioni di base un cvs client vale l'altro :D

Adesso devo imparare come cancellare gli archivi di prova che ho fatto.

Comunque se volete vedere volta per volta gli aggiornamenti del "sorcio" potete scaricarli da

http://bohsh.cvs.sourceforge.net/bohsh/bohshell/

ciao
Gio

Rispondi