blob: 9dcf3ecdac3320bd6a74179569107360224d21b0 [file] [log] [blame]
/*
*
* Copyright (c) International Business Machines Corp., 2002
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* 01/02/2003 Port to LTP avenkat@us.ibm.com */
/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
/*
* NAME
* string01.c - check string functions.
*
* CALLS
* strchr, strrchr, strcat, strcmp, strcpy, strlen,
* strncat, strncmp, strncpy
*
* ALGORITHM
* Test functionality of the string functions:
* (strchr, strrchr, strcat, strcmp, strcpy, strlen,
* strncat, strncmp, strncpy )
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
/***** LTP Port *****/
#include <errno.h>
#include <stdlib.h>
#include "test.h"
#define FAILED 0
#define PASSED 1
char *TCID = "string01";
int local_flag = PASSED;
int block_number;
FILE *temp;
int TST_TOTAL = 1;
/***** ** ** *****/
#define LONGSTR (96*1024-1)
/* #define LONGSTR (1024-1) */
/*
* Miscellaneous data strings for testing.
*/
char tiat[] = "This is a test of the string functions. ";
char yat[] = "This is yet another test.";
char tiatyat[] =
"This is a test of the string functions. This is yet another test.";
char longstr[LONGSTR + 1]; /* a very long string */
char dst0[LONGSTR + 1]; /* place holders for various tests */
char dst1[LONGSTR + 1];
char dst2[LONGSTR + 1];
/*
* Data structures for testing.
*/
/* Strlen (strlen( s ) == e_res) */
struct t_strlen {
char *s;
int e_res;
} t_len[] = {
{
"", 0}, {
"12345", 5}, {
tiat, 41}, {
longstr, LONGSTR}, {
NULL, 0}
};
/* Index (index( s, c ) == e_res) */
struct t_index {
char *s;
char c;
char *e_res;
} t_index[] = {
{
"", 'z', NULL}, {
tiat, 'a', tiat + 8}, {
tiat, 's', tiat + 3}, {
tiat, 'o', tiat + 15}, {
tiat, 'z', NULL}, {
NULL, 0, NULL}
};
/* Rindex (rindex( s, c ) == e_res) */
struct t_rindex {
char *s;
char c;
char *e_res;
} t_rindex[] = {
{
"", 'z', NULL}, {
tiat, 'a', tiat + 8}, {
tiat, 's', tiat + 37}, {
tiat, 'o', tiat + 35}, {
tiat, 'z', NULL}, {
NULL, 0, NULL}
};
/* Strcmp (strcmp( s1, s2 ) == e_res) */
struct t_strcmp {
char *s1;
char *s2;
int e_res;
} t_cmp[] = {
{
"", "", 0}, {
"", tiat, -((int)'T')}, {
tiat, "", 'T'}, {
tiat, tiat, 0}, {
yat, tiat, 'y' - 'a'}, {
NULL, NULL, 0}
};
/* Strcat (strcmp( strcat(s1, s2), s1s2 ) == e_res) */
/* ASSUMES strcmp is working -- it is tested prior to strcat */
struct t_strcat {
char *s1;
char *s2;
char *s1s2;
int e_res;
} t_cat[] = {
{
dst0, "", "", 0}, {
dst0, tiat, tiat, 0}, {
dst0, "", tiat, 0}, {
dst0, yat, tiatyat, 0}, {
dst1, longstr, longstr, 0}, {
NULL, NULL, NULL, 0}
};
/* Strcpy (strcmp( strcpy(s1, s2), s1s2 ) == e_res) */
/* ASSUMES strcmp is working -- it is tested prior to strcpy */
/* No overlapping copies are tested */
struct t_strcpy {
char *s1;
char *s2;
int e_res;
} t_cpy[] = {
{
dst0, "", 0}, {
dst0, tiat, 0}, {
dst0, longstr, 0}, {
NULL, NULL, 0}
};
/* Strncmp (strncmp( s1, s2 ) == e_res) */
struct t_strncmp {
char *s1;
char *s2;
int n;
int e_res;
int a_res; /* Allowable results, some platforms only return 1 or -1 */
} t_ncmp[] = {
{
"", "", 0, 0, 0}, {
"", "", 80, 0, 0}, {
tiat, "", 0, 0, 0}, {
"", tiat, 80, -((int)'T'), -1}, {
tiat, "", 80, 'T', 1}, {
tiat, tiat, 80, 0, 0}, {
yat, tiat, 80, 'y' - 'a', 1}, {
yat, tiat, 8, 0, 1}, {
yat, tiat, 9, 'y' - 'a', 1}, {
NULL, NULL, 0, 0, 0}
};
/* Strncat (strcmp( strncat(s1, s2, n), s1ns2 ) == e_res) */
/* ASSUMES strcmp is working -- it is tested prior to strncat */
/* dest is guaranteed to be all '\0' s at start of test */
struct t_strncat {
char *s1;
char *s2;
int n;
char *s1ns2;
int e_res;
} t_ncat[] = {
/* Regular strcat stuff -- i.e., n is large enough */
{
dst0, "", LONGSTR, "", 0}, {
dst0, tiat, LONGSTR, tiat, 0}, {
dst0, "", LONGSTR, tiat, 0}, {
dst0, yat, LONGSTR, tiatyat, 0}, {
dst1, longstr, LONGSTR, longstr, 0},
/* Restricted strcat stuff */
{
dst2, longstr, 0, "", 0}, {
dst2, longstr, 1, "t", 0}, {
dst2, longstr, LONGSTR - 1, longstr, 0}, {
NULL, NULL, 0, NULL, 0}
};
/* Strncpy (strcmp( strncpy(s1, s2), s1n ) == e_res) */
/* ASSUMES strcmp is working -- it is tested prior to strncpy */
/* No overlapping copies are tested */
struct t_strncpy {
char *s1;
char *s2;
int n;
char *s1n;
int e_res;
} t_ncpy[] = {
/* Regular strcpy stuff -- i.e., n is large enough */
{
dst0, "", LONGSTR, "", 0}, {
dst0, tiat, LONGSTR, tiat, 0}, {
dst0, longstr, LONGSTR, longstr, 0},
/* Restricted strcpy stuff */
{
dst1, tiat, 0, "", 0}, {
dst1, longstr, 5, "ttttt", 0}, {
NULL, NULL, 0, NULL, 0}
};
/***** LTP Port *****/
void setup();
int blenter();
int blexit();
int anyfail();
void setup(void)
{
temp = stderr;
}
int blenter(void)
{
local_flag = PASSED;
return 0;
}
int blexit(void)
{
(local_flag == PASSED) ? tst_resm(TPASS,
"Test passed") : tst_resm(TFAIL,
"Test failed");
return 0;
}
int anyfail(void)
{
tst_exit();
}
/***** ** ** *****/
/*--------------------------------------------------------------*/
int main(int argc, char *argv[])
{
register int n, i;
char *s, *pr;
/*
* Init longstr
*/
s = longstr;
n = LONGSTR;
while (n--)
*s++ = 't';
*s = '\0';
setup();
/*--------------------------------------------------------------*/
/*
* Index
*/
//fprintf(temp, "\tStrchr\n" );
i = 0;
while (t_index[i].s) {
if ((pr =
strchr(t_index[i].s, t_index[i].c)) != t_index[i].e_res) {
fprintf(temp, "(Strchr) test %d", i);
local_flag = FAILED;
}
i++;
}
/*
* Strrchr
*/
//fprintf(temp, "\tStrrchr\n" );
i = 0;
while (t_rindex[i].s) {
if ((pr = strrchr(t_rindex[i].s, t_rindex[i].c))
!= t_rindex[i].e_res) {
fprintf(temp, "(Strrchr) test %d", i);
local_flag = FAILED;
}
i++;
}
/*
* Strlen
*/
//fprintf(temp, "\tStrlen\n" );
i = 0;
while (t_len[i].s) {
if ((n = strlen(t_len[i].s)) != t_len[i].e_res) {
fprintf(temp, "(Strlen) test %d: expected %d, got %d",
i, t_len[i].e_res, n);
local_flag = FAILED;
}
i++;
}
/*
* Strcmp
*/
//fprintf(temp, "\tStrcmp\n" );
i = 0;
#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
while (t_cmp[i].s1) {
n = strcmp(t_cmp[i].s1, t_cmp[i].s2);
if (sign(n) != sign(t_cmp[i].e_res)) {
fprintf(temp, "(Strcmp) test %d: expected %d, got %d",
i, sign(t_cmp[i].e_res), sign(n));
local_flag = FAILED;
}
i++;
}
/*
* Strcat
*/
//fprintf(temp, "\tStrcat\n" );
memset(dst0, 0, LONGSTR + 1); /* clean slate */
memset(dst1, 0, LONGSTR + 1); /* clean slate */
i = 0;
while (t_cat[i].s1) {
if ((n =
strcmp(strcat(t_cat[i].s1, t_cat[i].s2), t_cat[i].s1s2))
!= t_cat[i].e_res) {
fprintf(temp, "(Strcat) test %d: expected %d, got %d",
i, t_cat[i].e_res, n);
local_flag = FAILED;
}
i++;
}
/*
* Strcpy
*/
//fprintf(temp, "\tStrcpy\n" );
i = 0;
while (t_cpy[i].s1) {
if ((n = strcmp(strcpy(t_cpy[i].s1, t_cpy[i].s2), t_cpy[i].s2))
!= t_cpy[i].e_res) {
fprintf(temp, "(Strcpy) test %d: expected %d, got %d",
i, t_cpy[i].e_res, n);
local_flag = FAILED;
}
i++;
}
/*
* Strncat
*/
//fprintf(temp, "\tStrncat\n" );
memset(dst0, 0, LONGSTR + 1); /* clean slate */
memset(dst1, 0, LONGSTR + 1); /* clean slate */
memset(dst2, 0, LONGSTR + 1); /* clean slate */
i = 0;
while (t_ncat[i].s1) {
if ((n =
strcmp(strncat(t_ncat[i].s1, t_ncat[i].s2, t_ncat[i].n),
t_ncat[i].s1ns2)) != t_ncat[i].e_res) {
fprintf(temp, "(Strncat) test %d: expected %d, got %d",
i, t_ncat[i].e_res, n);
local_flag = FAILED;
}
i++;
}
/*
* Strncmp
*/
//fprintf(temp, "\tStrncmp\n" );
i = 0;
while (t_ncmp[i].s1) {
if ((n = strncmp(t_ncmp[i].s1, t_ncmp[i].s2, t_ncmp[i].n))
!= t_ncmp[i].e_res) {
if ((t_ncmp[i].a_res < 0 && n > t_ncmp[i].a_res)
|| (t_ncmp[i].a_res > 0 && n < t_ncmp[i].a_res)) {
fprintf(temp,
"(Strncmp) test %d: expected %d, got %d",
i, t_ncmp[i].e_res, n);
local_flag = FAILED;
}
}
i++;
}
/*
* Strncpy
*/
//fprintf(temp, "\tStrncpy\n" );
i = 0;
memset(dst0, 0, LONGSTR + 1); /* clean slate */
memset(dst1, 0, LONGSTR + 1); /* clean slate */
while (t_ncpy[i].s1) {
if ((n =
strcmp(strncpy(t_ncpy[i].s1, t_ncpy[i].s2, t_ncpy[i].n),
t_ncpy[i].s1n)) != t_ncpy[i].e_res) {
fprintf(temp, "(Strncpy) test %d: expected %d, got %d",
i, t_ncpy[i].e_res, n);
local_flag = FAILED;
}
i++;
}
blexit();
anyfail();
tst_exit();
}