| /* Copyright (c) 2004-2012 Sergey Lyubka <valenok@gmail.com> | |
| All rights reserved | |
| Permission is hereby granted, free of charge, to any person obtaining a copy | |
| of this software and associated documentation files (the "Software"), to deal | |
| in the Software without restriction, including without limitation the rights | |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| copies of the Software, and to permit persons to whom the Software is | |
| furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| THE SOFTWARE. | |
| This is a regular expression library that implements a subset of Perl RE. | |
| Please refer to http://slre.googlecode.com for detailed description. | |
| Supported syntax: | |
| ^ Match beginning of a buffer | |
| $ Match end of a buffer | |
| () Grouping and substring capturing | |
| [...] Match any character from set | |
| [^...] Match any character but ones from set | |
| \s Match whitespace | |
| \S Match non-whitespace | |
| \d Match decimal digit | |
| \r Match carriage return | |
| \n Match newline | |
| + Match one or more times (greedy) | |
| +? Match one or more times (non-greedy) | |
| * Match zero or more times (greedy) | |
| *? Match zero or more times (non-greedy) | |
| ? Match zero or once | |
| \xDD Match byte with hex value 0xDD | |
| \meta Match one of the meta character: ^$().[*+\? | |
| Match string buffer "buf" of length "buf_len" against "regexp", which should | |
| conform the syntax outlined above. "options" could be either 0 or | |
| SLRE_CASE_INSENSITIVE for case-insensitive match. If regular expression | |
| "regexp" contains brackets, slre_match() will capture the respective | |
| substring into the passed placeholder. Thus, each opening parenthesis | |
| should correspond to three arguments passed: | |
| placeholder_type, placeholder_size, placeholder_address | |
| Usage example: parsing HTTP request line. | |
| char method[10], uri[100]; | |
| int http_version_minor, http_version_major; | |
| const char *error; | |
| const char *request = " \tGET /index.html HTTP/1.0\r\n\r\n"; | |
| error = slre_match(0, "^\\s*(GET|POST)\\s+(\\S+)\\s+HTTP/(\\d)\\.(\\d)", | |
| request, strlen(request), | |
| SLRE_STRING, sizeof(method), method, | |
| SLRE_STRING, sizeof(uri), uri, | |
| SLRE_INT,sizeof(http_version_major),&http_version_major, | |
| SLRE_INT,sizeof(http_version_minor),&http_version_minor); | |
| if (error != NULL) { | |
| printf("Error parsing HTTP request: %s\n", error); | |
| } else { | |
| printf("Requested URI: %s\n", uri); | |
| } | |
| Return: | |
| NULL: string matched and all captures successfully made | |
| non-NULL: in this case, the return value is an error string */ | |
| #ifndef SLRE_H | |
| #define SLRE_H | |
| enum slre_option {SLRE_CASE_INSENSITIVE = 1}; | |
| enum slre_capture {SLRE_STRING, SLRE_INT, SLRE_FLOAT}; | |
| const char *slre_match(enum slre_option options, const char *regexp, | |
| const char *buf, int buf_len, ...); | |
| #endif /* SLRE_H */ |