static groupRecord_t * groupListParseRecord(char * record)
{
	char * pBuf = record + 1; //+1 is to ignore the 'for deletion' mark that may just be added to this record.
	static groupRecord_t group;
	static char groupName[MAX_SUPPORTED_GROUP_NAME_LENGTH + 1];
	static groupMembersRecord_t member[MAX_SUPPORTED_GROUP_MEMBERS];
	groupMembersRecord_t ** nextMemberPtr;
	parsingResult_t parsingResult =
	{ SDB_TXT_PARSER_RESULT_OK, 0 };
	int i;

	if (record == NULL)
	{
		return NULL;
	}

	sdb_txt_parser_get_numeric_field(&pBuf, (uint8_t *) &group.id, 2, FALSE,
			&parsingResult);
	sdb_txt_parser_get_quoted_string(&pBuf, groupName,
			MAX_SUPPORTED_GROUP_NAME_LENGTH, &parsingResult);
	nextMemberPtr = &group.members;
	for (i = 0;
			(parsingResult.code == SDB_TXT_PARSER_RESULT_OK)
					&& (i < MAX_SUPPORTED_GROUP_MEMBERS); i++)
	{
		*nextMemberPtr = &(member[i]);
		sdb_txt_parser_get_numeric_field(&pBuf, (uint8_t *) &(member[i].nwkAddr), 2,
				FALSE, &parsingResult);
		sdb_txt_parser_get_numeric_field(&pBuf, (uint8_t *) &(member[i].endpoint),
				1, FALSE, &parsingResult);
		nextMemberPtr = &(member[i].next);
	}
	*nextMemberPtr = NULL;

	if ((parsingResult.code != SDB_TXT_PARSER_RESULT_OK)
			&& (parsingResult.code != SDB_TXT_PARSER_RESULT_REACHED_END_OF_RECORD))
	{
		sdbtMarkError(db, record, &parsingResult);
		return NULL;
	}

	if (strlen(groupName) > 0)
	{
		group.name = groupName;
	}
	else
	{
		group.name = NULL;
	}

	return &group;
}
예제 #2
0
bool sdbtErrorComment(db_descriptor * db, char * record)
{
	parsingResult_t parsingResult = {SDB_TXT_PARSER_RESULT_OK, 0};
	char * pBuf = record + 1;
	char comment[MAX_SUPPORTED_RECORD_SIZE];
	uint8_t errorCode;
	uint16_t errorOffset;
	bool rc;
	char tempstr[3] = {SDBT_BAD_FORMAT_CHARACTER, '\n', '\0'};

	if (record[0] == SDBT_PENDING_COMMENT_FORMAT_CHARACTER)
	{
		record[0] = SDBT_BAD_FORMAT_CHARACTER;
		sprintf(comment,"%c-------\n", SDBT_BAD_FORMAT_CHARACTER);
		rc = sdb_add_record(db, comment) &&
			sdb_add_record(db, record);
		
		if (rc == TRUE)
		{
//			printf("here&\n");
			sdb_txt_parser_get_numeric_field(&pBuf, &errorCode, 1, FALSE, &parsingResult);
			if (errorCode > SDB_TXT_PARSER_RESULT_MAX)
			{
//printf("here0\n");
				parsingResult.code = SDB_TXT_PARSER_RESULT_VALUE_OUT_OF_RANGE;
				parsingResult.errorLocation = pBuf - 2;
			}
			else
			{
//printf("here1 %d \n", parsingResult.code);
				sdb_txt_parser_get_numeric_field(&pBuf, (uint8_t *)&errorOffset, 2, FALSE, &parsingResult);
				if (errorOffset >= strlen(record))
				{
					parsingResult.code = SDB_TXT_PARSER_RESULT_VALUE_OUT_OF_RANGE;
					parsingResult.errorLocation = pBuf - 2;
				}
			}
//			printf("here2\n");
			if (parsingResult.code == SDB_TXT_PARSER_RESULT_OK)
			{
//				printf("here3\n");
//				printf("%s\n%d %d\n", record, errorOffset - 7 + 1, errorCode);
				sprintf(comment,"%cERROR:%*s %s\n", SDBT_BAD_FORMAT_CHARACTER, errorOffset - 7 + 1, "^", parsingErrorStrings[errorCode]);
			}
			else
			{
//				printf("here4\n");
//				printf("%s\n%d %d\n", record, parsingResult.errorLocation - record - 1 + 1, parsingResult.code);
				sprintf(comment,"%c%*s %s (%s)\n", SDBT_BAD_FORMAT_CHARACTER, parsingResult.errorLocation - record - 1 + 1, "^", "BAD_ERROR_DESCRIPTION_HEADER", parsingErrorStrings[parsingResult.code]);
			}
//			printf("here5\n");

			rc = sdb_add_record(db, comment)
				&& sdb_add_record(db, tempstr);
		}
	}
	else
	{
		rc = sdb_add_record(db, record);
	}

	return rc;
}