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 |