📄 cmdsort.c
字号:
#define MAX_ITEM_LEN 15
#define MAX_ITEM_NUM 32
//#define START_ASCII 0x2B //"+"
//#define SORT_MAP_LEN 48 //" + , - . / 0 1 ...... X Y Z " 48 chars at total.
typedef rom struct{
INT8U NextSn;
INT8U Len;
INT8U Data[MAX_ITEM_LEN+1];
}ITEM_STRUCT;
ITEM_STRUCT ItemTable[MAX_ITEM_NUM];
INT8U MaxItemNum;
/*
rom INT8U ItemMapTbl[SORT_MAP_LEN]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}
*/
void ItemTableInit(void)
{
INT8U i,j;
MaxItemNum=0;
for(i=0;i<MAX_ITEM_NUM;i++){
ItemTable[i].NextSn=0xFF;
ItemTable[i].Len=0;
for(j=0;j<MAX_ITEM_LEN+1;j++)
ItemTable[i].Data[j]=0x00;
}
}
char CmpItem(ITEM_STRUCT *pitem,INT8U *pdata,INT8U len)
{
int8U i;
for(i=0;i<pitem->Len;i++){
if(len<=i)
return(1)
if(pitem->Data[i]>pdata[i])
return(1);
else if(pitem->Data[i]<pdata[i])
return(-1);
}
}
INT8U AddItem(INT8U *pdata,INT8U len)
{
INT8U i,j;
INT8U sn,pos;
sn=0;
pos=0;
//Check if the string and its length are legal.
if(len<=0)
return(ITEM_ERR);
for(i=0;i<len;i++){
if(pdata[i]==0x00) // or other limitation
break;
pos++;
}
if(pos!=len)
return(ITEM_ERR);
//If it is the Fisrt Item
if(MaxItemNum==0){
for(i=0;i<len;i++)
ItemTable[sn].Data[i]=pdata[i];
//ItemTable[sn].Data[len]=0x00;
//ItemTable[sn].NextSn=0xFF;
ItemTable[sn].Len=len;
MaxItemNum++;
return(ITEM_OK);
}
//If ItemTable[] is full
if(MaxItemNum>=MAX_ITEM_NUM)
return(ITEM_FULL);
//Sort the items in "small-->big" order
while(CmpItem(&ItemTable[sn],pdata,len)<=0){
sn++;
if(sn==MaxItemNum) // No item bigger than this one.
break;
}
//Move the items of (sn,sn+1,...,MaxItemNum-1) to the next position
for(i=MaxItemNum-1;i>=sn;i++){
ItemTable[i+1].Len=ItemTable[i].Len;
ItemTable[i+1].NextSn=ItemTable[i].NextSn;
for(j=0;j<MAX_ITEM_LEN;j++)
ItemTable[i+1].Data[j]=ItemTable[i].Data[j];
}
//Fill the current item (sn)
for(i=0;i<len;i++)
ItemTable[sn].Data[i]=pdata[i];
ItemTable[sn].Data[len]=0x00;
ItemTable[sn].Len=len;
//File the *.NextSn of the item(sn-1)
for(i=0;i<=ItemTable[sn-1].Len;i++){
if(ItemTable[sn-1].Data[i]!=ItemTable[sn].Data[i]){
if(pos==0)
ItemTable[sn-1].NextSn=0xff;
else
ItemTable[sn-1].NextSn=sn;
pos=i;
break; //break from "for"
}
}
//File the *.NextSn of the item(sn)
if(sn==MaxItemNum)
ItemTable[sn].NextSn=0xFF;
else{
for(i=0;i<=ItemTable[sn].Len;i++){
if(ItemTable[sn].Data[i]!=ItemTable[sn+1].Data[i]){
if(i<pos)
ItemTable[sn].NextSn=0xff;
else
ItemTable[sn].NextSn=sn+1;
break;
}
}
}
MaxItemNum++;
return(ITEM_OK);
}
INT8U ItemSort(rom INT8U *start,rom INT8U *newstart)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -