49 #include <config_auto.h>
53 #include "allheaders.h"
55 #define L_BUF_SIZE 2048
57 static l_int32 getNextNonCommentLine(
SARRAY *sa, l_int32 start, l_int32 *pnext);
58 static l_int32 getNextNonBlankLine(
SARRAY *sa, l_int32 start, l_int32 *pnext);
59 static l_int32 getNextNonDoubleSlashLine(
SARRAY *sa, l_int32 start,
61 static l_int32 searchForProtoSignature(
SARRAY *sa, l_int32 begin,
62 l_int32 *pstart, l_int32 *pstop, l_int32 *pcharindex,
64 static char * captureProtoSignature(
SARRAY *sa, l_int32 start, l_int32 stop,
66 static char * cleanProtoSignature(
char *str);
67 static l_int32 skipToEndOfFunction(
SARRAY *sa, l_int32 start,
68 l_int32 charindex, l_int32 *pnext);
69 static l_int32 skipToMatchingBrace(
SARRAY *sa, l_int32 start,
70 l_int32 lbindex, l_int32 *prbline, l_int32 *prbindex);
71 static l_int32 skipToSemicolon(
SARRAY *sa, l_int32 start,
72 l_int32 charindex, l_int32 *pnext);
73 static l_int32 getOffsetForCharacter(
SARRAY *sa, l_int32 start,
char tchar,
74 l_int32 *psoffset, l_int32 *pboffset, l_int32 *ptoffset);
75 static l_int32 getOffsetForMatchingRP(
SARRAY *sa, l_int32 start,
76 l_int32 soffsetlp, l_int32 boffsetlp, l_int32 toffsetlp,
77 l_int32 *psoffset, l_int32 *pboffset, l_int32 *ptoffset);
150 parseForProtos(
const char *filein,
151 const char *prestring)
153 char *strdata, *str, *newstr, *parsestr, *secondword;
154 l_int32 start, next, stop, charindex, found;
156 SARRAY *sa, *saout, *satest;
159 return (
char *)ERROR_PTR(
"filein not defined", __func__, NULL);
169 searchForProtoSignature(sa, next, &start, &stop, &charindex, &found);
174 str = captureProtoSignature(sa, start, stop, charindex);
194 if (strcmp(secondword,
"static") &&
195 strcmp(secondword,
"extern") &&
196 strcmp(secondword,
"typedef")) {
209 skipToEndOfFunction(sa, stop, charindex, &next);
210 if (next == -1)
break;
238 getNextNonCommentLine(
SARRAY *sa,
246 return ERROR_INT(
"sa not defined", __func__, 1);
248 return ERROR_INT(
"&pnext not defined", __func__, 1);
254 for (i = start; i < n; i++) {
256 return ERROR_INT(
"str not returned; shouldn't happen", __func__, 1);
283 getNextNonBlankLine(
SARRAY *sa,
288 l_int32 i, j, n, len;
291 return ERROR_INT(
"sa not defined", __func__, 1);
293 return ERROR_INT(
"&pnext not defined", __func__, 1);
299 for (i = start; i < n; i++) {
301 return ERROR_INT(
"str not returned; shouldn't happen", __func__, 1);
303 for (j = 0; j < len; j++) {
304 if (str[j] !=
' ' && str[j] !=
'\t'
305 && str[j] !=
'\n' && str[j] !=
'\r') {
331 getNextNonDoubleSlashLine(
SARRAY *sa,
339 return ERROR_INT(
"sa not defined", __func__, 1);
341 return ERROR_INT(
"&pnext not defined", __func__, 1);
348 for (i = start; i < n; i++) {
350 return ERROR_INT(
"str not returned; shouldn't happen", __func__, 1);
352 if (len < 2 || str[0] !=
'/' || str[1] !=
'/') {
395 searchForProtoSignature(
SARRAY *sa,
402 l_int32 next, rbline, rbindex, scline;
403 l_int32 soffsetlp, soffsetrp, soffsetlb, soffsetsc;
404 l_int32 boffsetlp, boffsetrp, boffsetlb, boffsetsc;
405 l_int32 toffsetlp, toffsetrp, toffsetlb, toffsetsc;
408 return ERROR_INT(
"sa not defined", __func__, 1);
410 return ERROR_INT(
"&start not defined", __func__, 1);
412 return ERROR_INT(
"&stop not defined", __func__, 1);
414 return ERROR_INT(
"&charindex not defined", __func__, 1);
416 return ERROR_INT(
"&found not defined", __func__, 1);
423 getNextNonCommentLine(sa, begin, &next);
424 if (next == -1)
return 0;
431 getNextNonBlankLine(sa, begin, &next);
432 if (next == -1)
return 0;
439 getNextNonDoubleSlashLine(sa, begin, &next);
440 if (next == -1)
return 0;
449 getOffsetForCharacter(sa, next,
'(', &soffsetlp, &boffsetlp,
453 getOffsetForMatchingRP(sa, next, soffsetlp, boffsetlp, toffsetlp,
454 &soffsetrp, &boffsetrp, &toffsetrp);
455 getOffsetForCharacter(sa, next,
'{', &soffsetlb, &boffsetlb,
457 getOffsetForCharacter(sa, next,
';', &soffsetsc, &boffsetsc,
462 if (soffsetrp == -1 || soffsetlb == -1)
467 if (toffsetlb < toffsetlp) {
468 skipToMatchingBrace(sa, next + soffsetlb, boffsetlb,
470 skipToSemicolon(sa, rbline, rbindex, &scline);
477 if ((soffsetsc != -1) &&
478 (toffsetsc < toffsetlb || toffsetsc < toffsetlp)) {
479 skipToSemicolon(sa, next, 0, &scline);
490 *pstop = next + soffsetrp;
491 *pcharindex = boffsetrp;
515 captureProtoSignature(
SARRAY *sa,
520 char *str, *newstr, *protostr, *cleanstr;
525 return (
char *)ERROR_PTR(
"sa not defined", __func__, NULL);
528 for (i = start; i < stop; i++) {
533 str[charindex + 1] =
'\0';
539 cleanstr = cleanProtoSignature(protostr);
559 cleanProtoSignature(
char *instr)
561 char *str, *cleanstr;
563 char externstring[] =
"extern";
564 l_int32 i, j, nwords, nchars, index, len;
568 return (
char *)ERROR_PTR(
"instr not defined", __func__, NULL);
574 for (i = 0; i < nwords; i++) {
576 nchars = strlen(str);
578 for (j = 0; j < nchars; j++) {
582 return (
char *)ERROR_PTR(
"token too large", __func__, NULL);
588 }
else if (str[j] ==
')') {
592 buf[index++] = str[j];
602 len = strlen(cleanstr);
603 cleanstr[len - 1] =
'\0';
621 skipToEndOfFunction(
SARRAY *sa,
626 l_int32 end, rbindex;
627 l_int32 soffsetlb, boffsetlb, toffsetlb;
630 return ERROR_INT(
"sa not defined", __func__, 1);
632 return ERROR_INT(
"&next not defined", __func__, 1);
634 getOffsetForCharacter(sa, start,
'{', &soffsetlb, &boffsetlb,
636 skipToMatchingBrace(sa, start + soffsetlb, boffsetlb, &end, &rbindex);
664 skipToMatchingBrace(
SARRAY *sa,
671 l_int32 i, j, jstart, n, sumbrace, found, instring, nchars;
674 return ERROR_INT(
"sa not defined", __func__, 1);
676 return ERROR_INT(
"&stop not defined", __func__, 1);
678 return ERROR_INT(
"&rbindex not defined", __func__, 1);
685 for (i = start; i < n; i++) {
689 jstart = lbindex + 1;
690 nchars = strlen(str);
691 for (j = jstart; j < nchars; j++) {
694 if (j == jstart && str[j] ==
'\"')
695 instring = 1 - instring;
696 if (j > jstart && str[j] ==
'\"' && str[j-1] !=
'\\')
697 instring = 1 - instring;
700 if (str[j] ==
'{' && str[j+1] !=
'\'' && !instring) {
702 }
else if (str[j] ==
'}' && str[j+1] !=
'\'' && !instring) {
717 return ERROR_INT(
"matching right brace not found", __func__, 1);
739 skipToSemicolon(
SARRAY *sa,
745 l_int32 i, j, n, jstart, nchars, found;
748 return ERROR_INT(
"sa not defined", __func__, 1);
750 return ERROR_INT(
"&next not defined", __func__, 1);
755 for (i = start; i < n; i++) {
759 jstart = charindex + 1;
760 nchars = strlen(str);
761 for (j = jstart; j < nchars; j++) {
773 return ERROR_INT(
"semicolon not found", __func__, 1);
804 getOffsetForCharacter(
SARRAY *sa,
812 l_int32 i, j, n, nchars, totchars, found;
815 return ERROR_INT(
"sa not defined", __func__, 1);
817 return ERROR_INT(
"&soffset not defined", __func__, 1);
819 return ERROR_INT(
"&boffset not defined", __func__, 1);
821 return ERROR_INT(
"&toffset not defined", __func__, 1);
824 *pboffset = 100000000;
825 *ptoffset = 100000000;
830 for (i = start; i < n; i++) {
832 return ERROR_INT(
"str not returned; shouldn't happen", __func__, 1);
833 nchars = strlen(str);
834 for (j = 0; j < nchars; j++) {
835 if (str[j] == tchar) {
846 *psoffset = i - start;
848 *ptoffset = totchars + j;
892 getOffsetForMatchingRP(
SARRAY *sa,
902 l_int32 i, j, n, nchars, totchars, leftmatch, firstline, jstart, found;
905 return ERROR_INT(
"sa not defined", __func__, 1);
907 return ERROR_INT(
"&soffset not defined", __func__, 1);
909 return ERROR_INT(
"&boffset not defined", __func__, 1);
911 return ERROR_INT(
"&toffset not defined", __func__, 1);
914 *pboffset = 100000000;
915 *ptoffset = 100000000;
919 totchars = toffsetlp;
921 firstline = start + soffsetlp;
922 for (i = firstline; i < n; i++) {
924 return ERROR_INT(
"str not returned; shouldn't happen", __func__, 1);
925 nchars = strlen(str);
928 jstart = boffsetlp + 1;
929 for (j = jstart; j < nchars; j++) {
932 else if (str[j] ==
')')
934 if (leftmatch == 0) {
942 totchars += nchars - boffsetlp;
948 *psoffset = i - start;
950 *ptoffset = totchars + j;
SARRAY * sarrayCreate(l_int32 n)
sarrayCreate()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
l_int32 sarrayGetCount(SARRAY *sa)
sarrayGetCount()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
SARRAY * sarrayCreateWordsFromString(const char *string)
sarrayCreateWordsFromString()
SARRAY * sarrayCreateLinesFromString(const char *string, l_int32 blankflag)
sarrayCreateLinesFromString()
l_ok sarrayAddString(SARRAY *sa, const char *string, l_int32 copyflag)
sarrayAddString()
char * sarrayToString(SARRAY *sa, l_int32 addnlflag)
sarrayToString()
char * stringJoin(const char *src1, const char *src2)
stringJoin()
l_uint8 * l_binaryRead(const char *filename, size_t *pnbytes)
l_binaryRead()