binarytermreader.c
来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 542 行 · 第 1/2 页
C
542 行
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
newTerm = icl_NewVarNoCopy(inString);
inString = NULL;
}
break;
case BTT_ICLSTR:
/* printf("binaryTermReader_parseBuffer() hit IclStr offset for dataLen is %i\n", offset); */
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &dataLen);
if(offsetIncr == 0) {
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
if(dataLen <= 0) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLSTR has datalen <= 0\n");
termReader_setError(br->superReader, TERMREADER_BINBADICLSTR);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
inString = (char*)malloc((dataLen + 1) * sizeof(char));
offsetIncr = javadistoglib_readJavaChars(currPos + offset, bufLen, dataLen, dataLen + 1, inString);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for chars (Str)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
free(inString);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
icl_safeStRemoveQuotes(inString, dataLen, &strLen);
icl_safeStUndoubleQuotes(inString, strLen, &strLen);
newTerm = icl_NewStrNoCopy(inString);
inString = NULL;
break;
case BTT_ICLDATAQ:
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &dataLen);
if(offsetIncr == 0) {
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
if(dataLen <= 0) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLDATAQ has datalen <= 0\n");
}
inData = (char*)malloc(dataLen * sizeof(char));
offsetIncr = javadistoglib_readJavaBytes(currPos + offset, bufLen, dataLen, dataLen, inData);
if(offsetIncr == 0) {
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
free(inData);
return NULL;
}
offset += offsetIncr;
newTerm = icl_NewDataQNoCopy(inData, dataLen);
inData = NULL;
break;
case BTT_ICLSTRUCT:
/* printf("binaryTermReader_parseBuffer() hit IclStruct\n"); */
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &numArgs);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for int (numArgs for struct)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &dataLen);
offset += offsetIncr;
bufLen -= offsetIncr;
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for int (dataLen for struct)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
if(dataLen <= 0) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLSTRUCT has datalen <= 0\n");
termReader_setError(br->superReader, TERMREADER_BINBADICLSTRUCT);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
inString = (char*)malloc((dataLen + 1) * sizeof(char));
offsetIncr = javadistoglib_readJavaChars(currPos + offset, bufLen, dataLen, dataLen + 1, inString);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for chars (functor)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
free(inString);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
args = icl_NewList(NULL);
for(i = 0; i < numArgs; ++i) {
if(g_queue_is_empty(termList)) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLSTRUCT not enough args\n");
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHARGS);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
icl_AddToList(args, (ICLTerm*)g_queue_pop_tail(termList), TRUE);
}
newTerm = icl_NewStructFromList(inString, args);
free(inString);
inString = NULL;
break;
case BTT_ICLLIST:
/* printf("binaryTermReader_parseBuffer() hit IclList\n"); */
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &numArgs);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for int (numArgs for list)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
newTerm = icl_NewList(NULL);
for(i = 0; i < numArgs; ++i) {
if(g_queue_is_empty(termList)) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLLIST not enough args\n");
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHARGS);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
icl_AddToList(newTerm, (ICLTerm*)g_queue_pop_tail(termList), TRUE);
}
break;
case BTT_ICLGROUP:
/* printf("binaryTermReader_parseBuffer() hit IclGroup\n"); */
offsetIncr = javadistoglib_readJavaInt(currPos + offset, bufLen, &numArgs);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for int (numArgs for group)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
offsetIncr = javadistoglib_readJavaChar(currPos + offset, bufLen, &starter);
if(offsetIncr == 0) {
/* printf("binaryTermReader_parseBuffer() not enough data for char (starter for group)\n"); */
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHDATA);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
offset += offsetIncr;
bufLen -= offsetIncr;
newTerm = icl_NewGroup(starter, ",", NULL);
for(i = 0; i < numArgs; ++i) {
if(g_queue_is_empty(termList)) {
fprintf(stderr, "binaryTermReader_parseBuffer() ICLGROUP not enough args\n");
termReader_setError(br->superReader, TERMREADER_BINNOTENOUGHARGS);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
icl_AddToList(newTerm, (ICLTerm*)g_queue_pop_tail(termList), TRUE);
}
break;
default:
fprintf(stderr, "binaryTermReader_parseBuffer() encountered unexpected type: [%i] at offset %i\n", type, offset - offsetIncr);
termReader_setError(br->superReader, TERMREADER_BINUNEXPECTEDTYPE);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
g_queue_push_tail(termList, newTerm);
}
fprintf(stderr, "binaryTermReader_parseBuffer() unexpected exit from loop\n");
termReader_setError(br->superReader, TERMREADER_BINUNREACHABLE);
binaryTermReader_cleanupTermList(termList);
return NULL;
}
void binaryTermReader_fillData(BinaryTermReader* br, double timeout)
{
char buf[AMOUNTTOREAD + 1];
struct timeval time;
struct timeval* timep = NULL;
int lastFdPlusOne;
int selectRes = 0;
ssize_t numBytes = 0;
fd_set readfds;
/* printf("binaryTermReader_fillData()\n"); */
if(timeout > 0) {
long i = (long)floor(timeout);
time.tv_sec = i;
time.tv_usec = (long)floor((timeout - i) * 1e6);
timep = &time;
}
lastFdPlusOne = termReader_getSocket(br->superReader) + 1;
FD_ZERO(&readfds);
FD_SET(termReader_getSocket(br->superReader), &readfds);
selectRes = select(lastFdPlusOne, &readfds, NULL, NULL, timep);
switch(selectRes) {
case -1:
perror("binaryTermReader_fillData bad select");
termReader_setError(br->superReader, TERMREADER_SELECTERR);
return;
case 0:
/*fprintf(stderr, "binaryTermReader_fillData time out\n"); */
termReader_setError(br->superReader, TERMREADER_TIMEOUT);
return;
default:
#ifdef _WINDOWS
numBytes = recv(termReader_getSocket(br->superReader), buf, AMOUNTTOREAD, 0);
#else
numBytes = read(termReader_getSocket(br->superReader), buf, AMOUNTTOREAD);
#endif
switch(numBytes) {
case -1:
perror("binaryTermReader_fillData bad read");
termReader_setError(br->superReader, TERMREADER_READERR);
return;
case 0:
/*fprintf(stderr, "binaryTermReader_fillData no connection\n");*/
termReader_setError(br->superReader, TERMREADER_NOCONN);
return;
}
}
binaryTermReader_addToCurrentBuffer(br, buf, numBytes);
termReader_setError(br->superReader, TERMREADER_OKAY);
/*
{
printf("binaryTermReader_fillData() added %i bytes; buffer is now size %i\n", numBytes, br->currentBuffer->len);
}
*/
}
void binaryTermReader_addToCurrentBuffer(BinaryTermReader* br, char* buf, ssize_t len)
{
g_byte_array_append(br->currentBuffer, buf, len);
/*
size_t needCapacity = len + br->currentBuffer->len + 1;
char* oldBuf;
if(needCapacity > br->bufCapacity) {
while(br->bufCapacity < needCapacity) {
br->bufCapacity *= 2;
}
oldBuf = br->currentBuffer;
br->currentBuffer = (char*)realloc(br->currentBuffer, br->bufCapacity);
if(br->currentBuffer == NULL) {
br->currentBuffer = (char*)malloc(br->bufCapacity);
memcpy(br->currentBuffer, oldBuf, br->currentBuffer->len);
free(oldBuf);
}
}
memcpy(br->currentBuffer + br->currentBuffer->len, buf, len);
br->currentBuffer->len += len;
*/
/*
printf("binaryTermReader_addToCurrentBuffer() used = %i\n", br->bufUsed);
*/
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?