Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- bini.inc by Bebras
- Biblioteka skirta tekstinių failų rašymui, redagavimui.
- Bibliotekos principas: caching. bini_Open pakrauna failą į atmintį, bini_Set funkcijos nustato k/v reikšmes, bini_Get funkcijos gražina pateikto key reikšmę. Failas vėl išsaugomas su bini_Save.
- */
- //#define BINI_DEBUG_MODE
- // Maksimalus key ilgis
- #define BINI_MAX_KEY_LENGTH 32
- // Maksimali value reikšmė
- #define BINI_MAX_VALUE_LENGTH 256
- // Maksimalus vienu metu atidarytų failų skaičius
- #define BINI_MAX_OPENED_FILES 2
- // Ilgiausias leidžiamas failo pavadinimas
- #define BINI_MAX_FILE_NAME 32
- // Maksimalus eilučių skaičius viename faile
- #define BINI_MAX_FILE_LINES 256
- // Netinkamas failo indeksas
- #define BINI_INVALID_FILE_ID -1
- #define bini_fexist fexist
- // Function written by Y_Less
- #define bini_strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
- #if defined BINI_DEBUG_MODE
- #define bini_debug(%0); printf(%0);
- #else
- #define bini_debug(%0);
- #endif
- /*
- `7MM"""Yb. mm
- MM `Yb. MM
- MM `Mb ,6"Yb.mmMMmm ,6"Yb.
- MM MM 8) MM MM 8) MM
- MM ,MP ,pm9MM MM ,pm9MM
- MM ,dP' 8M MM MM 8M MM
- .JMMmmmdP' `Moo9^Yo.`Mbmo`Moo9^Yo.
- */
- enum E_BINI_CACHE_DATA
- {
- e_Key[BINI_MAX_KEY_LENGTH],
- e_Value[BINI_MAX_VALUE_LENGTH],
- };
- enum E_BINI_FILE_DATA
- {
- e_FileName[BINI_MAX_FILE_NAME],
- bool:e_IsFileOpen
- };
- static BiniCache[ BINI_MAX_OPENED_FILES ][ BINI_MAX_FILE_LINES ][ E_BINI_CACHE_DATA ],
- BiniFileData[ BINI_MAX_OPENED_FILES ][ E_BINI_FILE_DATA ];
- /*
- db `7MM"""Mq.`7MMF'
- ;MM: MM `MM. MM
- ,V^MM. MM ,M9 MM
- ,M `MM MMmmdM9 MM
- AbmmmqMA MM MM
- A' VML MM MM
- .AMA. .AMMA..JMML. .JMML.
- */
- stock bini_fcreate(const filename[])
- {
- if(fexist(filename))
- return false;
- new File:fhandle = fopen(filename, io_append);
- fclose(fhandle);
- return true;
- }
- stock bini_Set(const filename[], const key[], const value[])
- {
- bini_debug("bini_Set(%s, %s, %s) called", filename, key, value);
- new freeKeyIndex = -1,
- fileindex = bini_GetFileIndex(filename);
- // Jeu nurodė neegzistuojantį failą.
- if(fileindex == BINI_INVALID_FILE_ID)
- {
- bini_debug("bini_Set file %s does not exist", filename);
- return 0;
- }
- for(new i = 0; i < BINI_MAX_FILE_LINES; i++)
- {
- if(isnull(BiniCache[ fileindex ][ i ][ e_Key ]) && freeKeyIndex == -1)
- {
- freeKeyIndex = i;
- continue;
- }
- // Jeigu toks key jau nustatytas, tada pakeičiam jo reikšmę.
- if(!isnull(BiniCache[ fileindex ][ i ][ e_Key ]) && !strcmp(BiniCache[ fileindex ][ i ][ e_Key ], key))
- {
- bini_strcpy(BiniCache[ fileindex ][ i ][ e_Value ], value, BINI_MAX_VALUE_LENGTH);
- bini_debug("bini_Set updating %s value to %s at %d", key, value, i);
- return 1;
- }
- }
- if(freeKeyIndex != -1)
- {
- bini_strcpy(BiniCache[ fileindex ][ freeKeyIndex ][ e_Key ], key, BINI_MAX_KEY_LENGTH);
- bini_strcpy(BiniCache[ fileindex ][ freeKeyIndex ][ e_Value ], value, BINI_MAX_VALUE_LENGTH);
- bini_debug("bini_Set adding %s value %s at %d", key, value, freeKeyIndex);
- return 1;
- }
- bini_debug("bini_Set key could not be set.");
- return 0;
- }
- stock bini_IntSet(const filename[], key[], value)
- {
- bini_debug("bini_IntSet(%s, %s, %d) called", filename, key, value);
- new str[12];
- #if defined _inc_fixes
- valstr(str, value);
- #else
- format(str,sizeof(str),"%d",value);
- #endif
- return bini_Set(filename,key,str);
- }
- stock bini_FloatSet(const filename[], key[], Float:value)
- {
- bini_debug("bini_IntSet(%s, %s, %f) called", filename, key, value);
- new str[11];
- format(str,sizeof(str),"%f", value);
- return bini_Set(filename, key, str);
- }
- stock bini_BoolSet(filename[], key[], bool:value)
- {
- bini_debug("bini_IntSet(%s, %s, %d) called", filename, key, value);
- return bini_Set(filename, key, (value) ? ("true") : ("false"));
- }
- stock bini_Remove(const filename[], const key[])
- {
- bini_debug("bini_Remove(%s, %s)", filename, key);
- new fileindex = bini_GetFileIndex(filename);
- if(fileindex == BINI_INVALID_FILE_ID)
- {
- bini_debug("bini_Remove invalid file %s", filename);
- return 0;
- }
- for(new i = 0; i < BINI_MAX_FILE_LINES; i++)
- if(!isnull(BiniCache[ fileindex ][ i ][ e_Key ]) && !strcmp(BiniCache[ fileindex ][ i ][ e_Key], key))
- {
- bini_debug("bini_Remove removing %s from %s", key, filename);
- BiniCache[ fileindex ][ i ][ e_Key ][ 0 ] = '\0';
- return 1;
- }
- bini_debug("bini_Remove %s not found in %s", key, filename);
- return 0;
- }
- stock bini_IsFileOpen(const filename[])
- {
- bini_debug("bini_IsFileOpen(%s) called", filename);
- new fileindex = bini_GetFileIndex(filename);
- if(fileindex != BINI_INVALID_FILE_ID)
- {
- bini_debug("bini_IsFileOpen invalid file name %s", filename);
- return 0;
- }
- return BiniFileData[ fileindex ][ e_IsFileOpen ];
- }
- stock bini_Get(const filename[], const key[], string[], size = sizeof(string))
- {
- bini_debug("bini_Get(%s, %s, %s, %d) called", filename, key, string, size);
- new fileindex = bini_GetFileIndex(filename);
- if(fileindex == -1)
- {
- bini_debug("bini_Get file %s is not open", filename);
- return 0;
- }
- for(new i = 0; i < BINI_MAX_FILE_LINES; i++)
- {
- if(!isnull(BiniCache[ fileindex ][ i ][ e_Key ]) && !strcmp(BiniCache[ fileindex ][ i ][ e_Value ], key))
- {
- bini_strcpy(string, BiniCache[ fileindex ][ i ][ e_Value ], size);
- return 1;
- }
- }
- return 0;
- }
- stock bini_IntGet(const filename[], const key[])
- {
- bini_debug("bini_IntGet(%s, %s) called", filename, key);
- new tmp[ BINI_MAX_VALUE_LENGTH ];
- bini_Get(filename, key, tmp, sizeof(tmp));
- return strval(tmp);
- }
- stock Float:bini_FloatGet(const filename[], const key[])
- {
- bini_debug("bini_FloatGet(%s, %s) called", filename, key);
- new tmp[ BINI_MAX_VALUE_LENGTH ];
- bini_Get(filename, key, tmp, sizeof(tmp));
- return floatstr(tmp);
- }
- stock bool:bini_BoolGet(const filename[], const key[])
- {
- bini_debug("bini_BoolGet(%s, %s) called", filename, key);
- return (bini_IntGet(filename, key)) ? (true) : (false);
- }
- stock bini_Open(const filename[])
- {
- bini_debug("bini_Open(%s) called", filename);
- if(!bini_fexist(filename))
- bini_fcreate(filename);
- new freeindex = BINI_INVALID_FILE_ID;
- // Reikia patikrinti galbūt tas failas jau atidarytas.
- for(new i; i < BINI_MAX_OPENED_FILES; i++)
- {
- // Tikrindami taippat susirandame laisva indeksa
- if(freeindex == -1 && !BiniFileData[i][e_IsFileOpen])
- {
- freeindex = i;
- continue;
- }
- if(!isnull(BiniFileData[ i ][ e_FileName ]) && !strcmp(BiniFileData[ i ][ e_FileName ], filename))
- {
- bini_debug("bini_Open %s already open in handle %d", filename, i);
- bini_LoadFile(filename, i);
- return i;
- }
- }
- if(freeindex != -1)
- {
- BiniFileData[ freeindex ][ e_IsFileOpen ] = true;
- bini_strcpy(BiniFileData[ freeindex ][ e_FileName ], filename, BINI_MAX_FILE_NAME);
- bini_debug("bini_Open %s successfully opened in handle %d.", filename, freeindex);
- bini_LoadFile(filename, freeindex);
- return freeindex;
- }
- bini_debug("bini_Open %s could not be opened", filename);
- return BINI_INVALID_FILE_ID;
- }
- stock bini_Save(const filename[])
- {
- bini_debug("bini_Save(%s) called", filename);
- new fileindex = bini_GetFileIndex(filename),
- File:handle;
- // Jeu nurodė neegzistuojantį failą.
- if(fileindex == BINI_INVALID_FILE_ID)
- {
- bini_debug("bini_Save %s was never open.", filename);
- return 0;
- }
- handle = fopen(filename, io_write);
- if(!handle)
- {
- bini_debug("bini_Save could not open file.");
- return 0;
- }
- for(new i = 0; i < BINI_MAX_FILE_LINES; i++)
- {
- if(!isnull(BiniCache[ fileindex ][ i ][ e_Key ]))
- {
- fwrite(handle, BiniCache[ fileindex ][ i ][ e_Key ]);
- fwrite(handle, " = ");
- fwrite(handle, BiniCache[ fileindex ][ i ][ e_Value ]);
- fwrite(handle, "\r\n");
- bini_debug("bini_Save added %s value in %s", BiniCache[ fileindex ][ i ][ e_Key ], filename);
- BiniCache[ fileindex ][ i ][ e_Key ][ 0 ] = '\0';
- BiniCache[ fileindex ][ i ][ e_Value ][ 0 ] = '\0';
- }
- }
- BiniFileData[ fileindex ][ e_IsFileOpen ] = false;
- fclose(handle);
- return 1;
- }
- /*
- ,,
- `7MMF' mm `7MM
- MM MM MM
- MM `7MMpMMMb.mmMMmm .gP"Ya `7Mb,od8 `7MMpMMMb. ,6"Yb. MM
- MM MM MM MM ,M' Yb MM' "' MM MM 8) MM MM
- MM MM MM MM 8M"""""" MM MM MM ,pm9MM MM
- MM MM MM MM YM. , MM MM MM 8M MM MM
- .JMML..JMML JMML.`Mbmo`Mbmmd'.JMML. .JMML JMML.`Moo9^Yo..JMML.
- */
- static stock bini_GetFileIndex(const filename[])
- {
- for(new i = 0; i < BINI_MAX_OPENED_FILES; i++)
- {
- if(!isnull(BiniFileData[i][e_FileName]) && !strcmp(BiniFileData[i][e_FileName], filename))
- return i;
- }
- return BINI_INVALID_FILE_ID;
- }
- static stock bini_GetFreeLineIndex(fileindex)
- {
- bini_debug("bini_GetFreeLineIndex(%d) called");
- for(new i = 0; i < BINI_MAX_FILE_LINES; i++)
- if(isnull(BiniCache[ fileindex ][ i ][ e_Key ]))
- {
- bini_debug("bini_GetFreeLineIndex found free index at %d", i);
- return i;
- }
- bini_debug("bini_GetFreeLineIndex free index not found");
- return -1;
- }
- static stock bini_StripNewLine(string[])
- {
- new len = strlen(string);
- if(!string[0])
- return;
- if((string[len - 1] == '\n') || (string[len - 1] == '\r'))
- {
- string[len - 1] = 0;
- if(string[0]==0) return ;
- if((string[len - 2] == '\n') || (string[len - 2] == '\r'))
- string[len - 2] = 0;
- }
- }
- static stock bini_Trim(string[])
- {
- new len = strlen(string),
- i = 0;
- while((i = strfind(string, " ")) != -1 || (i = strfind(string, "\t")) != -1)
- {
- if(i + 1 == len)
- string[ i ] = '\0';
- else
- {
- for(new j = i; j < len-1; j++)
- string[ j ] = string[ j + 1 ];
- len--;
- string[ len ] = '\0';
- }
- }
- }
- static stock bini_LoadFile(const filename[], fileindex)
- {
- bini_debug("bini_LoadFile(%s, %d) called", filename, fileindex);
- new File:handle = fopen(filename, io_read),
- buffer[ BINI_MAX_KEY_LENGTH + 8 + BINI_MAX_VALUE_LENGTH ],
- key[ BINI_MAX_KEY_LENGTH ],
- value[ BINI_MAX_VALUE_LENGTH ],
- lineindex = -1,
- index = -1;
- if(!handle)
- {
- bini_debug("bini_LoadFile could not open %s", filename);
- return 0;
- }
- while(fread(handle, buffer))
- {
- // Jeigu tai komentaras(prasideda ;) arba nėra lygybės, tiesiog ignoruojam
- if(buffer[ 0 ] == ';' || (index = strfind(buffer, "=")) == -1)
- {
- continue;
- }
- bini_StripNewLine(buffer);
- strmid(key, buffer, 0, index);
- bini_Trim(key);
- strmid(value, buffer, index+1, strlen(buffer));
- bini_Trim(value);
- lineindex = bini_GetFreeLineIndex(fileindex);
- if(lineindex != -1 || !isnull(key) || !isnull(value))
- {
- bini_strcpy(BiniCache[ fileindex ][ lineindex ][ e_Key ], key, BINI_MAX_KEY_LENGTH);
- bini_strcpy(BiniCache[ fileindex ][ lineindex ][ e_Value ], value, BINI_MAX_VALUE_LENGTH);
- }
- else
- {
- bini_debug("bini_LoadFile invalid lineindex, key or value.");
- }
- }
- fclose(handle);
- bini_debug("bini_LoadFile file %s successfully read", filename);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement