|
From: <Mar...@t-...> - 2004-01-16 16:38:37
|
Michael Reinelt schrieb:
> Hallo Markus,
>
> Das war jeder mal, und dazulernen sollte man sowieso immer.
>
> Gerne. Schaun wir mal deinen Code an:
> ich hab vorne Zeilennummern dazugeschrieben, und beziehe mich dann darauf:
>
> ?? int len=strlen(key);
>
> 01 //Read Lines from the Stream
> 02 while(fgets(zeile,200,xmms_stream)) {
> 03 hash_key=key; val=zeile;
> 04 if (strncmp(key, zeile, len)==0 && zeile[len]==':') {
> 05 // remove trailing newline
> 06 zeile[strlen(zeile)-1]='\0';
> 07 // add entry to hash table
> 08 val=zeile+len+2;
> 09 hash_set (&xmms, hash_key, val);
> 10 time(&now);
> 11 fclose(xmms_stream);
> 12 }
> 13 }
> 14 }
>
> Zeile 04: Du springst in den innern Teil nur, wenn der gesuchte Key des
> Plugins in der Zeile vorkommt.
>
> Zeile 09: Speichern des Werts im Hash nur, wenn der gesuchte Key
> gefunden wurde.
>
> Zeile 10: Setzen des Zeitstempels ebenfalls nur bei gefundenem Key.
>
> Zeile 11: Schließen der Datei hier innerhalb der Schleife! Das ist ein
> eher schwerer Fehler. Warum?
> 1. würde das Programm wieder zu der while() bedingung zurückkehren, und
> die lautet fgets(.., strem). Du hast aber stream gerade geschlossen.
> nicht sehr nett...
> 2. Stell dir vor, das Plugin wird mit einem Key aufgerufen, den es gar
> nicht gibt. Der ganze if() zweig wird also nie ausgeführt. Kein hash
> wird gespeichert. und die Datei wird *NIE* geschlossen. Beim nächsten
> Aufruf wird sie erneut geöffnet (was aber einen neuen File-Deskrtiptor
> zur Folge hat). Irgendwann gehen dem Prozess die Deskriptoren aus, und
> er fällt auf die Nase...
Hätt ich ja auch selber drauf kommen können.
> Die Idee das hashes ist, die gesamte Datei mit allen zeilen einzulesen
> und im hash zu speichern, dafür nur alle 1 Sekunden. Und vollkommen
> unabhängig davon, welchen Key der User jetzt denn lesen wollte. Dieser
> Wert wird erst anschließend aus dem hash gelesen. Wenn der Key nicht
> existiert, kriegt er eben einen Fehler bzw. einen Leerstring.
Jetz hab ich das Prinzip verstanden!
> Zum Vergleich die neue Schleife:
>
> while(fgets(zeile,sizeof(zeile),xmms_stream)) {
> char *c, *key, *val;
> c=strchr(zeile, ':');
> if (c==NULL) continue;
> key=zeile; val=c+1;
> // strip leading blanks from key
> while (isspace(*key)) *key++='\0';
> // strip trailing blanks from key
> do *c='\0'; while (isspace(*--c));
> // strip leading blanks from value
> while (isspace(*val)) *val++='\0';
> // strip trailing blanks from value
> for (c=val; *c!='\0';c++);
> while (isspace(*--c)) *c='\0';
> hash_set (&xmms, key, val);
> }
>
> fclose(xmms_stream);
> return 0;
>
> hier wird die gesamte Datei Zeile für Zeile gelesen. Wenn in der Zeile
> kein Doppelpunkt vorkommt, wird die nächste zeile gelesen. Wenn ja, wird
> am Doppelpunkt zwischen key und val aufgeteilt. Dann werden noch von key
> und val vorne und hinten etwaige Leerzeichen entfernt (kommt zwar in
> deiner /tmp/xmms-info nciht vor, aber man kann ja nie wissen...
>
> Was anderes: welche Art Display verwendest du denn? ich bin grad dabei,
> Prioritäten zu vergeben, welche Treiber als nächstes auf die neue
> Architektur portiert werden. ich würde den Treiber für dein Display
> vorziehen, damit du dein Plugin auch mal in der Praxis testen kannst...
>
Ich hab ein HD44780 am parallel Port
>
> bye, Michi
>
--
Markus Keil
Chemnitz,Saxony
Germany
|