|
@@ -0,0 +1,173 @@
|
|
|
+#include"TcPch.h"
|
|
|
+#pragma hdrstop
|
|
|
+#include"Fields.h"
|
|
|
+#include"debug.h"
|
|
|
+#define MAX_STATIC_FIELDS_SIZE 1024*200
|
|
|
+static char fieldsMemory[MAX_STATIC_FIELDS_SIZE * 6];
|
|
|
+/*
|
|
|
+* 存储结构
|
|
|
+* [32字节块][32字节块].........共MAX_STATIC_FIELDS_SIZE字节长,6400条
|
|
|
+* * [64字节块][64字节块].........共MAX_STATIC_FIELDS_SIZE字节长,3200条
|
|
|
+* * [128字节块][128字节块].......共MAX_STATIC_FIELDS_SIZE字节长,1600条
|
|
|
+* * [256字节块][256字节块].......共MAX_STATIC_FIELDS_SIZE字节长,800条
|
|
|
+* * [512字节块][512字节块].......共MAX_STATIC_FIELDS_SIZE字节长,400条
|
|
|
+* * [1024字节块][1024字节块].....共MAX_STATIC_FIELDS_SIZE字节长,200条
|
|
|
+* 每块结构:
|
|
|
+* [1个字节占用标志][块长度-2个字节数据][1个字节0]
|
|
|
+* 占用标志:0-空闲 1-占用
|
|
|
+* 请注意Fields经过优化之后,只能用于静态使用场景,即不会自动释放空间,除非调用clear或者parse
|
|
|
+*/
|
|
|
+void initAllFields() {
|
|
|
+ memset(fieldsMemory, '\0', sizeof(fieldsMemory));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//得到一个空闲块地址
|
|
|
+static char* allockOneField(int size) {
|
|
|
+ int index = 0;
|
|
|
+ int offset = 0;
|
|
|
+ int blockSize = 0;
|
|
|
+ if (size + 2 > 1024) {
|
|
|
+ return NULL;
|
|
|
+ }else if (size + 2 > 512) {
|
|
|
+ index = 5;
|
|
|
+ blockSize = 1024;
|
|
|
+ }
|
|
|
+ else if (size + 2 > 256) {
|
|
|
+ index = 4;
|
|
|
+ blockSize = 512;
|
|
|
+ }
|
|
|
+ else if (size + 2 > 128) {
|
|
|
+ index = 3;
|
|
|
+ blockSize = 256;
|
|
|
+ }
|
|
|
+ else if (size + 2 > 64) {
|
|
|
+ index = 2;
|
|
|
+ blockSize = 128;
|
|
|
+ }
|
|
|
+ else if (size + 2 > 32) {
|
|
|
+ index = 1;
|
|
|
+ blockSize = 64;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ index = 0;
|
|
|
+ blockSize = 32;
|
|
|
+ }
|
|
|
+ int blockCount = MAX_STATIC_FIELDS_SIZE / blockSize;
|
|
|
+ for (offset = 0; offset < blockCount; offset++) {
|
|
|
+ if (!fieldsMemory[index * MAX_STATIC_FIELDS_SIZE + offset * blockSize]) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (offset < blockCount) {
|
|
|
+ fieldsMemory[index * MAX_STATIC_FIELDS_SIZE + offset * blockSize] = 1;
|
|
|
+ return fieldsMemory + index * MAX_STATIC_FIELDS_SIZE + offset * blockSize+1;
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+void freeOneField(char* ptr) {
|
|
|
+ if (ptr == NULL) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ *(ptr - 1) = 0;
|
|
|
+}
|
|
|
+short Fields::size() {
|
|
|
+ return length;
|
|
|
+}
|
|
|
+Fields::Fields() {
|
|
|
+ memset(&fields, '\0', sizeof(fields));
|
|
|
+ length = 0;
|
|
|
+}
|
|
|
+void Fields::clear() {
|
|
|
+ for (int i = 0; i < MAX_PARAM_COUNT; i++) {
|
|
|
+ if (fields[i] != NULL) {
|
|
|
+ freeOneField(fields[i]);
|
|
|
+ fields[i] = NULL;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ length = 0;
|
|
|
+}
|
|
|
+void Fields::parse(const char* src, char split) {
|
|
|
+ int pos1 = 0;
|
|
|
+ int pos2 = 0;
|
|
|
+ length = 0;
|
|
|
+ clear();
|
|
|
+ if (src == NULL) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ PMCBOOL breakFlag = FALSE;
|
|
|
+ while (!breakFlag) {
|
|
|
+ if (src[pos2] == 0) {
|
|
|
+ breakFlag = TRUE;
|
|
|
+ }
|
|
|
+ if (src[pos2] == split || src[pos2] == '\0') {
|
|
|
+ if (pos2 - pos1 >= MAX_NAME_LEN) {
|
|
|
+ logger->error("String fields too long:[%.20s]", src);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (length >= MAX_PARAM_COUNT) {
|
|
|
+ logger->error("String fields too more:[%.20s]", src);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ fields[length] = allockOneField(pos2 - pos1);
|
|
|
+ if (fields[length] != NULL) {
|
|
|
+ memcpy(fields[length], src + pos1, pos2 - pos1);
|
|
|
+ fields[length][pos2 - pos1] = '\0';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ logger->error("Too more fields,please reset the MAX_STATIC_FIELDS_SIZE");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ pos1 = pos2 + 1;
|
|
|
+
|
|
|
+ //zipSpace(fields[length]);
|
|
|
+ length++;
|
|
|
+
|
|
|
+ }
|
|
|
+ pos2++;
|
|
|
+ }
|
|
|
+}
|
|
|
+char* Fields::get(short index) {
|
|
|
+ if (index < 0 || index >= length) {
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return fields[index];
|
|
|
+}
|
|
|
+#ifdef _DEBUG
|
|
|
+char* Fields::getValue(const char* key, const char* file , int line) {
|
|
|
+ size_t keyLen = strlen(key);
|
|
|
+ if (keyLen >= MAX_NAME_LEN - 1) {
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ static char keyEqual[MAX_NAME_LEN];
|
|
|
+ strcpy_debug(keyEqual, key, sizeof(keyEqual), file, line);
|
|
|
+ strcat(keyEqual, "=");
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
+ if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
|
|
|
+ return fields[i] + keyLen + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+#else
|
|
|
+char* Fields::getValue(const char* key) {
|
|
|
+ size_t keyLen = strlen(key);
|
|
|
+ if (keyLen >= MAX_NAME_LEN - 1) {
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ static char keyEqual[MAX_NAME_LEN];
|
|
|
+ strcpy(keyEqual, key);
|
|
|
+ strcat(keyEqual, "=");
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
+ if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
|
|
|
+ return fields[i] + keyLen + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+#endif
|