====== Una libreria per leggere i file .desktop ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//11/07/2008//** \\ \\
I desktop manager come Gnome e Kde utilizzano per i propri collegamenti sul desktop i file .desktop che altro non sono che file di questo tipo:
[Desktop Entry]
Name=Audacious
Comment=Play music
Comment[hu]=Zene lejátszása
Exec=audacious %U
Icon=audacious.png
MimeType=application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/prs.sid;audio/x-flac;audio/x-it;audio/x-mod;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-wma;audio/x-musepack;audio/x-s3m;audio/x-scpls;audio/x-stm;audio/x-wav;audio/x-xm;application/ogg;audio/x-vorbis+ogg
Categories=Application;GTK;AudioVideo;Player;
Terminal=false
Type=Application
Encoding=UTF-8
Adesso realizzeremo una libreria C (dinamica e statica) e un eseguibile (utilizzabile in Bash e altri linguaggi interpretati) in grado di leggere e scrivere questi file. \\
Ricordo che l'utilizzo di questo formato di file non è solo destinato a Gnome e Kde, ma si potrebbe decidere di utilizzare questi file per memorizzare impostazioni di qualsiasi applicativo.
===== keys.h , il nostro header =====
#include
#include
#define MAXKEY 50
#define MAXVALUE 350
#define MAXLINE 450
int wordcount(char* line);
char* keyread(char *path, char* key);
void keywrite(char *path, char* key, char* value);
int keydel(char *path, char* key);
===== keys.c , il nostro sorgente =====
#include
#include
#define MAXKEY 50
#define MAXVALUE 350
#define MAXLINE 450
int wordcount(char* line);
char* keyread(char *path, char* key);
void keywrite(char *path, char* key, char* value);
int keydel(char *path, char* key);
char* keyread(char *path, char* key){
FILE *f=fopen(path, "r");
char valuetmp[MAXVALUE], line[MAXVALUE+MAXKEY], *value, key_now[MAXKEY] ;
int i;
while (feof(f)==0){
fgets(line,MAXVALUE+MAXKEY,f);
if (line[0]!='#'){
sscanf(line, "%[^'=']=%[^'=\n']",key_now, valuetmp);
if (strcmp(key_now, key)==0){
value=malloc(sizeof(valuetmp));
strcpy(value,valuetmp);
fclose(f);
return value;
}
}
}
fclose(f);
}
void keywrite(char *path, char* key, char* value){
FILE *f=fopen(path, "r");
int i, pos=0, idxline=0 ;
char valuetmp[MAXVALUE], *nline[MAXVALUE+MAXKEY], key_now[MAXKEY] ;
//get key's position
while (feof(f)==0){
pos++;
nline[pos-1]=malloc(MAXLINE);
fgets(nline[pos-1],MAXLINE,f);
if (nline[pos-1][0]!='#'){
sscanf(nline[pos-1], "%[^'=']=%[^'=']",key_now, valuetmp);
if (strcmp(key_now, key)==0 && idxline==0){
idxline=pos-1;
}
}
}
fclose(f);
//edit or append key
nline[idxline]=malloc(MAXLINE+15);
if (idxline!=0){
//edit key
sprintf(nline[idxline] ,"%s=%s\n",key,value);
FILE *f=fopen(path, "w");
for (i=0;i<=pos-1;i++) fputs(nline[i],f);
fclose(f);
}else{
//append new key
FILE *f=fopen(path, "a");
sprintf(nline[pos-1] ,"%s=%s",key,value);;
fputs(nline[pos-1],f);
fclose(f);
}
}
int keydel(char *path, char* key){
FILE *f=fopen(path, "r");
int i, pos=0, idxline=0 ;
char valuetmp[MAXVALUE], *nline[MAXVALUE+MAXKEY], key_now[MAXKEY] ;
//get key's position
while (feof(f)==0){
pos++;
nline[pos-1]=malloc(MAXLINE+15);
fgets(nline[pos-1],MAXLINE,f);
if (nline[pos-1][0]!='#'){
sscanf(nline[pos-1], "%[^'=']=%[^'=']\n",key_now, valuetmp);
if (strcmp(key_now, key)==0 && idxline==0){
idxline=pos-1;
}
}
}
fclose(f);
//delete key
if (idxline!=0){
FILE *f=fopen(path, "w");
for (i=0;i<=pos-1;i++){
if (i!=idxline)fputs(nline[i],f);
}
fclose(f);
}else{
return -1;
}
}
int wordcount(char* line){
int i,count=0;
for(i=0; i
===== test.c , il nostro eseguibile di test =====
A partire da test.c verranno generati 2 eseguibili, uno con la libreria compilata in maniera statica dentro di esso e l'altro eseguibile verra linkato dinamicamente alla libreria (il che fa sì che la libreria ne diventi una dipendenza).
L'eseguibile generato a partire da ''test.c'' ci permetterà di trattare i file .desktop da riga di comando, in questo modo:
Per leggere un valore:
./test-static -r [nome chiave] file.desktop
Per scrivere un valore (se la chiave non esiste la crea infondo al file):
./test-static -w [nome chiave] [valore] file.desktop
Per cancellare un valore:
./test-static -d [nome chiave] file.desktop
===== Il makefile =====
Il nostro make file genererà 2 librerie, una statica chiamata ''libkeys-1.0.0.a'' , l'altra dinamica chiamata ''libkeys.so.1.0.0'' e poi 2 eseguibili, uno compilato con la libreria statica e l'altro verra linkato dinamicamente alla libreria rispettivamente ''test-static'' e ''test-shared'' .
p=/usr/local/
all:
gcc -c keys.c -o libkeys.o
ar -r libkeys-1.0.0.a libkeys.o
gcc -fpic -c keys.h keys.c
gcc -shared -Wl,-soname,libkeys.so.1 -o libkeys.so.1.0.0 keys.o
test:
gcc test.c libkeys-1.0.0.a -o test-static
gcc libkeys.so.1.0.0 -o test-shared test.c keys.h
static:
gcc -c keys.c -o libkeys.o
ar -r libkeys-1.0.0.a libkeys.o
shared:
gcc -fpic -c keys.h keys.c
gcc -shared -Wl,-soname,libkeys.so.1 -o libkeys.so.1.0.0 keys.o
install:
cp libkeys.so.1.0.0 $p/lib/
cp libkeys-1.0.0.a $p/lib/
cp keys.h $p/include/
ldconfig
uninstall:
rm $p/lib/libkeys.so.1.0.0
rm $p/lib/libkeys-1.0.0.a
rm $p/include/keys.h
ldconfig