HW_Lib/lib/utils/argpase.cpp

107 lines
2.5 KiB
C++

#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include "argpase.h"
char *Optarg, *Optstr;
int Optindex = 0;
OptList *Options_Creat(char *name, OptId index) {
OptList *p;
p = (OptList *) malloc(sizeof(OptList));
memset(p, 0, sizeof(OptList));
Option *opt = (Option *) malloc(sizeof(Option));
memset(opt, 0, sizeof(Option));
opt->name = name;
opt->id = index;
p->Option = opt;
p->next = NULL;
return p;
}
OptList *Options_CreatOpt(Option *opt) {
OptList *p;
p = (OptList *) malloc(sizeof(OptList));
memset(p, 0, sizeof(OptList));
p->Option = opt;
p->next = NULL;
return p;
}
void Options_Add(OptList *opts, OptList *opt) {
OptList *p = opts;
while (NULL != p->next) {
p = p->next;
}
p->next = opt;
}
bool Options_Del(OptList *opts, char *opt) {
//获取当前头节点的位置
OptList *p = opts;
OptList *prev = NULL;
while (NULL != p->next) {
//保存当前节点的前一个节点的指针
prev = p;
//然后让当前的指针继续往后移动
p = p->next;
//判断,找到了要删除的数据
if (0 == strcmp(p->Option->name, opt)) {
//两种情况,一种是普通节点,还有一种是尾节点
if (p->next != NULL) //普通节点的情况
{
prev->next = p->next;
free(p);
} else //尾节点的情况
{
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
free(p);
}
return true;
}
}
return false;
}
void Options_Print(OptList *opts) {
OptList *p = opts;
while (NULL != p) {
printf("Option[%d]:%s\n", p->Option->id, p->Option->name);
p = p->next;
}
}
OptId Options_Load(OptList *opts, char *argv[], size_t argc) {
OptList *p = opts;
OptId id = -2;
while (NULL != p) {
if (0 == strcmp(p->Option->name, argv[Optindex])) {
Optarg = argv[Optindex + 1];
Optstr = p->Option->name;
id = p->Option->id;
}
p = p->next;
}
Optindex++;
if (Optindex >= argc) {
return -1;
}
return id;
}
size_t Str_To_Args(char *str, char *argv[]) {
char *p;
size_t argc = 0;
size_t l = strlen(str);
char *buf = (char *) malloc(sizeof(char) * l + 1);
strcpy(buf, str);
p = strtok(buf, " ");
while (p) {
argv[argc] = p;
argc++;
p = strtok(NULL, " ");
}
return argc;
}