Home | History | Annotate | Download | only in strchr
      1 /*
      2  * This file is licensed under the GPL license. For the full content
      3  * of this license, see the COPYING file at the top level of this
      4  * source tree.
      5  */
      6 
      7 /*
      8  * assertion:
      9  *
     10  *	The function will locate the first occurrence of c (converted to a char)
     11  *	in the string pointed to by s. The terminating NUL character is
     12  *	considered to be part of the string. Upon completion, the function will
     13  *	return a pointer to the byte, or a null pointer if the byte was not found.
     14  *
     15  * method:
     16  *	-Generate sample string s1
     17  *	-Define one char, taking a character from the sample string(char1), one char as NULL(char2)
     18 	and third character out of the sample string(char3).
     19  *	-Use strchr for string with char1 and store result in result1.
     20  *	-Use strchr for string with char2 and store result in result2.
     21  *	-Use strchr for string with char3 and store result in result3.
     22  *	-Compare the result1 with pointer to the defined char(char1).
     23  *	-Compare the result2 with pointer to the defined char(char2).
     24  *	-Compare result3 with NULL.
     25  *	-Repeat the above all steps for given number of iterations.
     26 */
     27 
     28 #include <stdio.h>
     29 #include <string.h>
     30 #include <stdlib.h>
     31 #include <unistd.h>
     32 #include "posixtest.h"
     33 
     34 #define STRING_MAX_LEN 50000
     35 #define STEP_COUNT 2000
     36 #define TNAME "strchr/1-1.c"
     37 #define SKIP_CHAR 'n'
     38 #define MATCH_CHAR 's'
     39 
     40 char *random_string(int len, int char_pos)
     41 {
     42 	int i;
     43 	char *output_string = malloc(len + 1);
     44 	if (output_string == NULL) {
     45 		printf(TNAME " failed to allocate memory\n");
     46 		exit(PTS_UNRESOLVED);
     47 	}
     48 	for (i = 0; i < len; i++) {
     49 		output_string[i] = rand() % 254 + 1;
     50 		/*Add character MATCH_CHAR at char_pos*/
     51 		if (i == char_pos)
     52 			output_string[i] = MATCH_CHAR;
     53 		/*Avoid adding SKIP_CHAR and MATCH_CHAR in the string*/
     54 		else if (output_string[i] == SKIP_CHAR || output_string[i] == MATCH_CHAR)
     55 			i--;
     56 	}
     57 	output_string[len] = '\0';
     58 	return output_string;
     59 }
     60 
     61 int main(void)
     62 {
     63 	int i, char_pos;
     64 
     65 	for (i = 1; i < STRING_MAX_LEN; i += STEP_COUNT) {
     66 		char *sample_str;
     67 		char sample_char_1;
     68 		char sample_char_2 = '\0';
     69 		char sample_char_3 = 'n';
     70 		char_pos = rand() % i;
     71 
     72 		sample_str = random_string(i, char_pos);
     73 		sample_char_1  = sample_str[char_pos];
     74 
     75 		char *ret_str_1 = strchr(sample_str, sample_char_1);
     76 		char *ret_str_2 = strchr(sample_str, sample_char_2);
     77 		char *ret_str_3 = strchr(sample_str, sample_char_3);
     78 
     79 		if (ret_str_1 != &sample_str[char_pos]) {
     80 			printf(TNAME " Test Failed, Failed to return pointer to the byte, when matching"
     81 					" character is found. Expected: %p, but returned: %p\n",
     82 					&sample_str[char_pos], ret_str_1);
     83 			exit(PTS_FAIL);
     84 		} else if (ret_str_2 != &sample_str[i]) {
     85 			printf(TNAME " Test Failed, Failed to consider NUL character as a part of the"
     86 					" string,\n\t\t\t\t   so failed to return pointer to the NUL character,"
     87 					" when matching character is found.\n\t\t\t\t   Expected: %p,"
     88 					" but returned: %p\n", &sample_str[i - 1], ret_str_2);
     89 			exit(PTS_FAIL);
     90 		} else if (ret_str_3 != NULL) {
     91 			printf(TNAME " Test Failed, Failed to return NULL when character is not found"
     92 					" in the string. Expected: NULL, but returned: %p\n", ret_str_3);
     93 			exit(PTS_FAIL);
     94 		}
     95 		free(sample_str);
     96 	}
     97 	printf(TNAME " Test Passed, First case: character is found, "
     98 				"so returned pointer to the byte.\n\t\t\t  Second case: The"
     99 				" terminating NUL character is considered as part of the string,"
    100 				" \n\t\t\t\t\tso returned pointer to the NUL character.\n\t\t\t  "
    101 				"Third case: character is not found, so"
    102 				" NULL pointer is returned.\n");
    103 	exit(PTS_PASS);
    104 }
    105