⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proprel.c

📁 OPCSERVER源代码
💻 C
字号:
/**************************************************************************
 *                                                                        *
 * Light OPC Server development library                                   *
 *                                                                        *
 *   Copyright (c) 2001 by Timofei Bondarenko                             *
                                                                          *
 ItemProperties support
 **************************************************************************/

#include "loserv.h"
#include "util.h"
#include "proplist.h"
//#include <opcerror.h>

/***************************/

void loBaseName_init(loBaseName *bn, const loTagAttrib *ta, loWchar brsep)
{
 bn->brsep = brsep;
 if (bn->base_name = ta->taName)
   {
    bn->base_level = lo_name_level(bn->brsep, bn->base_name) + ta->taName_addlevel;
    bn->base_len = wcslen(bn->base_name);
   }
 else bn->base_len = bn->base_level = 0;
}

const loWchar *lo_relative_name(loStringBuf *sb, loBaseName *bn, const loWchar *rel)
{
 loWchar brsep;

 if (!rel) return L""; 

 if ((brsep = bn->brsep) && brsep == *rel) 
   {
    unsigned d_len;

    for(d_len = 0; brsep == *(++rel); d_len++);

    d_len = d_len? (d_len >= (unsigned)bn->base_level? 
                          0: lo_name_levlen(brsep, 
                                            bn->base_name, 
                                            bn->base_level - d_len))
                 : bn->base_len;
    if (d_len) 
      {
       unsigned t_len, r_len = wcslen(rel);

       if (r_len) rel--, r_len++; /* baranch separator */
       r_len++;
       t_len = d_len + r_len;

       if (!loStringBuf_REALLOC(sb, t_len))
         return 0; /* Out of Memory */
       memcpy(sb->sb_str, bn->base_name, sizeof(loWchar) * d_len);
       memcpy(sb->sb_str + d_len, rel, sizeof(loWchar) * r_len);
       return sb->sb_str;
      }
   }
 return rel;
}

/*********************************************************************/

loTagId lo_relative_tag(loRelName *rn, const loWchar *rel, int ai_goal/*, HRESULT *err*/)
{
 loTagId ti = 0;
 HRESULT hr = S_OK;

 if (rel && *rel)
   {       
    const loWchar *itid = lo_relative_name(&rn->sb, &rn->bn, rel);

    if (!itid) hr = E_OUTOFMEMORY; 
    else if (*itid)
      ti = loFindItemID(rn->se, rn->cactx, rn->locked, itid, 0, 
                        VT_EMPTY, ai_goal, 0, &hr);
   }
 rn->err = hr;
 return ti;
}

/* end of proprel.c */ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -