快速排序法

// vos_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "vos.h"

#define TABLE_MID_MACHINE_NAME     "midmachine"
#define TABLE_MIDMACH_COLNAME_ID   "id"
#define TABLE_MIDMACH_COLNAME_IP   "ip"
#define TABLE_MIDMACH_ACTIVE_FLAG  "activeflag"
#define TABLE_MIDMACH_COLNAME_MACH "name"

#define APP_NULL VOS_NULL
#define app_u32 vos_u32
#define app_void vos_void

typedef struct
{
 app_u32 ulcommandid;  //命令字ID
 app_u32 ulseq;        //序号,规则每个命令字都对应一批序号,从0开始,即对每个命令下到对应pid进行时序控制
 app_u32 uldstpid;     //目标PID
} st_oamreg_map;

STATIC st_oamreg_map* g_stoamregmap = APP_NULL;
STATIC app_u32 g_maxoamregnum = 100;

#define MAKE_CMDSEQ(STOBJ) ((STOBJ.ulcommandid << 8) | STOBJ.ulseq)

//快速排序法
void Qsort(st_oamreg_map a[], int low, int high)
{
 if (low >= high)
 {
  return;
 }

 int first = low;
 int last = high;
 int keyvalue = 0;
 int lastvalue = 0;
 int firstvalue = 0;

 st_oamreg_map key;
 memset(&key, 0, sizeof(st_oamreg_map));
 memcpy(&key, &a[first], sizeof(st_oamreg_map));
 keyvalue = MAKE_CMDSEQ(key);

 while (first < last)
 {
  while ((first < last) && ((lastvalue = MAKE_CMDSEQ(a[last])) >= keyvalue)) --last;

  memcpy(&a[first], &a[last], sizeof(st_oamreg_map));

  while ((first < last) && ((firstvalue = MAKE_CMDSEQ(a[first])) <= keyvalue)) ++first;

  memcpy(&a[last], &a[first], sizeof(st_oamreg_map));
 }

 memcpy(&a[first], &key, sizeof(st_oamreg_map));

 Qsort(a, low, first-1);
 Qsort(a, first+1, high);
}
static app_void app_oam_initoamregmap()
{
 app_u32 ullen = 0;
 app_u32 ulrunrslt = VOS_OK;

 ullen = sizeof(st_oamreg_map) * g_maxoamregnum;
 g_stoamregmap = (st_oamreg_map *)malloc(ullen);
 memset(g_stoamregmap, 0, ullen);
 return;
}
STATIC app_u32 app_oam_register(st_oamreg_map stcmdmap)
{
 app_u32 ulindex = 0;

 for (ulindex = 0; ulindex < g_maxoamregnum; ulindex++)
 {
  if (((stcmdmap.ulcommandid == g_stoamregmap[ulindex].ulcommandid)
   && (stcmdmap.uldstpid == g_stoamregmap[ulindex].uldstpid))
   || ((stcmdmap.ulcommandid == g_stoamregmap[ulindex].ulcommandid)
   && (stcmdmap.ulseq == g_stoamregmap[ulindex].ulseq)))
  {
   vos_syslog(-1, vos_log_type_running,
    "[Error] ulcommandid(0x%x) ulseq(%d) uldstpid(0x%x) repeat %s(%d)\r\n",
    stcmdmap.ulcommandid, (int)stcmdmap.ulseq, stcmdmap.uldstpid,
    vos_filterpathforfile((vos_u8*)__FILE__), __LINE__);
   return -1;
  }

  if ((0 == g_stoamregmap[ulindex].ulcommandid)
   && (0 == g_stoamregmap[ulindex].uldstpid)
   && (0 == g_stoamregmap[ulindex].ulseq))
  {
   g_stoamregmap[ulindex].ulcommandid = stcmdmap.ulcommandid;
   g_stoamregmap[ulindex].ulseq = stcmdmap.ulseq;
   g_stoamregmap[ulindex].uldstpid = stcmdmap.uldstpid;
   return VOS_OK;
  }
 }

 return -1;
}

STATIC app_u32 app_oam_multi_register(st_oamreg_map *pstcmdmap, app_u32 ulnum)
{
 app_u32 ulresult = VOS_OK;
 app_u32 ulindex = 0;

 for (ulindex = 0; ulindex < ulnum; ulindex++)
 {
  ulresult = app_oam_register(pstcmdmap[ulindex]);
  if (VOS_OK != ulresult)
  {
   return ulresult;
  }
 }

 //!!!这里可以进行2级排序操作,但本注册功能只在本模块使用,因此简单处理,不进行排序操作了
 //!!!维护该模块的同事需要特别注意,注册时务必保证排序正确
 //!!!先按照命令排序,然后序号排序(要求从小到大) 
 Qsort(g_stoamregmap, 0, ulnum-1);
 
 return ulresult;
}


int _tmain(int argc, _TCHAR* argv[])
{
 app_u32 ulrunrslt = VOS_OK;
 vos_u32 ulindex = 0;

 //初始化oam注册映射
 app_oam_initoamregmap();

 //!!!注意以下数组注册必须保证顺序,否则执行中时序将会出错!!!
 //!!!顺序为: 先按命令字,再按序号(从0开始,必须从小到大)!!!
 static const st_oamreg_map s_oamreg[] =
 {
  //暂停
  {0x8011, 23, 333},
  {0x8011, 0, 111},
  {0x8003, 0, 777},

  //恢复
  {0x8001, 0, 444},
  {0x8001, 1, 555},
  {0x8003, 2, 999},
  {0x8001, 2, 666},

  //停止  
  {0x8003, 1, 888},  
  {0x8003, 3, 1000},
  {0x8003, 4, 2000},
  {0x8003, 5, 3000},
  {0x8011, 1, 222},
 };


 ulrunrslt = app_oam_multi_register((st_oamreg_map*)s_oamreg, sizeof(s_oamreg)/sizeof(s_oamreg[0]));
 if (VOS_OK != ulrunrslt)
 {
  return ulrunrslt;
 }

 for (ulindex = 0; ulindex < g_maxoamregnum; ulindex++)
 {
  printf("0x%x 0x%x %d \n", g_stoamregmap[ulindex].ulcommandid,
   g_stoamregmap[ulindex].ulseq, g_stoamregmap[ulindex].uldstpid);
 }

 return VOS_OK;

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰暗角落里的琴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值