⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpret_config.c

📁 基于linux的DVD播放器程序
💻 C
字号:
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <libxml/xmlmemory.h>#include <libxml/parser.h>#include "bindings.h"#include "debug_print.h"#include "interpret_config.h"extern char *dvd_path;extern int bookmarks_autosave;extern int bookmarks_autoload;extern int digit_timeout;extern int number_timeout;extern int default_skip_seconds;extern int skip_seconds;extern int prevpg_timeout;static void interpret_b(xmlDocPtr doc, xmlNodePtr cur){  char *action = NULL;  char *key = NULL;    cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("action", cur->name)) {	if(action != NULL) {	  ERROR("%s", "interpret_b(): more than one <action>\n");	  break;	}	action = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);	if(action == NULL) {	  ERROR("%s", "interpret_b(): <action> empty\n");	} else {	  //fprintf(stderr, "action: %s\n", action);	}      } else if(!strcmp("key", cur->name)) {	if(action == NULL) {	  ERROR("%s", "interpret_b(): no <action>\n");	  break;	}	key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);	if(key == NULL) {	  WARNING("%s", "interpret_b(): <key> empty\n");	} else {	  add_keybinding(key, action);	  //fprintf(stderr, "key: %s\n", key);		  free(key);	}      }    }    cur = cur->next;  }  if(action != NULL) {    free(action);  }}static void interpret_bindings(xmlDocPtr doc, xmlNodePtr cur){  cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("b", cur->name)) {	interpret_b(doc, cur);      }    }    cur = cur->next;  }}static void interpret_bookmarks(xmlDocPtr doc, xmlNodePtr cur){  xmlChar *s;    cur = cur->xmlChildrenNode;    while(cur != NULL) {    if(!xmlIsBlankNode(cur)) {      if(!strcmp("autosave", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  if(!strcmp("yes", s)) {	    bookmarks_autosave = 1;	  }	  free(s);	}      } else if(!strcmp("autoload", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  if(!strcmp("yes", s)) {	    bookmarks_autoload = 1;	  }	  free(s);	}      }    }      cur = cur->next;  }}static void interpret_ui(xmlDocPtr doc, xmlNodePtr cur){  xmlChar *s;  cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("bindings", cur->name)) {	interpret_bindings(doc, cur);      } else if(!strcmp("bookmarks", cur->name)) {	interpret_bookmarks(doc, cur);      } else if(!strcmp("digit_timeout", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  digit_timeout = atoi(s);	  if(digit_timeout < 0 ) {	    digit_timeout = 0;	  }	  free(s);	}      } else if(!strcmp("number_timeout", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  number_timeout = atoi(s);	  if(number_timeout < 0 ) {	    number_timeout = 0;	  }	  free(s);	}      } else if(!strcmp("default_skiptime", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  default_skip_seconds = atoi(s);	  if(default_skip_seconds < 0 ) {	    default_skip_seconds = 0;	  }	  skip_seconds = default_skip_seconds;	  free(s);	}      } else if(!strcmp("prevpg_timeout", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  prevpg_timeout = atoi(s);	  if(prevpg_timeout < 0 ) {	    prevpg_timeout = 0;	  }	  free(s);	}      }    }    cur = cur->next;  }}static void interpret_device(xmlDocPtr doc, xmlNodePtr cur){  xmlChar *s;    cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("path", cur->name)) {	if((s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))) {	  if(dvd_path != NULL) {	    free(dvd_path);	  }	  dvd_path = strdup(s);	  free(s);	}      }    }    cur = cur->next;  }}static void interpret_dvd(xmlDocPtr doc, xmlNodePtr cur){  cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("device", cur->name)) {	interpret_device(doc, cur);      }    }    cur = cur->next;  }}static void interpret_ogle_conf(xmlDocPtr doc, xmlNodePtr cur){  cur = cur->xmlChildrenNode;    while(cur != NULL) {        if(!xmlIsBlankNode(cur)) {      if(!strcmp("dvd", cur->name)) {	interpret_dvd(doc, cur);      } else if(!strcmp("user_interface", cur->name)) {	interpret_ui(doc, cur);      }    }    cur = cur->next;  }}int interpret_oglerc(char *filename){  xmlDocPtr doc;  xmlNodePtr cur;  int fd;  if((fd = open(filename, O_RDONLY)) == -1) {    if(errno != ENOENT) {      perror(filename);    }    return -1;  } else {    close(fd);  }    doc = xmlParseFile(filename);  if(doc != NULL) {    cur = xmlDocGetRootElement(doc);     while(cur != NULL) {            if(!xmlIsBlankNode(cur)) {	if(!strcmp("ogle_conf", cur->name)) {	  interpret_ogle_conf(doc, cur);	}      }      cur = cur->next;    }        xmlFreeDoc(doc);    return 0;  } else {    return -1;  }}int interpret_config(void){  int config_read = 0;  char *home;  if(interpret_oglerc(CONFIG_FILE) != -1) {    config_read |= 1;  }  home = getenv("HOME");  if(home == NULL) {    WARNING("%s", "No $HOME\n");  } else {    char *rcpath = NULL;    char rcfile[] = ".oglerc";        rcpath = malloc(strlen(home)+strlen(rcfile)+2);    strcpy(rcpath, home);    strcat(rcpath, "/");    strcat(rcpath, rcfile);        if(interpret_oglerc(rcpath) != -1) {      config_read |= 2;    }    if(!config_read) {      ERROR("interpret_config(): Couldn't read '%s'\n", rcpath);    }    free(rcpath);  }    if(!config_read) {    ERROR("%s", "interpret_config(): Couldn't read "CONFIG_FILE"\n");    return -1;  }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -