Author: hbelusca Date: Sun Mar 29 22:26:24 2015 New Revision: 66972
URL: http://svn.reactos.org/svn/reactos?rev=66972&view=rev Log: [SORT] - Don't leak memory, see CORE-8205 for more details. - Replace tabs with spaces.
Modified: trunk/reactos/base/applications/cmdutils/sort/sort.c
Modified: trunk/reactos/base/applications/cmdutils/sort/sort.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/cmdutils/... ============================================================================== --- trunk/reactos/base/applications/cmdutils/sort/sort.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/cmdutils/sort/sort.c [iso-8859-1] Sun Mar 29 22:26:24 2015 @@ -1,60 +1,61 @@ /* -* SORT - reads line of a file and sorts them in order -* Copyright 1995 Jim Lynch -* -* Adapted for ReactOS -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ + * SORT - reads line of a file and sorts them in order + * Copyright 1995 Jim Lynch + * + * Adapted for ReactOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */
+#include <stdio.h> #include <stdlib.h> -#include <stdio.h> #include <string.h> #include <malloc.h>
-#define MAXRECORDS 65536 /* maximum number of records that can be - * sorted */ -#define MAXLEN 4095 /* maximum record length */ +#define MAXRECORDS 65536 /* maximum number of records that can be sorted */ +#define MAXLEN 4095 /* maximum record length */
-int rev; /* reverse flag */ -int help; /* help flag */ -int sortcol; /* sort column */ -int err = 0; /* error counter */ +int rev; /* reverse flag */ +int help; /* help flag */ +int sortcol; /* sort column */ +int err = 0; /* error counter */
int cmpr(const void *a, const void *b) { - char *A, *B; + char *A, *B;
A = *(char **) a; B = *(char **) b;
- if (sortcol > 0) { - if (strlen(A) > sortcol) - A += sortcol; - else - A = ""; - if (strlen(B) > sortcol) - B += sortcol; - else - B = ""; + if (sortcol > 0) + { + if (strlen(A) > sortcol) + A += sortcol; + else + A = ""; + if (strlen(B) > sortcol) + B += sortcol; + else + B = ""; } + if (!rev) - return strcmp(A, B); + return strcmp(A, B); else - return strcmp(B, A); + return strcmp(B, A); }
void @@ -62,79 +63,126 @@ { fputs("SORT\n", stderr); fputs("Sorts input and writes output to a file, console or a device.\n", stderr); + if (err) - fputs("Invalid parameter\n", stderr); + fputs("Invalid parameter\n", stderr); + fputs(" SORT [options] < [drive:1][path1]file1 > [drive2:][path2]file2\n", stderr); fputs(" Command | SORT [options] > [drive:][path]file\n", stderr); fputs(" Options:\n", stderr); - fputs(" /R Reverse order\n", stderr); - fputs(" /+n Start sorting with column n\n", stderr); - fputs(" /? Help\n", stderr); + fputs(" /R Reverse order\n", stderr); + fputs(" /+n Start sorting with column n\n", stderr); + fputs(" /? Help\n", stderr); }
int main(int argc, char **argv) { - char temp[MAXLEN + 1]; - char **list; - char *cp; /* option character pointer */ - int nr; - int i; - + char temp[MAXLEN + 1]; + char **list; + char *cp; /* option character pointer */ + int nr; + int i;
sortcol = 0; rev = 0; - while (--argc) { - if (*(cp = *++argv) == '/') { - switch (cp[1]) { - case 'R': - case 'r': - rev = 1; - break; - case '?': - case 'h': - case 'H': - help = 1; - break; - case '+': - sortcol = atoi(cp + 1); - if (sortcol) - sortcol--; - break; - default: - err++; - } - } + while (--argc) + { + if (*(cp = *++argv) == '/') + { + switch (cp[1]) + { + case 'R': + case 'r': + rev = 1; + break; + + case '?': + case 'h': + case 'H': + help = 1; + break; + + case '+': + sortcol = atoi(cp + 1); + if (sortcol) + sortcol--; + break; + + default: + err++; + } + } } - if (err || help) { - usage(); - exit(1); + + if (err || help) + { + usage(); + exit(1); } + list = (char **) malloc(MAXRECORDS * sizeof(char *)); - if (list == NULL) { + if (list == NULL) + { fputs("SORT: Insufficient memory\n", stderr); exit(3); } - for (nr = 0; nr < MAXRECORDS; nr++) { - if (fgets(temp, MAXLEN, stdin) == NULL) - break; - if(strlen(temp)) - temp[strlen(temp)-1]='\0'; - list[nr] = (char *) malloc(strlen(temp) + 1); - if (list[nr] == NULL) { - fputs("SORT: Insufficient memory\n", stderr); - exit(3); - } - strcpy(list[nr], temp); + + for (nr = 0; nr < MAXRECORDS; nr++) + { + if (fgets(temp, MAXLEN, stdin) == NULL) + break; + + if(strlen(temp)) + temp[strlen(temp)-1]='\0'; + + list[nr] = (char *) malloc(strlen(temp) + 1); + if (list[nr] == NULL) + { + fputs("SORT: Insufficient memory\n", stderr); + + /* Cleanup memory */ + for (i = 0; i < nr; i++) + { + free(list[i]); + } + free(list); + + exit(3); + } + + strcpy(list[nr], temp); } - if (nr == MAXRECORDS) { - fputs("SORT: number of records exceeds maximum\n", stderr); - exit(4); + + if (nr == MAXRECORDS) + { + fputs("SORT: number of records exceeds maximum\n", stderr); + + /* Cleanup memory */ + for (i = 0; i < nr; i++) + { + free(list[i]); + } + free(list); + + /* Bail out */ + exit(4); } + qsort((void *) list, nr, sizeof(char *), cmpr); - for (i = 0; i < nr; i++) { - fputs(list[i], stdout); - fputs("\n",stdout); + + for (i = 0; i < nr; i++) + { + fputs(list[i], stdout); + fputs("\n",stdout); } + + /* Cleanup memory */ + for (i = 0; i < nr; i++) + { + free(list[i]); + } + free(list); + return 0; }