Автор Тема: парсинг конфига  (Прочитано 922 раз)

0 Пользователей и 1 Гость просматривают эту тему.

twist

  • Гость
#0: 23 Ноября 2004, 09:20:33
Народ, подскажите начинающему програмеру методы сабжа. Если можно, то с уклоном на С++. Только пожалуйсто без пантов и выкрутасов. Заранее спасибо.

Бунтарь

  • Глобальный модератор
  • *****
  • Сообщений: 7444
    • Просмотр профиля
    • http://dvphoenix.ru
#1: 23 Ноября 2004, 10:39:43
По моему давно перевелись экстрасенсы в сети.
Какого конфига, для чего?
Или может быть все таки нужны средства и методы отладки программы?

Twist

  • Гость
#2: 23 Ноября 2004, 12:00:43
Нужен способ получения значения конфигурационной строки из файла.conf для дальнейшей работы проги с этим значением настроечной переменной.  Хотя от средст и методов отладки проги тоже не отказался бы, желательно под Linux.:)

хех

  • Гость
#3: 23 Ноября 2004, 13:12:12
с уклоном на С++  или разбор конфига на С++ ?
конфиги бывают разные как и методы из обработки. В том же перле есть модули для разбора конфигов. На tcl конфиг является простым тиклевым-скриптом
Сейчас модно применять xml-конфиги.

В общем уточните вопрос.

ну а вообще - берем стандартные функции работы со строками да разбираем =)

Twist

  • Гость
#4: 23 Ноября 2004, 13:43:20
Видно слово \"начинающий\" надо было написать большими буквами для акцента.
Поставим вопрос по другому. Нужен кусочек кода на С++ который берет настройки из файла (пусть модного XML), желательно с коментариями. Пока остановимся на этом.

Twist

  • Гость
#5: 23 Ноября 2004, 14:15:45
Ну или хотя бы механизм этого процесса.

хех

  • Гость
#6: 23 Ноября 2004, 14:19:37
на С++  это , я бы сказал так, далеко не тривиальная задача =), хотя кто-то может со мной и не согласиться

конфиг вида
++++++
# default is 3000                                                                                                            
Port 3000                                                                                                                    
                                                                                                                             
# Number of thread for work with requests                                                                                    
StartServers 8                                                                                                              
MaxRequests  10                                                                                                              
                                                                                                                             
# The Server Root (UNIX systems style)                                                                                      
# ServerRoot /usr/local/finlin                                                                                              
ServerRoot ..                                                                                                                
                                                                                                                             
# The path of the log file                                                                                                  
AccessLog log/access.log                                                                                                    
ServerLog log/server.log                                                                                                    
                                                                                                                             
# The file where the pid of the server is logged                                                                            
PidFile log/server.pid                                                                                                      
                                                                                                                             
# The name of used database (DRIVER:host:port)                                                                              
DBDriver MYSQL                                                                                                              
DBServer localhost                                                                                                          
DBPort 3306                                                                                                                  

 Database /                                                                                                                  
    Name finlin                                                                                                              
    Description \"Test database\"                                                                                              
    User finlin                                                                                                              
    Password test                                                                                                            
 /Database                                                                                                                  

++++++

разбирается следующим кодом

хех

  • Гость
#7: 23 Ноября 2004, 14:21:29
int Server::readConfiguration(char *conf) {                                                                                  
    FILE *f;                                                                                                                
    char str[CONF_LINE];                                                                                                    
    char *param;                                                                                                            
    int i, isgroup=0, lineno=0;                                                                                              
    char *name=\"\", *desc=\"\", *user=\"\", *passwd=\"\";                                                                          
    char val[CONF_LINE];                                                                                                    
                                                                                                                             
    // Try to open configuration file                                                                                        
    f = fopen(conf,\"rt\");                                                                                                    
    if(!f) {                                                                                                                
        fprintf(stderr,\"Error open config file  s:  s/n\",conf,strerror(errno));                                              
        return ERROR;                                                                                                        
    }                                                                                                                        
                                                                                                                             
    while(fgets(str,CONF_LINE,f)) {                                                                                          
        lineno++;                                                                                                            
        for(i=0;str && (str==` ` || str==0x09);i++) ;                                                              
        if(!str || str==`#`) continue;                                                                                
        param = (char *)(str+i);                                                                                            
                                                                                                                             
        // Check database group                                                                                              
        if(!strncasecmp(param,\" Database\",9)) { isgroup=1; continue; }                                                      
                                                                                                                             
        if(!strncasecmp(param,\" /Database  /Database  /Database  /Database  /Database  /Database  /Database

хех

  • Гость
#8: 23 Ноября 2004, 14:23:33
режет посты форум =((
ну в общем рыть в этом направлении

        // Read parameters                                                                                                  
        switch(get_param(param, val)) {                                                                                      
            case CFG_PORT: config.port = (unsigned short)atoi(val); break;                                                  
            case CFG_THRDS: config.num_thread = (unsigned short)atoi(val); break;                                            
            case CFG_MAXRQ: config.max_requests = (unsigned short)atoi(val); break;                                          
            case CFG_ACCLOG: config.access_log = strdup(val); break;                                                        
            case CFG_SRVLOG: config.server_log = strdup(val); break;                                                        
            case CFG_DBDRV: config.dbdriver = strdup(val); break;                                                            
            case CFG_DBSRV: config.dbserver = strdup(val); break;                                                            
            case CFG_DBPORT: config.dbport = atoi(val); break;                                                              
            case CFG_NAME: name = strdup(val); break;                                                                        
            case CFG_DESC: desc = strdup(val); break;                                                                        
            case CFG_USER: user = strdup(val); break;                                                                        
            case CFG_PASSWD: passwd = strdup(val); break;                                                                    
            case CFG_ROOT: config.root = strdup(val); break;                                                                
            case CFG_PIDFILE: config.pid_file = strdup(val); break;                                                          
            default: break;                                                                                                  
        }                                                                                                                    
    }                                                                                                                        

хех

  • Гость
#9: 23 Ноября 2004, 14:27:02
ну а на тикле

++ config.cfg +++
set param \"value\"
++++

+++ скрипт +++
source [file join $env(home) .prog config.cfg]
puts $param
+++

выведет в стандартный вывод значение \"value\" взятое из конфига

Twist

  • Гость
#10: 24 Ноября 2004, 08:52:13
а есть че нить почитать по этому тиклу, можно в цифровом виде?

Twist

  • Гость
#11: 24 Ноября 2004, 09:00:00
вот нашел, может кого заинтересует http://doro.poltava.ua/

хех

  • Гость
#12: 24 Ноября 2004, 09:20:23
http://www.tcl.tk
http://wiki.tcl.tk/

только там по английски.
а вообще это _очень_ хороший язык!!!

m

  • Гость
#13: 24 Ноября 2004, 21:43:59
TCL - хороший язык ?!
боже упаси меня от таких прог. встречалось мне по работе это чудо.
В п..ду, в п..ду.

Вольга

  • ***
  • Сообщений: 1511
    • Просмотр профиля
#14: 25 Ноября 2004, 07:21:59
Так предложи, на чём писать тогда.

хех

  • Гость
#15: 25 Ноября 2004, 07:40:20
Это так - пример использования \"этого чуда\":

http://tkabber.jabber.ru/

Просто tcl в отличие от ...  _другое_ и не каждому джано понять красоту языка

Berserk

  • Гость
#16: 25 Ноября 2004, 09:32:10
как обычно фу-фу и никаких обоснований :(

 

kompas