mcabber/src/parsecfg.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 16 Jul 2005 13:27:00 +0100
changeset 325 ff6fb51bfd78
parent 300 12f919be3da5
child 333 db5bebe96c89
permissions -rw-r--r--
Handle "error" message type
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     1
#include <stdio.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     2
#include <stdlib.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     3
#include <unistd.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     4
#include <ctype.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     5
#include <string.h>
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
     6
#include <glib.h>
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     7
279
f5dd437c057b Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents: 188
diff changeset
     8
#include "settings.h"
170
ea5e101fd29e [/trunk] Changeset 182 by mikael
mikael
parents: 169
diff changeset
     9
#include "utils.h"
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    10
297
9bdfef4f4735 Add comment for the cfg_file() function
Mikael Berthe <mikael@lilotux.net>
parents: 279
diff changeset
    11
//  cfg_file(filename)
9bdfef4f4735 Add comment for the cfg_file() function
Mikael Berthe <mikael@lilotux.net>
parents: 279
diff changeset
    12
// Read and parse config file "filename".  If filename is NULL,
9bdfef4f4735 Add comment for the cfg_file() function
Mikael Berthe <mikael@lilotux.net>
parents: 279
diff changeset
    13
// try to open the configuration file at the default locations.
9bdfef4f4735 Add comment for the cfg_file() function
Mikael Berthe <mikael@lilotux.net>
parents: 279
diff changeset
    14
//
9bdfef4f4735 Add comment for the cfg_file() function
Mikael Berthe <mikael@lilotux.net>
parents: 279
diff changeset
    15
// This function comes from Cabber, and has been slightly modified.
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    16
int cfg_file(char *filename)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    17
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    18
  FILE *fp;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    19
  char *buf;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    20
  char *line;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    21
  char *value;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    22
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    23
  if (!filename) {
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    24
    // Use default config file locations
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    25
    char *home = getenv("HOME");
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    26
    if (!home) {
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    27
      ut_WriteLog("Can't find home dir!\n");
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    28
      exit(EXIT_FAILURE);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    29
    }
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    30
    filename = g_new(char, strlen(home)+24);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    31
    sprintf(filename, "%s/.mcabber/mcabberrc", home);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    32
    if ((fp = fopen(filename, "r")) == NULL) {
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    33
      // 2nd try...
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    34
      sprintf(filename, "%s/.mcabberrc", home);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    35
      if ((fp = fopen(filename, "r")) == NULL) {
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    36
        fprintf(stderr, "Cannot open config file!\n");
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    37
        exit(EXIT_FAILURE);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    38
      }
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    39
    }
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    40
    g_free(filename);
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    41
  }
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    42
  else if ((fp = fopen(filename, "r")) == NULL) {
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    43
    perror("fopen (parsecfg.c:46)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    44
    exit(EXIT_FAILURE);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    45
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    46
170
ea5e101fd29e [/trunk] Changeset 182 by mikael
mikael
parents: 169
diff changeset
    47
  buf = g_new(char, 256);
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    48
170
ea5e101fd29e [/trunk] Changeset 182 by mikael
mikael
parents: 169
diff changeset
    49
  while (fgets(buf, 256, fp) != NULL) {
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    50
    line = buf;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    51
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    52
    while (isspace((int) *line))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    53
      line++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    54
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    55
    while ((strlen(line) > 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    56
	   && isspace((int) line[strlen(line) - 1]))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    57
      line[strlen(line) - 1] = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    58
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    59
    if ((*line == '\n') || (*line == '\0') || (*line == '#'))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    60
      continue;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    61
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    62
    if ((strchr(line, '=') != NULL)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    63
      value = strchr(line, '=');
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    64
      *value = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    65
      value++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    66
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    67
      while (isspace((int) *value))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    68
	value++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    69
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    70
      while ((strlen(line) > 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    71
	     && isspace((int) line[strlen(line) - 1]))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    72
	line[strlen(line) - 1] = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    73
279
f5dd437c057b Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents: 188
diff changeset
    74
      settings_set(SETTINGS_TYPE_OPTION, line, value);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    75
      continue;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    76
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    77
    fprintf(stderr, "CFG: orphaned line \"%s\"\n", line);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    78
  }
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
    79
  g_free(buf);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    80
  return 1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    81
}