/**************/ /* ininame.c */ /**************************************************************************** PROGRAM: ininame.c Windows: Win 3.1 & Win32 PURPOSE: Aliohjelmakirjasto ini-tiedoston selvittämiseksi. INI-tiedostoa etsitään järjestyksessä: 1) oletushakemisto 2) windows-hakemisto 3) hakemisto josta .exe löytyi INI-tiedoston nimenä käytetään 1) jos on -i= optio, niin tätä nimeä 2) muuten exenimi.ini AUTHOR: Vesa Lappalainen 18.8.1995 USAGE: Käyttäjän pitää 0) Liittää projektiin ALI\ininame.c, ALI\mjonot.c ja pääohjelmaan #include "ininame.h" 1) Kutsua aliohjelmaa FindIniFileName(N_S(ininame),defname); ============ Aliohjelmat: (ininame.c, ininame.h) ============ int FileExist(const char *name); - tutkii onko tiedosto olemassa char *FindIniFileName(char *ininame, int m,const char *def); - kokeilee em vaihtohetoja ini-tiedoston nimeksi. Jos def == NULL, on nimiosanana ohjelman nimi, muuten def (jossa pitää olla .ini). char *ScanOption(char *s, int m, char optchar, const char *opt) - Etsitään optiota opt (esim i=), ja palutetaan option jälkeen ollut merkkijono. Tutkiminen lopetetaan ensimmäiseen löytyneeseen tai ensimmäiseen kohtaan, jossa ei ole optiomerkkiä. Jos optiota ei löydy, palautetaan NULL, muuten jono. int DeleteArgV(int n) - Tuhotaan argumenttivektorista n alkio char *FullFileName(char *s, int m, const char *path, const char *name) - Tekee kokonaisen tiedoston nimen, johon on yhdistetty polku ja nimi: Olkoon oletushakemistona D:\OMA ja C:lla \BIN path name -> s . TEST.C D:OMA\TEST.C C:\SYS\ TEST.C C:\SYS\TEST.C C:\SYS TEST.C C:\SYS\TEST.C C: TEST.C C:\BIN\TEST.C ******************************************************************************/ #include #include #include #include #include "ininame.h" #include "mjonot.h" /*****************************************************************************/ int FileExist(const char *name) /* Palautetaan 1 jos tiedosto on olemassa, muuten 0 */ { OFSTRUCT OfStruct; HFILE hFile = OpenFile(name,&OfStruct,OF_EXIST); return hFile != HFILE_ERROR; } /*****************************************************************************/ int DeleteArgV(int n) { int i; char *old; if ( n <= 0 || n >= _argc ) return _argc; old = _argv[n]; for (i=n; i<_argc-1; i++) { _argv[i] = _argv[i+1]; } _argv[i] = old; if ( old ) *old = 0; return _argc; } /*****************************************************************************/ char *ScanOption(char *s, int m, char optchar, const char *opt) /* Etsitään optiota opt (esim i=), ja palautetaan option jälkeen ollut ** merkkijono. Tutkiminen lopetetaan ensimmäiseen löytyneeseen tai ** ensimmäiseen kohtaan, jossa ei ole optiomerkkiä. ** Jos optiota ei löydy, palautetaan NULL, muuten jono. **---------------------------------------------------------------------------*/ { int i,ol = strlen(opt); for (i=1; i<_argc; i++) { if ( _argv[i][0] != optchar ) break; if ( strncmp(_argv[i]+1,opt,ol) == 0 ) { kopioi_jono(s,m,_argv[i]+1+ol); DeleteArgV(i); return s; } } return NULL; } /*****************************************************************************/ char *FullFileName(char *s, int m, const char *path, const char *name) { const char *p = path; char cur[80]; if ( path[0] && path[strlen(path)-1] == ':' ) /* Jos pelkkä levyn nimi */ if ( _getdcwd(path[0]-'A'+1,N_S(cur)) ) p = cur; if ( strcmp(path,".") == 0 ) /* Jos oletushakemisto */ if ( _getdcwd(0,N_S(cur)) ) p = cur; kopioi_jono(s,m,p); if ( s[0] && s[strlen(s)-1] != '\\' ) liita_jono(s,m,"\\"); liita_jono(s,m,name); return s; } /*****************************************************************************/ char *FindIniFileName(char *ininame, int m,const char *def) { char windowsdir[60],progdir[100]; char *progname,*p; char ini[100]; kopioi_jono(N_S(progdir),_argv[0]); progname = strrchr(progdir,'\\'); if ( progname ) { *progname = 0; progname++; } p = strrchr(progname,'.'); if ( p ) *p = 0; /* dadsave.ini => dadsave */ kopioi_jono(N_S(ini),progname); liita_jono(N_S(ini),".ini"); /* => dadsave.ini */ if ( def ) kopioi_jono(N_S(ini),def); ScanOption(N_S(ini),'-',"i="); /* -i= option tutkiminen */ kopioi_jono(ininame,m,ini); if ( strchr(ininame,'\\') ) return ininame; /* => polun kanssa */ FullFileName(ininame,m,".",ini); if ( FileExist(ininame) ) return ininame; /* => .\dadsave.ini */ GetWindowsDirectory(N_S(windowsdir)); FullFileName(ininame,m,windowsdir,ini); if ( FileExist(ininame) ) return ininame; /* => c:\win\dadsave.ini */ FullFileName(ininame,m,progdir,ini); return ininame; /* => c:\...\dadsave.ini */ }