mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-25 13:55:34 -05:00
[History] When getting history fields, do not parse order fields.
- This is the critical part of the code, most code and direct influence on user.
This commit is contained in:
parent
a723356d14
commit
bcb5844b6d
1 changed files with 40 additions and 14 deletions
|
@ -76,6 +76,45 @@ static void __history_write_element_list ( FILE *fd, _element **list, unsigned i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char ** __history_get_element_list_fields ( FILE *fd, unsigned int *length )
|
||||||
|
{
|
||||||
|
unsigned int real_length = 0;
|
||||||
|
char **retv = NULL;;
|
||||||
|
if ( length == NULL ) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*length = 0;
|
||||||
|
|
||||||
|
if ( fd == NULL ) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
char *buffer = NULL;
|
||||||
|
size_t buffer_length = 0;
|
||||||
|
ssize_t l = 0;
|
||||||
|
while ( ( l = getline ( &buffer, &buffer_length, fd ) ) > 0 ) {
|
||||||
|
// Jump to the first space.
|
||||||
|
const char *start = strchr( buffer, ' ');
|
||||||
|
// not found, skip.
|
||||||
|
if ( start == NULL ) continue;
|
||||||
|
start++;
|
||||||
|
// remove trailing \n
|
||||||
|
buffer[l - 1] = '\0';
|
||||||
|
if ( real_length < ( *length + 2 ) ) {
|
||||||
|
real_length += 15;
|
||||||
|
// Resize and check.
|
||||||
|
retv = g_realloc ( retv, ( real_length ) * sizeof ( char* ) );
|
||||||
|
}
|
||||||
|
// Parse the number of times.
|
||||||
|
retv[( *length )] = g_strndup ( start, l - 1 - ( start - buffer ) );
|
||||||
|
// Force trailing '\0'
|
||||||
|
retv[( *length ) + 1] = NULL;
|
||||||
|
|
||||||
|
( *length )++;
|
||||||
|
|
||||||
|
}
|
||||||
|
return retv;
|
||||||
|
}
|
||||||
|
|
||||||
static _element ** __history_get_element_list ( FILE *fd, unsigned int *length )
|
static _element ** __history_get_element_list ( FILE *fd, unsigned int *length )
|
||||||
{
|
{
|
||||||
unsigned int real_length = 0;
|
unsigned int real_length = 0;
|
||||||
|
@ -272,7 +311,6 @@ char ** history_get_list ( const char *filename, unsigned int *length )
|
||||||
if ( config.disable_history ) {
|
if ( config.disable_history ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
_element **list = NULL;
|
|
||||||
char **retv = NULL;
|
char **retv = NULL;
|
||||||
// Open file.
|
// Open file.
|
||||||
FILE *fd = g_fopen ( filename, "r" );
|
FILE *fd = g_fopen ( filename, "r" );
|
||||||
|
@ -285,19 +323,7 @@ char ** history_get_list ( const char *filename, unsigned int *length )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Get list.
|
// Get list.
|
||||||
list = __history_get_element_list ( fd, length );
|
retv = __history_get_element_list_fields ( fd, length );
|
||||||
|
|
||||||
// Copy list in right format.
|
|
||||||
// Lists are always short, so performance should not be an issue.
|
|
||||||
if ( ( *length ) > 0 ) {
|
|
||||||
retv = g_malloc ( ( ( *length ) + 1 ) * sizeof ( char * ) );
|
|
||||||
for ( unsigned int iter = 0; iter < ( *length ); iter++ ) {
|
|
||||||
retv[iter] = ( list[iter]->name );
|
|
||||||
g_free ( list[iter] );
|
|
||||||
}
|
|
||||||
retv[( *length )] = NULL;
|
|
||||||
g_free ( list );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close file, if fails let user know on stderr.
|
// Close file, if fails let user know on stderr.
|
||||||
if ( fclose ( fd ) != 0 ) {
|
if ( fclose ( fd ) != 0 ) {
|
||||||
|
|
Loading…
Reference in a new issue