1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include "npserver.h"
int NP_Server::sort_server( char *server )
{
char buffer[ 1024 ], second_buffer[ 1024 ],
**array, *test, *home;
FILE *newsrc, *temp;
int length;
unsigned int count, i;
snprintf( buffer, sizeof buffer, "%s/.peruser4-newsrc",
home = getenv( "HOME" ));
if (( newsrc = fopen( buffer, "r" )) == NULL )
{
snprintf( error_message, sizeof error_message,
"NP_Server: sort_server(): fopen() returned error: %s.",
strerror( errno ));
return 1;
}
strcat( buffer, ".tmp" );
if (( temp = fopen( buffer, "w" )) == NULL )
{
fclose( newsrc );
snprintf( error_message, sizeof error_message,
"NP_Server: sort_server(): fopen() returned error: %s.",
strerror( errno ));
return 1;
}
length = strlen( server );
while( ( test = fgets( buffer, sizeof buffer, newsrc )) != NULL )
if ( !strncmp( buffer, server, length ))
break;
if ( test == NULL )
{
fclose( newsrc );
fclose( temp );
strcpy( error_message,
"NP_Server: sort_server(): "
"no such server in ~/.peruser4-newsrc" );
return 1;
}
count = 0;
while( fgets( buffer, sizeof buffer, newsrc ) != NULL )
{
if ( !isspace( buffer[ 0 ] ))
break;
++count;
}
if (( array = ( char **)calloc( count, sizeof *array )) == NULL )
{
perror( "calloc" );
exit( 1 );
}
rewind( newsrc );
while( fgets( buffer, sizeof buffer, newsrc ) != NULL )
if ( !strncmp( buffer, server, length ))
break;
for( i = 0; i < count; ++i )
{
fgets( buffer, sizeof buffer, newsrc );
if (( array[ i ]
= ( char *)malloc( strlen(
buffer + ( length =
strspn( buffer, " \t" )))))
== NULL )
{
perror( "malloc" );
exit( 1 );
}
strcpy( array[ i ], strtok( buffer + length, "\n" ));
}
qsort( array, count, sizeof *array, compare );
rewind( newsrc );
length = strlen( server );
while( fgets( buffer, sizeof buffer, newsrc ) != NULL )
{
fputs( buffer, temp );
if ( !strncmp( buffer, server, length ))
break;
}
for( i = 0; i < count; ++i )
{
fprintf( temp, "\t%s\n", array[ i ] );
free( array[ i ] );
}
free( array );
for( i = 0; i < count; ++i )
fgets( buffer, sizeof buffer, newsrc );
while( fgets( buffer, sizeof buffer, newsrc ) != NULL )
fputs( buffer, temp );
fclose( newsrc );
fclose( temp );
snprintf( buffer, sizeof buffer, "%s/.peruser4-newsrc", home );
strcpy( second_buffer, buffer );
strcat( second_buffer, ".tmp" );
rename( second_buffer, buffer );
return 0;
}
|