mirror of
git://git.psyc.eu/libpsyc
synced 2024-08-15 03:19:02 +00:00
indent
This commit is contained in:
parent
aee9203df6
commit
1cc58abd0e
31 changed files with 2797 additions and 2759 deletions
370
test/test.c
370
test/test.c
|
@ -30,236 +30,244 @@
|
|||
// cmd line args
|
||||
extern uint8_t verbose, stats;
|
||||
|
||||
void check_range(char c, const char *s, int min, int max) {
|
||||
int n = atoi(s);
|
||||
if (n < min) {
|
||||
printf("-%c: error, should be >= %d\n", c, min);
|
||||
exit(-1);
|
||||
}
|
||||
if (max > min && n > max) {
|
||||
printf("-%c: error, should be <= %d\n", c, max);
|
||||
exit(-1);
|
||||
}
|
||||
void
|
||||
check_range (char c, const char *s, int min, int max)
|
||||
{
|
||||
int n = atoi(s);
|
||||
if (n < min) {
|
||||
printf("-%c: error, should be >= %d\n", c, min);
|
||||
exit(-1);
|
||||
}
|
||||
if (max > min && n > max) {
|
||||
printf("-%c: error, should be <= %d\n", c, max);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
// get sockaddr, IPv4 or IPv6:
|
||||
void *get_in_addr (struct sockaddr *sa) {
|
||||
if (sa->sa_family == AF_INET)
|
||||
return &(((struct sockaddr_in*)sa)->sin_addr);
|
||||
void *
|
||||
get_in_addr (struct sockaddr *sa)
|
||||
{
|
||||
if (sa->sa_family == AF_INET)
|
||||
return &(((struct sockaddr_in*)sa)->sin_addr);
|
||||
|
||||
return &(((struct sockaddr_in6*)sa)->sin6_addr);
|
||||
return &(((struct sockaddr_in6*)sa)->sin6_addr);
|
||||
}
|
||||
|
||||
void test_file(const char* filename, size_t count, size_t recv_buf_size) {
|
||||
char *buf, *recvbuf; // cont buf + recv buf: [ ccrrrr]
|
||||
size_t i, nbytes, size;
|
||||
struct timeval start, end;
|
||||
struct stat st;
|
||||
void
|
||||
test_file (const char* filename, size_t count, size_t recv_buf_size)
|
||||
{
|
||||
char *buf, *recvbuf; // cont buf + recv buf: [ ccrrrr]
|
||||
size_t i, nbytes, size;
|
||||
struct timeval start, end;
|
||||
struct stat st;
|
||||
|
||||
int fd = open(filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror("open");
|
||||
exit(1);
|
||||
}
|
||||
int fd = open(filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror("open");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
fstat(fd, &st);
|
||||
fstat(fd, &st);
|
||||
|
||||
size = CONT_BUF_SIZE + st.st_size;
|
||||
buf = malloc(size);
|
||||
if (!buf) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
}
|
||||
recvbuf = buf + CONT_BUF_SIZE;
|
||||
size = CONT_BUF_SIZE + st.st_size;
|
||||
buf = malloc(size);
|
||||
if (!buf) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
}
|
||||
recvbuf = buf + CONT_BUF_SIZE;
|
||||
|
||||
test_init(0);
|
||||
test_init(0);
|
||||
|
||||
if (recv_buf_size) {
|
||||
if (stats)
|
||||
gettimeofday(&start, NULL);
|
||||
if (recv_buf_size) {
|
||||
if (stats)
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
#ifdef NOREAD
|
||||
memset(buf, 1, size);
|
||||
memset(buf, 1, size);
|
||||
#else
|
||||
size = 0;
|
||||
size = 0;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
for (i = 0; i < count; i++)
|
||||
#ifndef NOREAD
|
||||
while ((nbytes = read(fd, (void*)recvbuf, recv_buf_size)))
|
||||
while ((nbytes = read(fd, (void*)recvbuf, recv_buf_size)))
|
||||
#endif
|
||||
test_input(0, recvbuf, nbytes);
|
||||
test_input(0, recvbuf, nbytes);
|
||||
|
||||
} else {
|
||||
} else {
|
||||
#ifdef NOREAD
|
||||
memset(buf, 1, size);
|
||||
memset(buf, 1, size);
|
||||
#else
|
||||
size = 0;
|
||||
while ((nbytes = read(fd, (void*)recvbuf + size, RECV_BUF_SIZE)))
|
||||
size += nbytes;
|
||||
size = 0;
|
||||
while ((nbytes = read(fd, (void*)recvbuf + size, RECV_BUF_SIZE)))
|
||||
size += nbytes;
|
||||
#endif
|
||||
|
||||
if (stats)
|
||||
gettimeofday(&start, NULL);
|
||||
if (stats)
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
test_input(0, recvbuf, size);
|
||||
}
|
||||
for (i = 0; i < count; i++)
|
||||
test_input(0, recvbuf, size);
|
||||
}
|
||||
|
||||
if (stats) {
|
||||
gettimeofday(&end, NULL);
|
||||
printf("%ld\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec) / 1000);
|
||||
}
|
||||
if (stats) {
|
||||
gettimeofday(&end, NULL);
|
||||
printf("%ld\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec) / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void test_server(const char* port, size_t count, size_t recv_buf_size) {
|
||||
char buf[CONT_BUF_SIZE + RECV_BUF_SIZE]; // cont buf + recv buf: [ ccrrrr]
|
||||
char *recvbuf = buf + CONT_BUF_SIZE; // recv buf: ^^^^
|
||||
void
|
||||
test_server (const char* port, size_t count, size_t recv_buf_size)
|
||||
{
|
||||
char buf[CONT_BUF_SIZE + RECV_BUF_SIZE]; // cont buf + recv buf: [ ccrrrr]
|
||||
char *recvbuf = buf + CONT_BUF_SIZE; // recv buf: ^^^^
|
||||
|
||||
fd_set master; // master file descriptor list
|
||||
fd_set read_fds; // temp file descriptor list for select()
|
||||
int fdmax; // maximum file descriptor number
|
||||
fd_set master; // master file descriptor list
|
||||
fd_set read_fds; // temp file descriptor list for select()
|
||||
int fdmax; // maximum file descriptor number
|
||||
|
||||
int listener; // listening socket descriptor
|
||||
int newfd; // newly accept()ed socket descriptor
|
||||
struct sockaddr_storage remoteaddr; // client address
|
||||
socklen_t addrlen;
|
||||
size_t nbytes;
|
||||
int listener; // listening socket descriptor
|
||||
int newfd; // newly accept()ed socket descriptor
|
||||
struct sockaddr_storage remoteaddr; // client address
|
||||
socklen_t addrlen;
|
||||
size_t nbytes;
|
||||
|
||||
char remoteIP[INET6_ADDRSTRLEN];
|
||||
char remoteIP[INET6_ADDRSTRLEN];
|
||||
|
||||
int yes = 1; // for setsockopt() SO_REUSEADDR, below
|
||||
int i, rv, ret;
|
||||
int yes = 1; // for setsockopt() SO_REUSEADDR, below
|
||||
int i, rv, ret;
|
||||
|
||||
struct addrinfo hints, *ai, *p;
|
||||
struct timeval start[NUM_PARSERS], end[NUM_PARSERS];
|
||||
struct addrinfo hints, *ai, *p;
|
||||
struct timeval start[NUM_PARSERS], end[NUM_PARSERS];
|
||||
|
||||
FD_ZERO(&master); // clear the master and temp sets
|
||||
FD_ZERO(&read_fds);
|
||||
FD_ZERO(&master); // clear the master and temp sets
|
||||
FD_ZERO(&read_fds);
|
||||
|
||||
// get us a socket and bind it
|
||||
memset(&hints, 0, sizeof hints);
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
if ((rv = getaddrinfo(NULL, port, &hints, &ai)) != 0) {
|
||||
fprintf(stderr, "error: %s\n", gai_strerror(rv));
|
||||
exit(1);
|
||||
}
|
||||
// get us a socket and bind it
|
||||
memset(&hints, 0, sizeof hints);
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
if ((rv = getaddrinfo(NULL, port, &hints, &ai)) != 0) {
|
||||
fprintf(stderr, "error: %s\n", gai_strerror(rv));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (p = ai; p != NULL; p = p->ai_next) {
|
||||
listener = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
|
||||
if (listener < 0)
|
||||
continue;
|
||||
for (p = ai; p != NULL; p = p->ai_next) {
|
||||
listener = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
|
||||
if (listener < 0)
|
||||
continue;
|
||||
|
||||
// lose the pesky "address already in use" error message
|
||||
setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
|
||||
// lose the pesky "address already in use" error message
|
||||
setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
|
||||
|
||||
if (bind(listener, p->ai_addr, p->ai_addrlen) < 0) {
|
||||
close(listener);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
if (bind(listener, p->ai_addr, p->ai_addrlen) < 0) {
|
||||
close(listener);
|
||||
continue;
|
||||
}
|
||||
|
||||
// if we got here, it means we didn't get bound
|
||||
if (p == NULL) {
|
||||
fprintf(stderr, "failed to bind\n");
|
||||
exit(2);
|
||||
break;
|
||||
}
|
||||
|
||||
// if we got here, it means we didn't get bound
|
||||
if (p == NULL) {
|
||||
fprintf(stderr, "failed to bind\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
freeaddrinfo(ai); // all done with this
|
||||
|
||||
// listen
|
||||
if (listen(listener, 10) == -1) {
|
||||
perror("listen");
|
||||
exit(3);
|
||||
}
|
||||
|
||||
printf("# Listening on TCP port %s\n", port);
|
||||
|
||||
// add the listener to the master set
|
||||
FD_SET(listener, &master);
|
||||
|
||||
// keep track of the biggest file descriptor
|
||||
fdmax = listener; // so far, it's this one
|
||||
|
||||
// main loop
|
||||
for (;;) {
|
||||
read_fds = master; // copy it
|
||||
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
|
||||
perror("select");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
freeaddrinfo(ai); // all done with this
|
||||
// run through the existing connections looking for data to read
|
||||
for (i = 0; i <= fdmax; i++) {
|
||||
if (FD_ISSET(i, &read_fds)) { // we got one!!
|
||||
if (i == listener) {
|
||||
// handle new connections
|
||||
if (fdmax == NUM_PARSERS - 1)
|
||||
continue; // ignore if there's too many
|
||||
|
||||
// listen
|
||||
if (listen(listener, 10) == -1) {
|
||||
perror("listen");
|
||||
exit(3);
|
||||
}
|
||||
addrlen = sizeof remoteaddr;
|
||||
newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen);
|
||||
|
||||
printf("# Listening on TCP port %s\n", port);
|
||||
if (newfd == -1) {
|
||||
perror("accept");
|
||||
} else {
|
||||
FD_SET(newfd, &master); // add to master set
|
||||
if (newfd > fdmax) // keep track of the max
|
||||
fdmax = newfd;
|
||||
|
||||
// add the listener to the master set
|
||||
FD_SET(listener, &master);
|
||||
test_init(newfd);
|
||||
|
||||
// keep track of the biggest file descriptor
|
||||
fdmax = listener; // so far, it's this one
|
||||
if (verbose)
|
||||
printf("# New connection from %s on socket %d\n",
|
||||
inet_ntop(remoteaddr.ss_family,
|
||||
get_in_addr((struct sockaddr*)&remoteaddr),
|
||||
remoteIP, INET6_ADDRSTRLEN),
|
||||
newfd);
|
||||
|
||||
// main loop
|
||||
for (;;) {
|
||||
read_fds = master; // copy it
|
||||
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
|
||||
perror("select");
|
||||
exit(4);
|
||||
}
|
||||
if (stats)
|
||||
gettimeofday(&start[newfd], NULL);
|
||||
}
|
||||
} else {
|
||||
// handle data from a client
|
||||
if ((nbytes = recv(i, recvbuf, recv_buf_size, 0)) <= 0) {
|
||||
if (stats)
|
||||
printf("%ld ms\n", (end[i].tv_sec * 1000000 + end[i].tv_usec - start[i].tv_sec * 1000000 - start[i].tv_usec) / 1000);
|
||||
|
||||
// run through the existing connections looking for data to read
|
||||
for (i = 0; i <= fdmax; i++) {
|
||||
if (FD_ISSET(i, &read_fds)) { // we got one!!
|
||||
if (i == listener) {
|
||||
// handle new connections
|
||||
if (fdmax == NUM_PARSERS - 1)
|
||||
continue; // ignore if there's too many
|
||||
// got error or connection closed by client
|
||||
if (nbytes == 0) { // connection closed
|
||||
if (verbose)
|
||||
printf("# Socket %d hung up\n", i);
|
||||
} else {
|
||||
perror("recv");
|
||||
}
|
||||
|
||||
addrlen = sizeof remoteaddr;
|
||||
newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen);
|
||||
close(i); // bye!
|
||||
FD_CLR(i, &master); // remove from master set
|
||||
} else {
|
||||
// we got some data from a client
|
||||
if (verbose >= 2)
|
||||
printf("> %ld bytes\n", nbytes);
|
||||
if (verbose >= 3)
|
||||
printf("> [%.*s]", (int)nbytes, recvbuf);
|
||||
|
||||
if (newfd == -1) {
|
||||
perror("accept");
|
||||
} else {
|
||||
FD_SET(newfd, &master); // add to master set
|
||||
if (newfd > fdmax) // keep track of the max
|
||||
fdmax = newfd;
|
||||
ret = test_input(i, recvbuf, nbytes);
|
||||
|
||||
test_init(newfd);
|
||||
if (stats)
|
||||
gettimeofday(&end[i], NULL);
|
||||
|
||||
if (verbose)
|
||||
printf("# New connection from %s on socket %d\n",
|
||||
inet_ntop(remoteaddr.ss_family,
|
||||
get_in_addr((struct sockaddr*)&remoteaddr),
|
||||
remoteIP, INET6_ADDRSTRLEN),
|
||||
newfd);
|
||||
|
||||
if (stats)
|
||||
gettimeofday(&start[newfd], NULL);
|
||||
}
|
||||
} else {
|
||||
// handle data from a client
|
||||
if ((nbytes = recv(i, recvbuf, recv_buf_size, 0)) <= 0) {
|
||||
if (stats)
|
||||
printf("%ld ms\n", (end[i].tv_sec * 1000000 + end[i].tv_usec - start[i].tv_sec * 1000000 - start[i].tv_usec) / 1000);
|
||||
|
||||
// got error or connection closed by client
|
||||
if (nbytes == 0) { // connection closed
|
||||
if (verbose)
|
||||
printf("# Socket %d hung up\n", i);
|
||||
} else {
|
||||
perror("recv");
|
||||
}
|
||||
|
||||
close(i); // bye!
|
||||
FD_CLR(i, &master); // remove from master set
|
||||
} else {
|
||||
// we got some data from a client
|
||||
if (verbose >= 2)
|
||||
printf("> %ld bytes\n", nbytes);
|
||||
if (verbose >= 3)
|
||||
printf("> [%.*s]", (int)nbytes, recvbuf);
|
||||
|
||||
ret = test_input(i, recvbuf, nbytes);
|
||||
|
||||
if (stats)
|
||||
gettimeofday(&end[i], NULL);
|
||||
|
||||
if (ret < 0) {
|
||||
if (verbose)
|
||||
printf("# Closing connection: %i\n", i);
|
||||
close(i); // bye!
|
||||
FD_CLR(i, &master); // remove from master set
|
||||
}
|
||||
}
|
||||
} // END handle data from client
|
||||
} // END got new incoming connection
|
||||
} // END looping through file descriptors
|
||||
} // END for(;;)--and you thought it would never end!
|
||||
if (ret < 0) {
|
||||
if (verbose)
|
||||
printf("# Closing connection: %i\n", i);
|
||||
close(i); // bye!
|
||||
FD_CLR(i, &master); // remove from master set
|
||||
}
|
||||
}
|
||||
} // END handle data from client
|
||||
} // END got new incoming connection
|
||||
} // END looping through file descriptors
|
||||
} // END for(;;)--and you thought it would never end!
|
||||
}
|
||||
|
|
18
test/test.h
18
test/test.h
|
@ -42,11 +42,19 @@
|
|||
#define HELP_P " -P\t\t\tShow progress\n"
|
||||
#define HELP_h " -h\t\t\tShow this help\n"
|
||||
|
||||
void test_init(int i);
|
||||
int test_input(int i, char *recvbuf, size_t nbytes);
|
||||
void
|
||||
test_init (int i);
|
||||
|
||||
void test_file(const char* filename, size_t count, size_t recv_buf_size);
|
||||
void test_server(const char* port, size_t count, size_t recv_buf_size);
|
||||
void check_range(char c, const char *s, int min, int max);
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes);
|
||||
|
||||
void
|
||||
test_file (const char* filename, size_t count, size_t recv_buf_size);
|
||||
|
||||
void
|
||||
test_server (const char* port, size_t count, size_t recv_buf_size);
|
||||
|
||||
void
|
||||
check_range (char c, const char *s, int min, int max);
|
||||
|
||||
#endif
|
||||
|
|
147
test/test_json.c
147
test/test_json.c
|
@ -26,88 +26,93 @@ json_object *obj;
|
|||
json_tokener *tok;
|
||||
enum json_tokener_error error;
|
||||
|
||||
void test_init (int i) {
|
||||
tok = json_tokener_new();
|
||||
void
|
||||
test_init (int i)
|
||||
{
|
||||
tok = json_tokener_new();
|
||||
}
|
||||
|
||||
int test_input (int i, char *recvbuf, size_t nbytes) {
|
||||
size_t cursor = 0;
|
||||
int r, ret = 0;
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes)
|
||||
{
|
||||
size_t cursor = 0;
|
||||
int r, ret = 0;
|
||||
|
||||
json_tokener_reset(tok);
|
||||
json_tokener_reset(tok);
|
||||
|
||||
do {
|
||||
obj = json_tokener_parse_ex(tok, recvbuf + cursor, nbytes - cursor);
|
||||
cursor += tok->char_offset;
|
||||
do {
|
||||
obj = json_tokener_parse_ex(tok, recvbuf + cursor, nbytes - cursor);
|
||||
cursor += tok->char_offset;
|
||||
|
||||
if (verbose)
|
||||
printf("#%d\n", tok->err);
|
||||
if (verbose)
|
||||
printf("#%d\n", tok->err);
|
||||
|
||||
switch (tok->err) {
|
||||
case json_tokener_continue:
|
||||
return 0;
|
||||
switch (tok->err) {
|
||||
case json_tokener_continue:
|
||||
return 0;
|
||||
|
||||
case json_tokener_success:
|
||||
if (!no_render) {
|
||||
const char *str = json_object_to_json_string(obj);
|
||||
if (!quiet) {
|
||||
size_t len = strlen(str);
|
||||
if (filename) {
|
||||
r = write(1, str, len);
|
||||
r = write(1, "\n", 1);
|
||||
} else {
|
||||
send(i, str, len, 0);
|
||||
send(i, "\n", 1, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
json_object_put(obj);
|
||||
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
if ((filename && !multiple) || (!filename && single))
|
||||
return -1;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("parse error\n");
|
||||
exit_code = tok->err;
|
||||
return -1;
|
||||
case json_tokener_success:
|
||||
if (!no_render) {
|
||||
const char *str = json_object_to_json_string(obj);
|
||||
if (!quiet) {
|
||||
size_t len = strlen(str);
|
||||
if (filename) {
|
||||
r = write(1, str, len);
|
||||
r = write(1, "\n", 1);
|
||||
} else {
|
||||
send(i, str, len, 0);
|
||||
send(i, "\n", 1, 0);
|
||||
}
|
||||
}
|
||||
} while (cursor < nbytes);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
json_object_put(obj);
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
int c;
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
if ((filename && !multiple) || (!filename && single))
|
||||
return -1;
|
||||
break;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:mnqsvPSh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_m CASE_n CASE_q CASE_s
|
||||
CASE_v CASE_S CASE_P
|
||||
case 'h':
|
||||
printf(
|
||||
HELP_FILE("test_json", "mnqSsvP")
|
||||
HELP_PORT("test_json", "nqsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_q HELP_S
|
||||
HELP_s HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
default:
|
||||
printf("parse error\n");
|
||||
exit_code = tok->err;
|
||||
return -1;
|
||||
}
|
||||
} while (cursor < nbytes);
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:mnqsvPSh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_m CASE_n CASE_q CASE_s
|
||||
CASE_v CASE_S CASE_P
|
||||
case 'h':
|
||||
printf(HELP_FILE("test_json", "mnqSsvP")
|
||||
HELP_PORT("test_json", "nqsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_q HELP_S
|
||||
HELP_s HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
|
|
@ -24,76 +24,79 @@ int exit_code;
|
|||
JsonParser *parser;
|
||||
JsonGenerator *generator;
|
||||
|
||||
void test_init (int i) {
|
||||
g_type_init();
|
||||
parser = json_parser_new();
|
||||
generator = json_generator_new();
|
||||
void
|
||||
test_init (int i)
|
||||
{
|
||||
g_type_init();
|
||||
parser = json_parser_new();
|
||||
generator = json_generator_new();
|
||||
}
|
||||
|
||||
int test_input (int i, char *recvbuf, size_t nbytes) {
|
||||
JsonNode *root;
|
||||
GError *error = NULL;
|
||||
char *str;
|
||||
size_t len;
|
||||
int r, ret;
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes)
|
||||
{
|
||||
JsonNode *root;
|
||||
GError *error = NULL;
|
||||
char *str;
|
||||
size_t len;
|
||||
int r, ret;
|
||||
|
||||
ret = json_parser_load_from_data(parser, recvbuf, nbytes, &error);
|
||||
ret = json_parser_load_from_data(parser, recvbuf, nbytes, &error);
|
||||
|
||||
if (!ret) {
|
||||
printf("Parse error\n");
|
||||
exit(1);
|
||||
if (!ret) {
|
||||
printf("Parse error\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
root = json_parser_get_root(parser);
|
||||
|
||||
if (!no_render) {
|
||||
json_generator_set_root(generator, root);
|
||||
str = json_generator_to_data(generator, &len);;
|
||||
if (!quiet) {
|
||||
if (filename) {
|
||||
r = write(1, str, len);
|
||||
r = write(1, "\n", 1);
|
||||
} else {
|
||||
send(i, str, len, 0);
|
||||
send(i, "\n", 1, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
root = json_parser_get_root(parser);
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
|
||||
if (!no_render) {
|
||||
json_generator_set_root(generator, root);
|
||||
str = json_generator_to_data(generator, &len);;
|
||||
if (!quiet) {
|
||||
if (filename) {
|
||||
r = write(1, str, len);
|
||||
r = write(1, "\n", 1);
|
||||
} else {
|
||||
send(i, str, len, 0);
|
||||
send(i, "\n", 1, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
int c;
|
||||
int c;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:nqsvPh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b
|
||||
CASE_c CASE_n CASE_q
|
||||
CASE_s CASE_v CASE_P
|
||||
case 'h':
|
||||
printf(
|
||||
HELP_FILE("test_json_glib", "mnqSsvP")
|
||||
HELP_PORT("test_json_glib", "nqsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_q HELP_S
|
||||
HELP_s HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:nqsvPh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b
|
||||
CASE_c CASE_n CASE_q
|
||||
CASE_s CASE_v CASE_P
|
||||
case 'h':
|
||||
printf(HELP_FILE("test_json_glib", "mnqSsvP")
|
||||
HELP_PORT("test_json_glib", "nqsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_q HELP_S
|
||||
HELP_s HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
return exit_code;
|
||||
}
|
||||
|
|
|
@ -2,19 +2,35 @@
|
|||
#include <lib.h>
|
||||
|
||||
int main() {
|
||||
if (psyc_matches(PSYC_C2ARG("_failure_delivery"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 1;
|
||||
if (psyc_matches(PSYC_C2ARG("_failure"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 2;
|
||||
if (psyc_matches(PSYC_C2ARG("_unsuccessful"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 3;
|
||||
unless (psyc_matches(PSYC_C2ARG("_fail"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 4;
|
||||
unless (psyc_matches(PSYC_C2ARG("_truthahn"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 5;
|
||||
if (psyc_matches(PSYC_C2ARG("_failure_delivery"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 1;
|
||||
if (psyc_matches(PSYC_C2ARG("_failure"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 2;
|
||||
if (psyc_matches(PSYC_C2ARG("_unsuccessful"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 3;
|
||||
unless (psyc_matches(PSYC_C2ARG("_fail"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 4;
|
||||
unless (psyc_matches(PSYC_C2ARG("_truthahn"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 5;
|
||||
|
||||
puts("psyc_matches passed all tests.");
|
||||
puts("psyc_matches passed all tests.");
|
||||
|
||||
unless (psyc_inherits(PSYC_C2ARG("_failure_delivery"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 11;
|
||||
if (psyc_inherits(PSYC_C2ARG("_failure_unsuccessful"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 12;
|
||||
unless (psyc_inherits(PSYC_C2ARG("_fail"), PSYC_C2ARG("_failure_unsuccessful_delivery_death"))) return 13;
|
||||
unless (psyc_inherits(PSYC_C2ARG("_failure_delivery"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 11;
|
||||
if (psyc_inherits(PSYC_C2ARG("_failure_unsuccessful"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 12;
|
||||
unless (psyc_inherits(PSYC_C2ARG("_fail"),
|
||||
PSYC_C2ARG("_failure_unsuccessful_delivery_death")))
|
||||
return 13;
|
||||
|
||||
puts("psyc_inherits passed all tests.");
|
||||
puts("psyc_inherits passed all tests.");
|
||||
|
||||
return 0; // passed all tests
|
||||
return 0; // passed all tests
|
||||
}
|
||||
|
|
|
@ -5,101 +5,96 @@
|
|||
#include <psyc.h>
|
||||
#include <psyc/parse.h>
|
||||
|
||||
int main (int argc, char **argv)
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
uint8_t routing_only = argc > 2 && memchr(argv[2], (int)'r', strlen(argv[2]));
|
||||
uint8_t verbose = argc > 2 && memchr(argv[2], (int)'v', strlen(argv[2]));
|
||||
int idx, ret;
|
||||
char buffer[2048], oper;
|
||||
PsycString name, value, elem;
|
||||
PsycParseState state;
|
||||
PsycParseListState listState;
|
||||
uint8_t routing_only = argc > 2 && memchr(argv[2], (int)'r', strlen(argv[2]));
|
||||
uint8_t verbose = argc > 2 && memchr(argv[2], (int)'v', strlen(argv[2]));
|
||||
int idx, ret;
|
||||
char buffer[2048], oper;
|
||||
PsycString name, value, elem;
|
||||
PsycParseState state;
|
||||
PsycParseListState listState;
|
||||
|
||||
if (argc < 2)
|
||||
return -1;
|
||||
int file = open(argv[1],O_RDONLY);
|
||||
if (file < 0)
|
||||
return -1;
|
||||
idx = read(file,(void*)buffer,sizeof(buffer));
|
||||
if (argc < 2)
|
||||
return -1;
|
||||
int file = open(argv[1],O_RDONLY);
|
||||
if (file < 0)
|
||||
return -1;
|
||||
idx = read(file,(void*)buffer,sizeof(buffer));
|
||||
|
||||
if (verbose) {
|
||||
printf(">> INPUT\n");
|
||||
printf("%.*s\n", (int)idx, buffer);
|
||||
printf(">> PARSE\n");
|
||||
}
|
||||
if (verbose) {
|
||||
printf(">> INPUT\n");
|
||||
printf("%.*s\n", (int)idx, buffer);
|
||||
printf(">> PARSE\n");
|
||||
}
|
||||
|
||||
psyc_parse_state_init(&state, routing_only ?
|
||||
PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
psyc_parse_buffer_set(&state, buffer, idx);
|
||||
psyc_parse_state_init(&state, routing_only ?
|
||||
PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
psyc_parse_buffer_set(&state, buffer, idx);
|
||||
|
||||
// try parsing that now
|
||||
do
|
||||
{
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
// try parsing that now
|
||||
do {
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
|
||||
ret = psyc_parse(&state, &oper, &name, &value);
|
||||
ret = psyc_parse(&state, &oper, &name, &value);
|
||||
if (verbose)
|
||||
printf(">> ret = %d\n", ret);
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
if (verbose)
|
||||
printf("%c", oper);
|
||||
case PSYC_PARSE_BODY:
|
||||
// printf("the string is '%.*s'\n", name);
|
||||
if (verbose)
|
||||
printf("%.*s = %.*s\n",
|
||||
(int)name.length, name.data,
|
||||
(int)value.length, value.data);
|
||||
|
||||
if (psyc_var_is_list(PSYC_S2ARG(name))) {
|
||||
if (verbose)
|
||||
printf(">> ret = %d\n", ret);
|
||||
printf(">> LIST START\n");
|
||||
|
||||
switch (ret)
|
||||
{
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
if (verbose)
|
||||
printf("%c", oper);
|
||||
case PSYC_PARSE_BODY:
|
||||
// printf("the string is '%.*s'\n", name);
|
||||
if (verbose)
|
||||
printf("%.*s = %.*s\n",
|
||||
(int)name.length, name.data,
|
||||
(int)value.length, value.data);
|
||||
psyc_parse_list_state_init(&listState);
|
||||
psyc_parse_list_buffer_set(&listState, PSYC_S2ARG(value));
|
||||
|
||||
if (psyc_var_is_list(PSYC_S2ARG(name)))
|
||||
{
|
||||
if (verbose)
|
||||
printf(">> LIST START\n");
|
||||
while ((ret = psyc_parse_list(&listState, &elem))) {
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_LIST_END:
|
||||
case PSYC_PARSE_LIST_ELEM:
|
||||
if (verbose)
|
||||
printf("|%.*s\n", (int)elem.length, elem.data);
|
||||
break;
|
||||
default:
|
||||
printf("Error while parsing list: %i\n", ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
psyc_parse_list_state_init(&listState);
|
||||
psyc_parse_list_buffer_set(&listState, PSYC_S2ARG(value));
|
||||
|
||||
while ((ret = psyc_parse_list(&listState, &elem)))
|
||||
{
|
||||
switch (ret)
|
||||
{
|
||||
case PSYC_PARSE_LIST_END:
|
||||
case PSYC_PARSE_LIST_ELEM:
|
||||
if (verbose)
|
||||
printf("|%.*s\n", (int)elem.length, elem.data);
|
||||
break;
|
||||
default:
|
||||
printf("Error while parsing list: %i\n", ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ret == PSYC_PARSE_LIST_END)
|
||||
{
|
||||
if (verbose)
|
||||
printf(">> LIST END\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PSYC_PARSE_COMPLETE:
|
||||
// printf("Done parsing.\n");
|
||||
ret = 0;
|
||||
continue;
|
||||
case PSYC_PARSE_INSUFFICIENT:
|
||||
printf("Insufficient data.\n");
|
||||
return 1;
|
||||
default:
|
||||
printf("Error while parsing: %i\n", ret);
|
||||
return 1;
|
||||
if (ret == PSYC_PARSE_LIST_END) {
|
||||
if (verbose)
|
||||
printf(">> LIST END\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PSYC_PARSE_COMPLETE:
|
||||
// printf("Done parsing.\n");
|
||||
ret = 0;
|
||||
continue;
|
||||
case PSYC_PARSE_INSUFFICIENT:
|
||||
printf("Insufficient data.\n");
|
||||
return 1;
|
||||
default:
|
||||
printf("Error while parsing: %i\n", ret);
|
||||
return 1;
|
||||
}
|
||||
while (ret);
|
||||
}
|
||||
while (ret);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
622
test/test_psyc.c
622
test/test_psyc.c
|
@ -31,323 +31,333 @@ PsycModifier entity[NUM_PARSERS][ENTITY_LINES];
|
|||
|
||||
int contbytes, exit_code;
|
||||
|
||||
static inline
|
||||
void resetString (PsycString *s, uint8_t freeptr);
|
||||
static inline void
|
||||
resetString (PsycString *s, uint8_t freeptr);
|
||||
|
||||
// initialize parser & packet variables
|
||||
void test_init (int i) {
|
||||
// reset parser state & packet
|
||||
psyc_parse_state_init(&parsers[i], routing_only ?
|
||||
PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
void
|
||||
test_init (int i)
|
||||
{
|
||||
// reset parser state & packet
|
||||
psyc_parse_state_init(&parsers[i],
|
||||
routing_only ? PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
|
||||
memset(&packets[i], 0, sizeof(PsycPacket));
|
||||
memset(&routing[i], 0, sizeof(PsycModifier) * ROUTING_LINES);
|
||||
memset(&entity[i], 0, sizeof(PsycModifier) * ENTITY_LINES);
|
||||
packets[i].routing.modifiers = routing[i];
|
||||
packets[i].entity.modifiers = entity[i];
|
||||
memset(&packets[i], 0, sizeof(PsycPacket));
|
||||
memset(&routing[i], 0, sizeof(PsycModifier) * ROUTING_LINES);
|
||||
memset(&entity[i], 0, sizeof(PsycModifier) * ENTITY_LINES);
|
||||
packets[i].routing.modifiers = routing[i];
|
||||
packets[i].entity.modifiers = entity[i];
|
||||
}
|
||||
|
||||
// parse & render input
|
||||
int test_input (int i, char *recvbuf, size_t nbytes) {
|
||||
int j, ret, retl, r;
|
||||
char sendbuf[SEND_BUF_SIZE];
|
||||
char *parsebuf = recvbuf - contbytes;
|
||||
/* We have a buffer with pointers pointing to various parts of it:
|
||||
* *contbuf-vv
|
||||
* buffer: [ ccrrrr]
|
||||
* *recvbuf---^^^^
|
||||
* *parsebuf-^^^^^^
|
||||
*
|
||||
* New data is in recvbuf, if it contains an incomplete packet then remaining
|
||||
* unparsed data is copied to contbuf that will be parsed during the next call
|
||||
* to this function together with the new data.
|
||||
*/
|
||||
|
||||
PsycParseState *parser = &parsers[i];
|
||||
PsycPacket *packet = &packets[i];
|
||||
|
||||
char oper;
|
||||
PsycString name, value, elem;
|
||||
PsycString *pname = NULL, *pvalue = NULL;
|
||||
PsycModifier *mod = NULL;
|
||||
PsycParseListState listState;
|
||||
size_t len;
|
||||
|
||||
// Set buffer with data for the parser.
|
||||
psyc_parse_buffer_set(parser, parsebuf, contbytes + nbytes);
|
||||
contbytes = 0;
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
|
||||
do {
|
||||
if (verbose >= 3)
|
||||
printf("\n# buffer = [%.*s]\n# part = %d\n", (int)parser->buffer.length, parser->buffer.data, parser->part);
|
||||
// Parse the next part of the packet (a routing/entity modifier or the body)
|
||||
ret = exit_code = psyc_parse(parser, &oper, &name, &value);
|
||||
if (verbose >= 2)
|
||||
printf("# ret = %d\n", ret);
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ROUTING:
|
||||
assert(packet->routing.lines < ROUTING_LINES);
|
||||
mod = &(packet->routing.modifiers[packet->routing.lines]);
|
||||
pname = &mod->name;
|
||||
pvalue = &mod->value;
|
||||
mod->flag = PSYC_MODIFIER_ROUTING;
|
||||
packet->routing.lines++;
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_STATE_RESYNC:
|
||||
case PSYC_PARSE_STATE_RESET:
|
||||
packet->stateop = oper;
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_ENTITY_START:
|
||||
case PSYC_PARSE_ENTITY_CONT:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
assert(packet->entity.lines < ENTITY_LINES);
|
||||
mod = &(packet->entity.modifiers[packet->entity.lines]);
|
||||
pname = &mod->name;
|
||||
pvalue = &mod->value;
|
||||
|
||||
if (ret == PSYC_PARSE_ENTITY || ret == PSYC_PARSE_ENTITY_END) {
|
||||
packet->entity.lines++;
|
||||
mod->flag = psyc_parse_value_length_found(parser) ?
|
||||
PSYC_MODIFIER_NEED_LENGTH : PSYC_MODIFIER_NO_LENGTH;
|
||||
}
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_BODY_START:
|
||||
case PSYC_PARSE_BODY_CONT:
|
||||
case PSYC_PARSE_BODY_END:
|
||||
case PSYC_PARSE_BODY:
|
||||
pname = &(packet->method);
|
||||
pvalue = &(packet->data);
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_COMPLETE:
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
if ((filename && !multiple) || (!filename && single))
|
||||
ret = -1;
|
||||
|
||||
if (!no_render) {
|
||||
packet->flag = psyc_parse_content_length_found(parser) ?
|
||||
PSYC_PACKET_NEED_LENGTH : PSYC_PACKET_NO_LENGTH;
|
||||
|
||||
if (routing_only) {
|
||||
packet->content = packet->data;
|
||||
resetString(&(packet->data), 0);
|
||||
}
|
||||
|
||||
psyc_packet_length_set(packet);
|
||||
|
||||
if (psyc_render(packet, sendbuf, SEND_BUF_SIZE) == PSYC_RENDER_SUCCESS) {
|
||||
if (!quiet) {
|
||||
if (filename && write(1, sendbuf, packet->length) == -1) {
|
||||
perror("write");
|
||||
ret = -1;
|
||||
} else if (!filename && send(i, sendbuf, packet->length, 0) == -1) {
|
||||
perror("send");
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf("# Render error");
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// reset packet
|
||||
packet->routingLength = 0;
|
||||
packet->contentLength = 0;
|
||||
packet->length = 0;
|
||||
packet->flag = 0;
|
||||
|
||||
for (j = 0; j < packet->routing.lines; j++) {
|
||||
resetString(&(packet->routing.modifiers[j].name), 1);
|
||||
resetString(&(packet->routing.modifiers[j].value), 1);
|
||||
}
|
||||
packet->routing.lines = 0;
|
||||
|
||||
if (routing_only) {
|
||||
resetString(&(packet->content), 1);
|
||||
} else {
|
||||
for (j = 0; j < packet->entity.lines; j++) {
|
||||
resetString(&(packet->entity.modifiers[j].name), 1);
|
||||
resetString(&(packet->entity.modifiers[j].value), 1);
|
||||
}
|
||||
packet->entity.lines = 0;
|
||||
|
||||
resetString(&(packet->method), 1);
|
||||
resetString(&(packet->data), 1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_INSUFFICIENT:
|
||||
if (verbose >= 2)
|
||||
printf("# Insufficient data.\n");
|
||||
|
||||
contbytes = psyc_parse_remaining_length(parser);
|
||||
|
||||
if (contbytes > 0) { // copy end of parsebuf before start of recvbuf
|
||||
if (verbose >= 3)
|
||||
printf("# remaining = [%.*s]\n", (int)contbytes, psyc_parse_remaining_buffer(parser));
|
||||
assert(contbytes <= CONT_BUF_SIZE); // make sure it's still in the buffer
|
||||
memmove(recvbuf - contbytes, psyc_parse_remaining_buffer(parser), contbytes);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("# Error while parsing: %i\n", ret);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ENTITY_START:
|
||||
case PSYC_PARSE_ENTITY_CONT:
|
||||
case PSYC_PARSE_BODY_START:
|
||||
case PSYC_PARSE_BODY_CONT:
|
||||
ret = 0;
|
||||
case PSYC_PARSE_ENTITY:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_BODY:
|
||||
case PSYC_PARSE_BODY_END:
|
||||
if (oper) {
|
||||
mod->oper = oper;
|
||||
if (verbose >= 2)
|
||||
printf("%c", oper);
|
||||
}
|
||||
|
||||
if (name.length) {
|
||||
pname->data = malloc(name.length);
|
||||
pname->length = name.length;
|
||||
|
||||
assert(pname->data != NULL);
|
||||
memcpy((void*)pname->data, name.data, name.length);
|
||||
name.length = 0;
|
||||
|
||||
if (verbose >= 2)
|
||||
printf("%.*s = ", (int)pname->length, pname->data);
|
||||
}
|
||||
|
||||
if (value.length) {
|
||||
if (!pvalue->length) {
|
||||
if (psyc_parse_value_length_found(parser))
|
||||
len = psyc_parse_value_length(parser);
|
||||
else
|
||||
len = value.length;
|
||||
pvalue->data = malloc(len);
|
||||
}
|
||||
assert(pvalue->data != NULL);
|
||||
memcpy((void*)pvalue->data + pvalue->length, value.data, value.length);
|
||||
pvalue->length += value.length;
|
||||
value.length = 0;
|
||||
|
||||
if (verbose >= 2) {
|
||||
printf("[%.*s]", (int)pvalue->length, pvalue->data);
|
||||
if (parser->valueLength > pvalue->length)
|
||||
printf("...");
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
else if (verbose)
|
||||
printf("\n");
|
||||
|
||||
if (verbose >= 3)
|
||||
printf("\t\t\t\t\t\t\t\t# n:%ld v:%ld c:%ld r:%ld\n",
|
||||
pname->length, pvalue->length,
|
||||
parser->contentParsed, parser->routingLength);
|
||||
}
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
|
||||
if (psyc_var_is_list(PSYC_S2ARG(*pname))) {
|
||||
if (verbose >= 2)
|
||||
printf("## LIST START\n");
|
||||
|
||||
psyc_parse_list_state_init(&listState);
|
||||
psyc_parse_list_buffer_set(&listState, PSYC_S2ARG(*pvalue));
|
||||
|
||||
do {
|
||||
retl = psyc_parse_list(&listState, &elem);
|
||||
switch (retl) {
|
||||
case PSYC_PARSE_LIST_END:
|
||||
retl = 0;
|
||||
case PSYC_PARSE_LIST_ELEM:
|
||||
if (verbose >= 2) {
|
||||
printf("|%.*s\n", (int)elem.length, elem.data);
|
||||
if (ret == PSYC_PARSE_LIST_END)
|
||||
printf("## LIST END");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("# Error while parsing list: %i\n", retl);
|
||||
ret = retl = -1;
|
||||
}
|
||||
}
|
||||
while (retl > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (ret > 0);
|
||||
|
||||
if (progress)
|
||||
r = write(1, " ", 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline
|
||||
void resetString (PsycString *s, uint8_t freeptr)
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes)
|
||||
{
|
||||
if (freeptr && s->length)
|
||||
free((void*)s->data);
|
||||
int j, ret, retl, r;
|
||||
char sendbuf[SEND_BUF_SIZE];
|
||||
char *parsebuf = recvbuf - contbytes;
|
||||
/* We have a buffer with pointers pointing to various parts of it:
|
||||
* *contbuf-vv
|
||||
* buffer: [ ccrrrr]
|
||||
* *recvbuf---^^^^
|
||||
* *parsebuf-^^^^^^
|
||||
*
|
||||
* New data is in recvbuf, if it contains an incomplete packet then remaining
|
||||
* unparsed data is copied to contbuf that will be parsed during the next call
|
||||
* to this function together with the new data.
|
||||
*/
|
||||
|
||||
s->data = NULL;
|
||||
s->length = 0;
|
||||
}
|
||||
PsycParseState *parser = &parsers[i];
|
||||
PsycPacket *packet = &packets[i];
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
int c;
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:mnqrsvPSh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_m CASE_n CASE_q CASE_r
|
||||
CASE_s CASE_v CASE_S CASE_P
|
||||
case 'h':
|
||||
printf(
|
||||
HELP_FILE("test_psyc", "mnqrSsvP")
|
||||
HELP_PORT("test_psyc", "nqrsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_r
|
||||
HELP_q HELP_S HELP_s
|
||||
HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
char oper;
|
||||
PsycString name, value, elem;
|
||||
PsycString *pname = NULL, *pvalue = NULL;
|
||||
PsycModifier *mod = NULL;
|
||||
PsycParseListState listState;
|
||||
size_t len;
|
||||
|
||||
// Set buffer with data for the parser.
|
||||
psyc_parse_buffer_set(parser, parsebuf, contbytes + nbytes);
|
||||
contbytes = 0;
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
|
||||
do {
|
||||
if (verbose >= 3)
|
||||
printf("\n# buffer = [%.*s]\n# part = %d\n",
|
||||
(int)parser->buffer.length, parser->buffer.data, parser->part);
|
||||
// Parse the next part of the packet (a routing/entity modifier or the body)
|
||||
ret = exit_code = psyc_parse(parser, &oper, &name, &value);
|
||||
if (verbose >= 2)
|
||||
printf("# ret = %d\n", ret);
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ROUTING:
|
||||
assert(packet->routing.lines < ROUTING_LINES);
|
||||
mod = &(packet->routing.modifiers[packet->routing.lines]);
|
||||
pname = &mod->name;
|
||||
pvalue = &mod->value;
|
||||
mod->flag = PSYC_MODIFIER_ROUTING;
|
||||
packet->routing.lines++;
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_STATE_RESYNC:
|
||||
case PSYC_PARSE_STATE_RESET:
|
||||
packet->stateop = oper;
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_ENTITY_START:
|
||||
case PSYC_PARSE_ENTITY_CONT:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
assert(packet->entity.lines < ENTITY_LINES);
|
||||
mod = &(packet->entity.modifiers[packet->entity.lines]);
|
||||
pname = &mod->name;
|
||||
pvalue = &mod->value;
|
||||
|
||||
if (ret == PSYC_PARSE_ENTITY || ret == PSYC_PARSE_ENTITY_END) {
|
||||
packet->entity.lines++;
|
||||
mod->flag = psyc_parse_value_length_found(parser) ?
|
||||
PSYC_MODIFIER_NEED_LENGTH : PSYC_MODIFIER_NO_LENGTH;
|
||||
}
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_BODY_START:
|
||||
case PSYC_PARSE_BODY_CONT:
|
||||
case PSYC_PARSE_BODY_END:
|
||||
case PSYC_PARSE_BODY:
|
||||
pname = &(packet->method);
|
||||
pvalue = &(packet->data);
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_COMPLETE:
|
||||
if (verbose)
|
||||
printf("# Done parsing.\n");
|
||||
else if (progress)
|
||||
r = write(1, ".", 1);
|
||||
if ((filename && !multiple) || (!filename && single))
|
||||
ret = -1;
|
||||
|
||||
if (!no_render) {
|
||||
packet->flag = psyc_parse_content_length_found(parser) ?
|
||||
PSYC_PACKET_NEED_LENGTH : PSYC_PACKET_NO_LENGTH;
|
||||
|
||||
if (routing_only) {
|
||||
packet->content = packet->data;
|
||||
resetString(&(packet->data), 0);
|
||||
}
|
||||
|
||||
psyc_packet_length_set(packet);
|
||||
|
||||
if (PSYC_RENDER_SUCCESS == psyc_render(packet, sendbuf,
|
||||
SEND_BUF_SIZE)) {
|
||||
if (!quiet) {
|
||||
if (filename && write(1, sendbuf, packet->length) == -1) {
|
||||
perror("write");
|
||||
ret = -1;
|
||||
} else if (!filename && -1 == send(i, sendbuf,
|
||||
packet->length, 0)) {
|
||||
perror("send");
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf("# Render error");
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// reset packet
|
||||
packet->routingLength = 0;
|
||||
packet->contentLength = 0;
|
||||
packet->length = 0;
|
||||
packet->flag = 0;
|
||||
|
||||
for (j = 0; j < packet->routing.lines; j++) {
|
||||
resetString(&(packet->routing.modifiers[j].name), 1);
|
||||
resetString(&(packet->routing.modifiers[j].value), 1);
|
||||
}
|
||||
packet->routing.lines = 0;
|
||||
|
||||
if (routing_only) {
|
||||
resetString(&(packet->content), 1);
|
||||
} else {
|
||||
for (j = 0; j < packet->entity.lines; j++) {
|
||||
resetString(&(packet->entity.modifiers[j].name), 1);
|
||||
resetString(&(packet->entity.modifiers[j].value), 1);
|
||||
}
|
||||
packet->entity.lines = 0;
|
||||
|
||||
resetString(&(packet->method), 1);
|
||||
resetString(&(packet->data), 1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PSYC_PARSE_INSUFFICIENT:
|
||||
if (verbose >= 2)
|
||||
printf("# Insufficient data.\n");
|
||||
|
||||
contbytes = psyc_parse_remaining_length(parser);
|
||||
|
||||
if (contbytes > 0) { // copy end of parsebuf before start of recvbuf
|
||||
if (verbose >= 3)
|
||||
printf("# remaining = [%.*s]\n",
|
||||
(int)contbytes, psyc_parse_remaining_buffer(parser));
|
||||
assert(contbytes <= CONT_BUF_SIZE); // make sure it fits in the buffer
|
||||
memmove(recvbuf - contbytes,
|
||||
psyc_parse_remaining_buffer(parser), contbytes);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("# Error while parsing: %i\n", ret);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ENTITY_START:
|
||||
case PSYC_PARSE_ENTITY_CONT:
|
||||
case PSYC_PARSE_BODY_START:
|
||||
case PSYC_PARSE_BODY_CONT:
|
||||
ret = 0;
|
||||
case PSYC_PARSE_ENTITY:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_BODY:
|
||||
case PSYC_PARSE_BODY_END:
|
||||
if (oper) {
|
||||
mod->oper = oper;
|
||||
if (verbose >= 2)
|
||||
printf("%c", oper);
|
||||
}
|
||||
|
||||
return exit_code;
|
||||
if (name.length) {
|
||||
pname->data = malloc(name.length);
|
||||
pname->length = name.length;
|
||||
|
||||
assert(pname->data != NULL);
|
||||
memcpy((void*)pname->data, name.data, name.length);
|
||||
name.length = 0;
|
||||
|
||||
if (verbose >= 2)
|
||||
printf("%.*s = ", (int)pname->length, pname->data);
|
||||
}
|
||||
|
||||
if (value.length) {
|
||||
if (!pvalue->length) {
|
||||
if (psyc_parse_value_length_found(parser))
|
||||
len = psyc_parse_value_length(parser);
|
||||
else
|
||||
len = value.length;
|
||||
pvalue->data = malloc(len);
|
||||
}
|
||||
assert(pvalue->data != NULL);
|
||||
memcpy((void*)pvalue->data + pvalue->length, value.data, value.length);
|
||||
pvalue->length += value.length;
|
||||
value.length = 0;
|
||||
|
||||
if (verbose >= 2) {
|
||||
printf("[%.*s]", (int)pvalue->length, pvalue->data);
|
||||
if (parser->valueLength > pvalue->length)
|
||||
printf("...");
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
else if (verbose)
|
||||
printf("\n");
|
||||
|
||||
if (verbose >= 3)
|
||||
printf("\t\t\t\t\t\t\t\t# n:%ld v:%ld c:%ld r:%ld\n",
|
||||
pname->length, pvalue->length,
|
||||
parser->contentParsed, parser->routingLength);
|
||||
}
|
||||
|
||||
switch (ret) {
|
||||
case PSYC_PARSE_ROUTING:
|
||||
case PSYC_PARSE_ENTITY:
|
||||
case PSYC_PARSE_ENTITY_END:
|
||||
oper = 0;
|
||||
name.length = 0;
|
||||
value.length = 0;
|
||||
|
||||
if (psyc_var_is_list(PSYC_S2ARG(*pname))) {
|
||||
if (verbose >= 2)
|
||||
printf("## LIST START\n");
|
||||
|
||||
psyc_parse_list_state_init(&listState);
|
||||
psyc_parse_list_buffer_set(&listState, PSYC_S2ARG(*pvalue));
|
||||
|
||||
do {
|
||||
retl = psyc_parse_list(&listState, &elem);
|
||||
switch (retl) {
|
||||
case PSYC_PARSE_LIST_END:
|
||||
retl = 0;
|
||||
case PSYC_PARSE_LIST_ELEM:
|
||||
if (verbose >= 2) {
|
||||
printf("|%.*s\n", (int)elem.length, elem.data);
|
||||
if (ret == PSYC_PARSE_LIST_END)
|
||||
printf("## LIST END");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("# Error while parsing list: %i\n", retl);
|
||||
ret = retl = -1;
|
||||
}
|
||||
}
|
||||
while (retl > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (ret > 0);
|
||||
|
||||
if (progress)
|
||||
r = write(1, " ", 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void
|
||||
resetString (PsycString *s, uint8_t freeptr)
|
||||
{
|
||||
if (freeptr && s->length)
|
||||
free((void*)s->data);
|
||||
|
||||
s->data = NULL;
|
||||
s->length = 0;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:mnqrsvPSh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_m CASE_n CASE_q CASE_r
|
||||
CASE_s CASE_v CASE_S CASE_P
|
||||
case 'h':
|
||||
printf(HELP_FILE("test_psyc", "mnqrSsvP")
|
||||
HELP_PORT("test_psyc", "nqrsvP")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_m HELP_n HELP_r
|
||||
HELP_q HELP_S HELP_s
|
||||
HELP_v HELP_P HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
|
|
@ -25,48 +25,52 @@ size_t count = 1, recv_buf_size;
|
|||
|
||||
PsycParseState parser;
|
||||
|
||||
void test_init (int i) {
|
||||
psyc_parse_state_init(&parser, routing_only ?
|
||||
PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
void
|
||||
test_init (int i)
|
||||
{
|
||||
psyc_parse_state_init(&parser, routing_only
|
||||
? PSYC_PARSE_ROUTING_ONLY : PSYC_PARSE_ALL);
|
||||
}
|
||||
|
||||
int test_input (int i, char *recvbuf, size_t nbytes) {
|
||||
char oper;
|
||||
PsycString name, value;
|
||||
int ret;
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes)
|
||||
{
|
||||
char oper;
|
||||
PsycString name, value;
|
||||
int ret;
|
||||
|
||||
psyc_parse_buffer_set(&parser, recvbuf, nbytes);
|
||||
psyc_parse_buffer_set(&parser, recvbuf, nbytes);
|
||||
|
||||
for (;;) {
|
||||
ret = psyc_parse(&parser, &oper, &name, &value);
|
||||
if (ret == PSYC_PARSE_COMPLETE || ret < 0)
|
||||
return -1;
|
||||
for (;;) {
|
||||
ret = psyc_parse(&parser, &oper, &name, &value);
|
||||
if (ret == PSYC_PARSE_COMPLETE || ret < 0)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:rsh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c CASE_r CASE_s
|
||||
case 'h':
|
||||
printf(HELP_FILE("test_psyc_speed", "rs")
|
||||
HELP_PORT("test_psyc_speed", "rs")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_r HELP_s HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
int c;
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:rsh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_r CASE_s
|
||||
case 'h':
|
||||
printf(
|
||||
HELP_FILE("test_psyc_speed", "rs")
|
||||
HELP_PORT("test_psyc_speed", "rs")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_r HELP_s HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,105 +7,111 @@
|
|||
#define myUNI "psyc://10.100.1000/~ludwig"
|
||||
|
||||
/* example renderer generating a presence packet */
|
||||
int testPresence (const char *avail, int availlen,
|
||||
const char *desc, int desclen,
|
||||
const char *rendered, uint8_t verbose)
|
||||
int
|
||||
testPresence (const char *avail, int availlen,
|
||||
const char *desc, int desclen,
|
||||
const char *rendered, uint8_t verbose)
|
||||
{
|
||||
PsycModifier routing[1];
|
||||
psyc_modifier_init(&routing[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_context"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
PsycModifier routing[1];
|
||||
psyc_modifier_init(&routing[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_context"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
|
||||
PsycModifier entity[2];
|
||||
// presence is to be assigned permanently in distributed state
|
||||
psyc_modifier_init(&entity[0], PSYC_OPERATOR_ASSIGN,
|
||||
PSYC_C2ARG("_degree_availability"),
|
||||
avail, availlen, PSYC_MODIFIER_CHECK_LENGTH);
|
||||
psyc_modifier_init(&entity[1], PSYC_OPERATOR_ASSIGN,
|
||||
PSYC_C2ARG("_description_presence"),
|
||||
desc, desclen, PSYC_MODIFIER_CHECK_LENGTH);
|
||||
PsycModifier entity[2];
|
||||
// presence is to be assigned permanently in distributed state
|
||||
psyc_modifier_init(&entity[0], PSYC_OPERATOR_ASSIGN,
|
||||
PSYC_C2ARG("_degree_availability"),
|
||||
avail, availlen, PSYC_MODIFIER_CHECK_LENGTH);
|
||||
psyc_modifier_init(&entity[1], PSYC_OPERATOR_ASSIGN,
|
||||
PSYC_C2ARG("_description_presence"),
|
||||
desc, desclen, PSYC_MODIFIER_CHECK_LENGTH);
|
||||
|
||||
PsycPacket packet;
|
||||
psyc_packet_init(&packet, routing, PSYC_NUM_ELEM(routing),
|
||||
entity, PSYC_NUM_ELEM(entity),
|
||||
PSYC_C2ARG("_notice_presence"),
|
||||
NULL, 0,
|
||||
PSYC_STATE_NOOP,
|
||||
PSYC_PACKET_CHECK_LENGTH);
|
||||
PsycPacket packet;
|
||||
psyc_packet_init(&packet, routing, PSYC_NUM_ELEM(routing),
|
||||
entity, PSYC_NUM_ELEM(entity),
|
||||
PSYC_C2ARG("_notice_presence"),
|
||||
NULL, 0,
|
||||
PSYC_STATE_NOOP,
|
||||
PSYC_PACKET_CHECK_LENGTH);
|
||||
|
||||
char buffer[512];
|
||||
psyc_render(&packet, buffer, sizeof(buffer));
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)packet.length, buffer);
|
||||
return strncmp(rendered, buffer, packet.length);
|
||||
char buffer[512];
|
||||
psyc_render(&packet, buffer, sizeof(buffer));
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)packet.length, buffer);
|
||||
return strncmp(rendered, buffer, packet.length);
|
||||
}
|
||||
|
||||
int testList (const char *rendered, uint8_t verbose)
|
||||
int
|
||||
testList (const char *rendered, uint8_t verbose)
|
||||
{
|
||||
PsycModifier routing[2];
|
||||
psyc_modifier_init(&routing[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_source"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
psyc_modifier_init(&routing[1], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_context"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
PsycModifier routing[2];
|
||||
psyc_modifier_init(&routing[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_source"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
psyc_modifier_init(&routing[1], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_context"),
|
||||
PSYC_C2ARG(myUNI), PSYC_MODIFIER_ROUTING);
|
||||
|
||||
PsycString elems_text[] = {
|
||||
PSYC_C2STR("foo"),
|
||||
PSYC_C2STR("bar"),
|
||||
PSYC_C2STR("baz"),
|
||||
};
|
||||
PsycString elems_text[] = {
|
||||
PSYC_C2STR("foo"),
|
||||
PSYC_C2STR("bar"),
|
||||
PSYC_C2STR("baz"),
|
||||
};
|
||||
|
||||
PsycString elems_bin[] = {
|
||||
PSYC_C2STR("foo"),
|
||||
PSYC_C2STR("b|r"),
|
||||
PSYC_C2STR("baz\nqux"),
|
||||
};
|
||||
PsycString elems_bin[] = {
|
||||
PSYC_C2STR("foo"),
|
||||
PSYC_C2STR("b|r"),
|
||||
PSYC_C2STR("baz\nqux"),
|
||||
};
|
||||
|
||||
PsycList list_text, list_bin;
|
||||
psyc_list_init(&list_text, elems_text, PSYC_NUM_ELEM(elems_text), PSYC_LIST_CHECK_LENGTH);
|
||||
psyc_list_init(&list_bin, elems_bin, PSYC_NUM_ELEM(elems_bin), PSYC_LIST_CHECK_LENGTH);
|
||||
PsycList list_text, list_bin;
|
||||
psyc_list_init(&list_text, elems_text,
|
||||
PSYC_NUM_ELEM(elems_text), PSYC_LIST_CHECK_LENGTH);
|
||||
psyc_list_init(&list_bin, elems_bin,
|
||||
PSYC_NUM_ELEM(elems_bin), PSYC_LIST_CHECK_LENGTH);
|
||||
|
||||
char buf_text[32], buf_bin[32];
|
||||
psyc_render_list(&list_text, buf_text, sizeof(buf_text));
|
||||
psyc_render_list(&list_bin, buf_bin, sizeof(buf_bin));
|
||||
char buf_text[32], buf_bin[32];
|
||||
psyc_render_list(&list_text, buf_text, sizeof(buf_text));
|
||||
psyc_render_list(&list_bin, buf_bin, sizeof(buf_bin));
|
||||
|
||||
PsycModifier entity[2];
|
||||
psyc_modifier_init(&entity[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_list_text"),
|
||||
buf_text, list_text.length, list_text.flag);
|
||||
psyc_modifier_init(&entity[1], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_list_binary"),
|
||||
buf_bin, list_bin.length, list_bin.flag);
|
||||
PsycModifier entity[2];
|
||||
psyc_modifier_init(&entity[0], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_list_text"),
|
||||
buf_text, list_text.length, list_text.flag);
|
||||
psyc_modifier_init(&entity[1], PSYC_OPERATOR_SET,
|
||||
PSYC_C2ARG("_list_binary"),
|
||||
buf_bin, list_bin.length, list_bin.flag);
|
||||
|
||||
PsycPacket packet;
|
||||
psyc_packet_init(&packet, routing, PSYC_NUM_ELEM(routing),
|
||||
entity, PSYC_NUM_ELEM(entity),
|
||||
PSYC_C2ARG("_test_list"),
|
||||
PSYC_C2ARG("list test"),
|
||||
PSYC_STATE_NOOP,
|
||||
PSYC_PACKET_CHECK_LENGTH);
|
||||
PsycPacket packet;
|
||||
psyc_packet_init(&packet, routing, PSYC_NUM_ELEM(routing),
|
||||
entity, PSYC_NUM_ELEM(entity),
|
||||
PSYC_C2ARG("_test_list"),
|
||||
PSYC_C2ARG("list test"),
|
||||
PSYC_STATE_NOOP,
|
||||
PSYC_PACKET_CHECK_LENGTH);
|
||||
|
||||
char buffer[512];
|
||||
psyc_render(&packet, buffer, sizeof(buffer));
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)packet.length, buffer);
|
||||
return strncmp(rendered, buffer, packet.length);
|
||||
char buffer[512];
|
||||
psyc_render(&packet, buffer, sizeof(buffer));
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)packet.length, buffer);
|
||||
return strncmp(rendered, buffer, packet.length);
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
uint8_t verbose = argc > 1;
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
uint8_t verbose = argc > 1;
|
||||
|
||||
if (testPresence(PSYC_C2ARG("_here"), PSYC_C2ARG("I'm omnipresent right now"), "\
|
||||
if (testPresence(PSYC_C2ARG("_here"), PSYC_C2ARG("I'm omnipresent right now"), "\
|
||||
:_context\t" myUNI "\n\
|
||||
\n\
|
||||
=_degree_availability\t_here\n\
|
||||
=_description_presence\tI'm omnipresent right now\n\
|
||||
_notice_presence\n\
|
||||
|\n", verbose))
|
||||
return 1;
|
||||
return 1;
|
||||
|
||||
if (testList("\
|
||||
if (testList("\
|
||||
:_source psyc://10.100.1000/~ludwig\n\
|
||||
:_context psyc://10.100.1000/~ludwig\n\
|
||||
85\n\
|
||||
|
@ -115,9 +121,9 @@ qux\n\
|
|||
_test_list\n\
|
||||
list test\n\
|
||||
|\n", verbose))
|
||||
return 2;
|
||||
return 2;
|
||||
|
||||
puts("psyc_render passed all tests.");
|
||||
puts("psyc_render passed all tests.");
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -21,44 +21,49 @@ size_t count = 1, recv_buf_size;
|
|||
|
||||
int exit_code;
|
||||
|
||||
void test_init (int i) {
|
||||
void
|
||||
test_init (int i)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int test_input (int i, char *recvbuf, size_t nbytes) {
|
||||
size_t len = strnlen(recvbuf, nbytes);
|
||||
int
|
||||
test_input (int i, char *recvbuf, size_t nbytes)
|
||||
{
|
||||
size_t len = strnlen(recvbuf, nbytes);
|
||||
|
||||
if (!len) {
|
||||
printf("Empty string\n");
|
||||
return -1;
|
||||
if (!len) {
|
||||
printf("Empty string\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:sh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c CASE_s
|
||||
case 'h':
|
||||
printf(HELP_FILE("test_strlen", "s")
|
||||
HELP_PORT("test_strlen", "s")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_s HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
int c;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:p:b:c:sh")) != -1) {
|
||||
switch (c) {
|
||||
CASE_f CASE_p CASE_b CASE_c
|
||||
CASE_s
|
||||
case 'h':
|
||||
printf(
|
||||
HELP_FILE("test_strlen", "s")
|
||||
HELP_PORT("test_strlen", "s")
|
||||
HELP_f HELP_p HELP_b HELP_c
|
||||
HELP_s HELP_h,
|
||||
port, RECV_BUF_SIZE);
|
||||
exit(0);
|
||||
case '?': exit(-1);
|
||||
default: abort();
|
||||
}
|
||||
}
|
||||
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
if (filename)
|
||||
test_file(filename, count, recv_buf_size);
|
||||
else
|
||||
test_server(port, count, recv_buf_size);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
|
144
test/test_text.c
144
test/test_text.c
|
@ -7,95 +7,99 @@
|
|||
|
||||
uint8_t verbose;
|
||||
|
||||
PsycTextValueRC getValueFooBar (const char *name, size_t len, PsycString *value, void *extra)
|
||||
PsycTextValueRC
|
||||
getValueFooBar (const char *name, size_t len, PsycString *value, void *extra)
|
||||
{
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
value->data = "Foo Bar";
|
||||
value->length = 7;
|
||||
return PSYC_TEXT_VALUE_FOUND;
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
value->data = "Foo Bar";
|
||||
value->length = 7;
|
||||
return PSYC_TEXT_VALUE_FOUND;
|
||||
}
|
||||
|
||||
PsycTextValueRC getValueEmpty (const char *name, size_t len, PsycString *value, void *extra)
|
||||
PsycTextValueRC
|
||||
getValueEmpty (const char *name, size_t len, PsycString *value, void *extra)
|
||||
{
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
value->data = "";
|
||||
value->length = 0;
|
||||
return PSYC_TEXT_VALUE_FOUND;
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
value->data = "";
|
||||
value->length = 0;
|
||||
return PSYC_TEXT_VALUE_FOUND;
|
||||
}
|
||||
|
||||
PsycTextValueRC getValueNotFound (const char *name, size_t len, PsycString *value, void *extra)
|
||||
PsycTextValueRC
|
||||
getValueNotFound (const char *name, size_t len, PsycString *value, void *extra)
|
||||
{
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
return PSYC_TEXT_VALUE_NOT_FOUND;
|
||||
if (verbose)
|
||||
printf("> getValue: %.*s\n", (int)len, name);
|
||||
return PSYC_TEXT_VALUE_NOT_FOUND;
|
||||
}
|
||||
|
||||
int testText (char *template, size_t tmplen, char *buffer, size_t buflen, PsycString *result, PsycTextCB getValue)
|
||||
int
|
||||
testText (char *template, size_t tmplen, char *buffer, size_t buflen,
|
||||
PsycString *result, PsycTextCB getValue)
|
||||
{
|
||||
PsycTextState state;
|
||||
size_t length = 0;
|
||||
PsycTextRC ret;
|
||||
PsycTextState state;
|
||||
size_t length = 0;
|
||||
PsycTextRC ret;
|
||||
|
||||
psyc_text_state_init(&state, template, tmplen, buffer, buflen);
|
||||
do
|
||||
{
|
||||
ret = psyc_text(&state, getValue, NULL);
|
||||
length += psyc_text_bytes_written(&state);
|
||||
switch (ret)
|
||||
{
|
||||
case PSYC_TEXT_INCOMPLETE:
|
||||
if (verbose)
|
||||
printf("# %.*s...\n", (int)length, buffer);
|
||||
psyc_text_buffer_set(&state, buffer + length, BUFSIZE - length);
|
||||
break;
|
||||
case PSYC_TEXT_COMPLETE:
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)length, buffer);
|
||||
result->length = length;
|
||||
result->data = buffer;
|
||||
return ret;
|
||||
case PSYC_TEXT_NO_SUBST:
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)tmplen, template);
|
||||
return ret;
|
||||
}
|
||||
psyc_text_state_init(&state, template, tmplen, buffer, buflen);
|
||||
do {
|
||||
ret = psyc_text(&state, getValue, NULL);
|
||||
length += psyc_text_bytes_written(&state);
|
||||
switch (ret) {
|
||||
case PSYC_TEXT_INCOMPLETE:
|
||||
if (verbose)
|
||||
printf("# %.*s...\n", (int)length, buffer);
|
||||
psyc_text_buffer_set(&state, buffer + length, BUFSIZE - length);
|
||||
break;
|
||||
case PSYC_TEXT_COMPLETE:
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)length, buffer);
|
||||
result->length = length;
|
||||
result->data = buffer;
|
||||
return ret;
|
||||
case PSYC_TEXT_NO_SUBST:
|
||||
if (verbose)
|
||||
printf("%.*s\n", (int)tmplen, template);
|
||||
return ret;
|
||||
}
|
||||
while (ret == PSYC_TEXT_INCOMPLETE);
|
||||
}
|
||||
while (ret == PSYC_TEXT_INCOMPLETE);
|
||||
|
||||
return -2; // shouldn't be reached
|
||||
return -2; // shouldn't be reached
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
verbose = argc > 1;
|
||||
char buffer[BUFSIZE];
|
||||
PsycString result;
|
||||
verbose = argc > 1;
|
||||
char buffer[BUFSIZE];
|
||||
PsycString result;
|
||||
|
||||
char *str = "Hello [_foo] & [_bar]!";
|
||||
size_t len = strlen(str);
|
||||
int i;
|
||||
char *str = "Hello [_foo] & [_bar]!";
|
||||
size_t len = strlen(str);
|
||||
int i;
|
||||
|
||||
testText(str, len, buffer, BUFSIZE, &result, &getValueFooBar);
|
||||
testText(str, len, buffer, BUFSIZE, &result, &getValueFooBar);
|
||||
if (memcmp(result.data, PSYC_C2ARG("Hello Foo Bar & Foo Bar!")))
|
||||
return 1;
|
||||
|
||||
testText(str, len, buffer, BUFSIZE, &result, &getValueEmpty);
|
||||
if (memcmp(result.data, PSYC_C2ARG("Hello & !")))
|
||||
return 2;
|
||||
|
||||
if (PSYC_TEXT_NO_SUBST != testText(str, len, buffer, BUFSIZE,
|
||||
&result, &getValueNotFound))
|
||||
return 3;
|
||||
|
||||
for (i = 1; i < 22; i++) {
|
||||
testText(str, len, buffer, i, &result, &getValueFooBar);
|
||||
if (memcmp(result.data, PSYC_C2ARG("Hello Foo Bar & Foo Bar!")))
|
||||
return 1;
|
||||
return 10 + i;
|
||||
}
|
||||
|
||||
testText(str, len, buffer, BUFSIZE, &result, &getValueEmpty);
|
||||
if (memcmp(result.data, PSYC_C2ARG("Hello & !")))
|
||||
return 2;
|
||||
puts("psyc_text passed all tests.");
|
||||
|
||||
if (testText(str, len, buffer, BUFSIZE, &result, &getValueNotFound) != PSYC_TEXT_NO_SUBST)
|
||||
return 3;
|
||||
|
||||
for (i = 1; i < 22; i++)
|
||||
{
|
||||
testText(str, len, buffer, i, &result, &getValueFooBar);
|
||||
if (memcmp(result.data, PSYC_C2ARG("Hello Foo Bar & Foo Bar!")))
|
||||
return 10 + i;
|
||||
}
|
||||
|
||||
puts("psyc_text passed all tests.");
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -4,51 +4,57 @@
|
|||
#include <lib.h>
|
||||
|
||||
void
|
||||
testUniform (char *str, int ret) {
|
||||
PsycUniform *uni = malloc(sizeof(PsycUniform));
|
||||
memset(uni, 0, sizeof(PsycUniform));
|
||||
printf("%s\n", str);
|
||||
int r = psyc_uniform_parse(uni, str, strlen(str));
|
||||
testUniform (char *str, int ret)
|
||||
{
|
||||
PsycUniform *uni = malloc(sizeof(PsycUniform));
|
||||
memset(uni, 0, sizeof(PsycUniform));
|
||||
printf("%s\n", str);
|
||||
int r = psyc_uniform_parse(uni, str, strlen(str));
|
||||
|
||||
PP(("[%.*s] : [%.*s] [%.*s] : [%.*s] [%.*s] / [%.*s] # [%.*s]\n[%.*s]\n[%.*s] [%.*s]\n[%.*s]\n\n",
|
||||
(int)PSYC_S2ARG2(uni->scheme),
|
||||
(int)PSYC_S2ARG2(uni->slashes),
|
||||
(int)PSYC_S2ARG2(uni->host),
|
||||
(int)PSYC_S2ARG2(uni->port),
|
||||
(int)PSYC_S2ARG2(uni->transport),
|
||||
(int)PSYC_S2ARG2(uni->resource),
|
||||
(int)PSYC_S2ARG2(uni->channel),
|
||||
(int)PSYC_S2ARG2(uni->entity),
|
||||
(int)PSYC_S2ARG2(uni->root),
|
||||
(int)PSYC_S2ARG2(uni->nick),
|
||||
(int)PSYC_S2ARG2(uni->body)));
|
||||
PP(("[%.*s] : [%.*s] [%.*s] : [%.*s] [%.*s] / "
|
||||
"[%.*s] # [%.*s]\n[%.*s]\n[%.*s] [%.*s]\n[%.*s]\n\n",
|
||||
(int)PSYC_S2ARG2(uni->scheme),
|
||||
(int)PSYC_S2ARG2(uni->slashes),
|
||||
(int)PSYC_S2ARG2(uni->host),
|
||||
(int)PSYC_S2ARG2(uni->port),
|
||||
(int)PSYC_S2ARG2(uni->transport),
|
||||
(int)PSYC_S2ARG2(uni->resource),
|
||||
(int)PSYC_S2ARG2(uni->channel),
|
||||
(int)PSYC_S2ARG2(uni->entity),
|
||||
(int)PSYC_S2ARG2(uni->root),
|
||||
(int)PSYC_S2ARG2(uni->nick),
|
||||
(int)PSYC_S2ARG2(uni->body)));
|
||||
|
||||
free(uni);
|
||||
if (r != ret) {
|
||||
fprintf(stderr, "ERROR: psyc_uniform_parse returned %d instead of %d\n", r, ret);
|
||||
exit(1);
|
||||
}
|
||||
free(uni);
|
||||
if (r != ret) {
|
||||
fprintf(stderr, "ERROR: psyc_uniform_parse returned %d instead of %d\n",
|
||||
r, ret);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int main () {
|
||||
testUniform("psyc://foo.tld:4404d/@bar#baz", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:4405/~bar", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:1234", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:1234d", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:-1234", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:-1234d", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo/", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://1234567890abcdef:g/~foo", PSYC_SCHEME_PSYC);
|
||||
int
|
||||
main ()
|
||||
{
|
||||
testUniform("psyc://foo.tld:4404d/@bar#baz", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:4405/~bar", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:1234", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:1234d", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:-1234", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo:-1234d", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo/", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://foo", PSYC_SCHEME_PSYC);
|
||||
testUniform("psyc://1234567890abcdef:g/~foo", PSYC_SCHEME_PSYC);
|
||||
|
||||
testUniform("xmpp:user@host", PSYC_PARSE_UNIFORM_INVALID_SCHEME);
|
||||
testUniform("psyc:host", PSYC_PARSE_UNIFORM_INVALID_SLASHES);
|
||||
testUniform("psyc://", PSYC_PARSE_UNIFORM_INVALID_HOST);
|
||||
testUniform("psyc://:123/", PSYC_PARSE_UNIFORM_INVALID_HOST);
|
||||
testUniform("psyc://host:/~foo", PSYC_PARSE_UNIFORM_INVALID_PORT);
|
||||
testUniform("psyc://host:d/~foo", PSYC_PARSE_UNIFORM_INVALID_PORT);
|
||||
testUniform("psyc://1234567890abcdef:1g/~foo", PSYC_PARSE_UNIFORM_INVALID_TRANSPORT);
|
||||
testUniform("xmpp:user@host", PSYC_PARSE_UNIFORM_INVALID_SCHEME);
|
||||
testUniform("psyc:host", PSYC_PARSE_UNIFORM_INVALID_SLASHES);
|
||||
testUniform("psyc://", PSYC_PARSE_UNIFORM_INVALID_HOST);
|
||||
testUniform("psyc://:123/", PSYC_PARSE_UNIFORM_INVALID_HOST);
|
||||
testUniform("psyc://host:/~foo", PSYC_PARSE_UNIFORM_INVALID_PORT);
|
||||
testUniform("psyc://host:d/~foo", PSYC_PARSE_UNIFORM_INVALID_PORT);
|
||||
testUniform("psyc://1234567890abcdef:1g/~foo",
|
||||
PSYC_PARSE_UNIFORM_INVALID_TRANSPORT);
|
||||
|
||||
printf("SUCCESS: psyc_uniform_parse passed all tests.\n");
|
||||
return 0;
|
||||
printf("SUCCESS: psyc_uniform_parse passed all tests.\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -6,34 +6,32 @@
|
|||
|
||||
int main() {
|
||||
#if 0
|
||||
const char* vars[] =
|
||||
{
|
||||
"_source",
|
||||
"_source_relay",
|
||||
"_source_foo",
|
||||
"_sourcherry",
|
||||
"_foo",
|
||||
"bar",
|
||||
"_",
|
||||
};
|
||||
const char* vars[] = {
|
||||
"_source",
|
||||
"_source_relay",
|
||||
"_source_foo",
|
||||
"_sourcherry",
|
||||
"_foo",
|
||||
"bar",
|
||||
"_",
|
||||
};
|
||||
|
||||
int i;
|
||||
for (i = 0; i < sizeof(vars) / sizeof(*vars); i++)
|
||||
{
|
||||
printf(">> %s: %d %d\n", vars[i], sizeof(vars[i]), sizeof(*vars[i]));
|
||||
printf("%s: %d\n", vars[i], psyc_var_is_routing(vars[i], strlen(vars[i])));
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < sizeof(vars) / sizeof(*vars); i++) {
|
||||
printf(">> %s: %d %d\n", vars[i], sizeof(vars[i]), sizeof(*vars[i]));
|
||||
printf("%s: %d\n", vars[i], psyc_var_is_routing(vars[i], strlen(vars[i])));
|
||||
}
|
||||
#else
|
||||
unless (psyc_var_is_routing(PSYC_C2ARG("_source"))) return 1;
|
||||
unless (psyc_var_is_routing(PSYC_C2ARG("_source_relay"))) return 2;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_source_foo"))) return 3;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_sourcherry"))) return 4;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_sour"))) return 5;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_foo"))) return 6;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("bar"))) return 7;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_"))) return 8;
|
||||
unless (psyc_var_is_routing(PSYC_C2ARG("_source"))) return 1;
|
||||
unless (psyc_var_is_routing(PSYC_C2ARG("_source_relay"))) return 2;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_source_foo"))) return 3;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_sourcherry"))) return 4;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_sour"))) return 5;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_foo"))) return 6;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("bar"))) return 7;
|
||||
if (psyc_var_is_routing(PSYC_C2ARG("_"))) return 8;
|
||||
|
||||
puts("psyc_var_is_routing passed all tests.");
|
||||
puts("psyc_var_is_routing passed all tests.");
|
||||
#endif
|
||||
return 0; // passed all tests
|
||||
return 0; // passed all tests
|
||||
}
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
#include <lib.h>
|
||||
|
||||
int main() {
|
||||
unless (psyc_var_type(PSYC_C2ARG("_list"))) return 1;
|
||||
unless (psyc_var_type(PSYC_C2ARG("_list_foo"))) return 2;
|
||||
unless (psyc_var_type(PSYC_C2ARG("_color_red"))) return 3;
|
||||
if (psyc_var_type(PSYC_C2ARG("_last"))) return 4;
|
||||
if (psyc_var_type(PSYC_C2ARG("_lost_foo"))) return 5;
|
||||
if (psyc_var_type(PSYC_C2ARG("_colorful"))) return 6;
|
||||
if (psyc_var_type(PSYC_C2ARG("_foo"))) return 7;
|
||||
if (psyc_var_type(PSYC_C2ARG("bar"))) return 8;
|
||||
if (psyc_var_type(PSYC_C2ARG("______"))) return 9;
|
||||
if (psyc_var_type(PSYC_C2ARG("_"))) return 10;
|
||||
unless (psyc_var_type(PSYC_C2ARG("_list"))) return 1;
|
||||
unless (psyc_var_type(PSYC_C2ARG("_list_foo"))) return 2;
|
||||
unless (psyc_var_type(PSYC_C2ARG("_color_red"))) return 3;
|
||||
if (psyc_var_type(PSYC_C2ARG("_last"))) return 4;
|
||||
if (psyc_var_type(PSYC_C2ARG("_lost_foo"))) return 5;
|
||||
if (psyc_var_type(PSYC_C2ARG("_colorful"))) return 6;
|
||||
if (psyc_var_type(PSYC_C2ARG("_foo"))) return 7;
|
||||
if (psyc_var_type(PSYC_C2ARG("bar"))) return 8;
|
||||
if (psyc_var_type(PSYC_C2ARG("______"))) return 9;
|
||||
if (psyc_var_type(PSYC_C2ARG("_"))) return 10;
|
||||
|
||||
puts("psyc_var_type passed all tests.");
|
||||
return 0; // passed all tests
|
||||
puts("psyc_var_type passed all tests.");
|
||||
return 0; // passed all tests
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue