1
0
mirror of https://github.com/NevermindZZT/letter-shell.git synced 2025-01-21 10:02:54 +08:00
letter-shell/shell_ext.c

315 lines
6.3 KiB
C
Raw Normal View History

2019-01-07 20:16:18 +08:00
/**
* @file shell_ext.c
* @author Letter (NevermindZZT@gmail.com)
* @brief shell extensions
* @version 1.0.0
* @date 2019-01-05
*
* @Copyright (c) 2019 Letter
*
*/
#include "shell_cfg.h"
2019-01-07 20:16:18 +08:00
#include "shell.h"
#include "shell_ext.h"
/**
* @brief
*
* @param string
* @return NUM_Type
*/
static NUM_Type shellExtNumType(char *string)
{
char *p = string;
NUM_Type type = NUM_TYPE_INT;
if ((*p == '0') && ((*(p + 1) == 'x') || (*(p + 1) == 'X')))
{
type = NUM_TYPE_HEX;
}
2019-01-14 19:39:33 +08:00
else if ((*p == '0') && ((*(p + 1) == 'b') || (*(p + 1) == 'B')))
{
type = NUM_TYPE_BIN;
}
2019-01-07 20:16:18 +08:00
else if (*p == '0')
{
type = NUM_TYPE_OCT;
}
2019-04-10 22:21:01 +08:00
while (*p++)
2019-01-07 20:16:18 +08:00
{
2019-04-10 22:21:01 +08:00
if (*p == '.' && *(p + 1) != 0)
2019-01-07 20:16:18 +08:00
{
2019-04-10 22:21:01 +08:00
type = NUM_TYPE_FLOAT;
break;
2019-01-07 20:16:18 +08:00
}
}
return type;
}
/**
* @brief
*
* @param code
* @return char
*/
static char shellExtToNum(char code)
{
if ((code >= '0') && (code <= '9'))
{
return code -'0';
}
else if ((code >= 'a') && (code <= 'f'))
{
return code - 'a' + 10;
}
else if ((code >= 'A') && (code <= 'F'))
{
return code - 'A' + 10;
}
else
{
return 0;
}
}
/**
* @brief
*
* @param string
* @return char
*/
static char shellExtParseChar(char *string)
{
char *p = string + 1;
char value = 0;
if (*p == '\\')
{
switch (*(p + 1))
{
case 'b':
value = '\b';
break;
case 'r':
value = '\r';
break;
case 'n':
value = '\n';
break;
case 't':
value = '\t';
break;
case '0':
value = 0;
break;
default:
value = *(p + 1);
break;
}
}
else
{
value = *p;
}
return value;
}
/**
* @brief
*
* @param string
* @return char*
*/
static char* shellExtParseString(char *string)
{
char *p = string;
unsigned short index = 0;
if (*string == '\"')
{
p = ++string;
}
while (*p)
{
if (*p == '\\')
{
*(string + index) = shellExtParseChar(p - 1);
p++;
}
else if (*p == '\"')
{
*(string + index) = 0;
}
else
{
*(string + index) = *p;
}
p++;
index ++;
}
*(string + index) = 0;
return string;
}
/**
* @brief
*
* @param string
* @return unsigned int
*/
static unsigned int shellExtParseNumber(char *string)
{
NUM_Type type = NUM_TYPE_INT;
char radix = 10;
char *p = string;
char offset = 0;
signed char sign = 1;
unsigned int valueInt = 0;
2019-04-10 22:21:01 +08:00
float valueFloat = 0.0;
unsigned int devide = 0;
2019-01-07 20:16:18 +08:00
if (*string == '-')
{
sign = -1;
}
type = shellExtNumType(string + ((sign == -1) ? 1 : 0));
switch ((char)type)
{
case NUM_TYPE_HEX:
radix = 16;
offset = 2;
break;
case NUM_TYPE_OCT:
radix = 8;
offset = 1;
break;
2019-01-14 19:39:33 +08:00
case NUM_TYPE_BIN:
radix = 2;
offset = 2;
break;
2019-01-07 20:16:18 +08:00
default:
break;
}
p = string + offset + ((sign == -1) ? 1 : 0);
2019-04-10 22:21:01 +08:00
while (*p)
2019-01-07 20:16:18 +08:00
{
2019-04-10 22:21:01 +08:00
if (*p == '.')
2019-01-07 20:16:18 +08:00
{
2019-04-10 22:21:01 +08:00
devide = 1;
2019-01-07 20:16:18 +08:00
p++;
2019-04-10 22:21:01 +08:00
continue;
2019-01-07 20:16:18 +08:00
}
2019-04-10 22:21:01 +08:00
valueInt = valueInt * radix + shellExtToNum(*p);
devide *= 10;
p++;
}
if (type == NUM_TYPE_FLOAT && devide != 0)
{
valueFloat = (float)valueInt / devide * sign;
return *(unsigned int *)(&valueFloat);
}
else
{
2019-01-07 20:16:18 +08:00
return valueInt * sign;
}
}
/**
* @brief
*
* @param string
* @return unsigned int
*/
2019-01-14 19:39:33 +08:00
unsigned int shellExtParsePara(char *string)
2019-01-07 20:16:18 +08:00
{
if (*string == '\'' && *(string + 1))
{
return (unsigned int)shellExtParseChar(string);
}
else if (*string == '-' || (*string >= '0' && *string <= '9'))
{
return (unsigned int)shellExtParseNumber(string);
}
#if SHELL_USING_VAR == 1
else if (*string == '$' && *(string + 1))
{
return (unsigned int )shellGetVariable(shellGetCurrent(), string);
}
#endif /** SHELL_USING_VAR == 1 */
2019-01-07 20:16:18 +08:00
else if (*string)
{
return (unsigned int)shellExtParseString(string);
}
return 0;
}
/**
* @brief
*
* @param function
* @param argc
* @param argv
* @return int
*/
int shellExtRun(shellFunction function, int argc, char *argv[])
{
switch (argc)
{
case 1:
2019-03-14 19:49:14 +08:00
return function();
// break;
2019-01-07 20:16:18 +08:00
case 2:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]));
// break;
2019-01-07 20:16:18 +08:00
case 3:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]));
// break;
2019-01-07 20:16:18 +08:00
case 4:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]),
shellExtParsePara(argv[3]));
// break;
2019-01-07 20:16:18 +08:00
case 5:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]),
shellExtParsePara(argv[3]), shellExtParsePara(argv[4]));
// break;
2019-01-07 20:16:18 +08:00
case 6:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]),
shellExtParsePara(argv[3]), shellExtParsePara(argv[4]),
shellExtParsePara(argv[5]));
// break;
2019-01-07 20:16:18 +08:00
case 7:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]),
shellExtParsePara(argv[3]), shellExtParsePara(argv[4]),
shellExtParsePara(argv[5]), shellExtParsePara(argv[6]));
// break;
2019-01-07 20:16:18 +08:00
case 8:
2019-03-14 19:49:14 +08:00
return function(shellExtParsePara(argv[1]), shellExtParsePara(argv[2]),
shellExtParsePara(argv[3]), shellExtParsePara(argv[4]),
shellExtParsePara(argv[5]), shellExtParsePara(argv[6]),
shellExtParsePara(argv[7]));
// break;
2019-01-07 20:16:18 +08:00
default:
return -1;
// break;
}
}