67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _MODELEXT_PARSER_H
 | |
| #define _MODELEXT_PARSER_H
 | |
| 
 | |
| #include "modelext_info.h"
 | |
| 
 | |
| /**
 | |
|     modelext inline parse.
 | |
| 
 | |
|     modelext info tables are set to an certain memory address,
 | |
|     which use to get data pointer you want.
 | |
| 
 | |
|     @param[in] modelext info address.
 | |
|     @param[in] refer to MODELEXT_TYPE_
 | |
|     @param[in] a memory space will be stored with description of modelext type.
 | |
|     @return
 | |
|         - @b address: the data pointer of result.
 | |
| */
 | |
| static inline unsigned char *modelext_get_cfg(unsigned char *buf, unsigned int type, MODELEXT_HEADER **header)
 | |
| {
 | |
| #define MAGIC "MODELEXT"
 | |
| 	MODELEXT_HEADER *h_tail = NULL;
 | |
| 	MODELEXT_HEADER *h = (MODELEXT_HEADER *)buf;
 | |
| 	MODELEXT_INFO *d = (MODELEXT_INFO *)(buf + sizeof(MODELEXT_HEADER));
 | |
| 
 | |
| 	if (type >= MODELEXT_TYPE_MAX) {
 | |
| 		if (header) {
 | |
| 			*header = NULL;
 | |
| 		}
 | |
| 		return NULL;
 | |
| 	}
 | |
| 
 | |
| 	if (memcmp(d->name, MAGIC, strlen(MAGIC))) {
 | |
| 		if (header) {
 | |
| 			*header = NULL;
 | |
| 		}
 | |
| 		return NULL;
 | |
| 	}
 | |
| 
 | |
| 	h_tail = (MODELEXT_HEADER *)(buf + d->ext_bin_length);
 | |
| 
 | |
| 	while (h->size) {
 | |
| 		if (h->type == type) {
 | |
| 			break;
 | |
| 		} else {
 | |
| 			h = (MODELEXT_HEADER *)(((char *)h) + h->size);
 | |
| 			if (h >= h_tail) {
 | |
| 				return NULL;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (!h->size) {
 | |
| 		if (header) {
 | |
| 			*header = NULL;
 | |
| 		}
 | |
| 		return NULL;
 | |
| 	}
 | |
| 
 | |
| 	if (header) {
 | |
| 		*header = h;
 | |
| 	}
 | |
| 
 | |
| 	return (unsigned char *)(((unsigned char *)h) + sizeof(MODELEXT_HEADER));
 | |
| }
 | |
| 
 | |
| #endif
 | 
