File: example_static.c

package info (click to toggle)
pcb-rnd 3.1.7b-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,108 kB
  • sloc: ansic: 213,400; yacc: 6,241; sh: 4,698; awk: 3,016; makefile: 2,254; lex: 1,166; python: 519; xml: 261; lisp: 154; tcl: 67; perl: 34; javascript: 6; ruby: 5
file content (45 lines) | stat: -rw-r--r-- 1,286 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <string.h>
#include "qparse.h"

/* Read lines of text from stdin and split them in fields using qparse.
   Uses static argv[] and buffer */

#define SYNTAX QPARSE_DOUBLE_QUOTE | QPARSE_SINGLE_QUOTE | QPARSE_TERM_SEMICOLON | QPARSE_SEP_COMMA | QPARSE_COLON_LAST | QPARSE_NO_ARGV_REALLOC

int main()
{
	char s[1024];
	const char *start[3] = {0};
	char *tmp, *argv_static[8] = {0}, **argv = argv_static;
	unsigned int argv_alloced = 8;
	size_t tmp_len;

	tmp_len = sizeof(s)+8;
	tmp = malloc(tmp_len);

	while(fgets(s, sizeof(s), stdin) != NULL) {
		int n, argc;
		char *end;

		size_t cons = 424242;

		/* remove trailing newline (if we don't we just get an extra empty field at the end) */
		for(end = s + strlen(s) - 1; (end >= s) && ((*end == '\r') || (*end == '\n')); end--)
			*end = '\0';

		/* split and print fields */
		printf("Splitting '%s':\n", s);
		argc = qparse4(s, &argv, &argv_alloced, SYNTAX, &cons, &tmp, &tmp_len, start, 3);
		for(n = 0; n < argc; n++)
			printf(" [%d] '%s'\n", n, argv[n]);
		qparse_free_strs(argc, &argv);
		printf("consumed: %ld bytes, starts at", cons);
		for(n = 0; (n < argc) && (n < 3); n++)
			printf(" '%s'", start[n]);
		printf("\n");
	}
	qparse4_free(&argv, &argv_alloced, SYNTAX, &tmp, &tmp_len);

	return 0;
}