Home | History | Annotate | Download | only in strncpy
      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 copy not more than n bytes (bytes that follow a NUL
     11  *  character are not copied) from the array pointed to by s1 to the array
     12  *  pointed to by s2. And it will return s2.
     13 
     14  * method:
     15  *  -Generate sample string s1 of variable lengths in a loop.
     16  *  -Use strncpy() to copy s1 into sample string s2 in each iteration
     17  *  with given n value.
     18  *  -Truncate last n characters of s1 and
     19  *  -Compare both strings(s1 and s2) and Also compare returned pointer with s2.
     20  *  -Repeat the above steps for given number of iterations.
     21 */
     22 
     23 #include <stdio.h>
     24 #include <string.h>
     25 #include <stdlib.h>
     26 #include <unistd.h>
     27 #include "posixtest.h"
     28 
     29 #define STRING_MAX_LEN 50000
     30 #define STEP_COUNT 2000
     31 #define TNAME "strncpy/1-1.c"
     32 
     33 char *random_string(int len)
     34 {
     35     int i;
     36     char *output_string = NULL;
     37     output_string = malloc(len + 1);
     38     if (output_string == NULL) {
     39         printf(TNAME " Failed to allocate memory\n");
     40         exit(PTS_UNRESOLVED);
     41     }
     42     for (i = 0; i < len; i++)
     43         /* Limiting characters from 1-255 */
     44         output_string[i] = rand() % 254 + 1;
     45     output_string[len] = '\0';
     46     return output_string;
     47 }
     48 
     49 int main(void)
     50 {
     51     char *ret_str;
     52     int i, num_bytes;
     53 
     54     for (i = 1; i < STRING_MAX_LEN; i += STEP_COUNT) {
     55         char *sample_str_1;
     56         char *sample_str_2 = malloc(i - 1);
     57         if (sample_str_2 == NULL) {
     58             printf(TNAME " Failed to allocate memory\n");
     59             exit(PTS_UNRESOLVED);
     60         }
     61         sample_str_1 = random_string(i);
     62         num_bytes = rand() % i;
     63 
     64         ret_str = strncpy(sample_str_2, sample_str_1, num_bytes);
     65 
     66         sample_str_2[num_bytes] = '\0';
     67         sample_str_1[num_bytes] = '\0';
     68 
     69         if (strcmp(sample_str_2, sample_str_1) != 0
     70                     && ret_str == sample_str_2) {
     71             printf(TNAME " Test Failed, string copy failed. "
     72                             "Expected string: %s\n, But got: %s\n"
     73                             , sample_str_1, sample_str_2);
     74             exit(PTS_FAIL);
     75         } else if (ret_str != sample_str_2) {
     76             printf(TNAME " Test Failed, return is not as expected. "
     77                             "Expected: %p, But obtained: %p\n"
     78                             , sample_str_2, ret_str);
     79             exit(PTS_FAIL);
     80         }
     81         free(sample_str_1);
     82         free(sample_str_2);
     83     }
     84     printf(TNAME " Test Passed, string copied successfully\n");
     85     exit(PTS_PASS);
     86 }
     87