ProviewR Programmer's Reference Manual  V6.1.4
co_cdh.c
Go to the documentation of this file.
1 
38 /* co_cdh.c -- class definition handler
39  This module contains the API-routines to the
40  Class Definition Handler, CDH. */
41 
42 #include <ctype.h>
43 #include <errno.h>
44 #include <math.h>
45 #include <stddef.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48 
49 #include "co_cdh_msg.h"
50 #include "co_cdh.h"
51 #include "co_string.h"
52 #include "co_time.h"
53 
59 
61 
67 int cdh_ObjidCompare(pwr_tObjid Objid_1, pwr_tObjid Objid_2)
68 {
69  if (Objid_1.vid == Objid_2.vid) {
70  if (Objid_1.oix == Objid_2.oix)
71  return 0;
72  else if (Objid_1.oix < Objid_2.oix)
73  return -1;
74  else
75  return 1;
76  } else if (Objid_1.vid < Objid_2.vid)
77  return -1;
78  else
79  return 1;
80 }
81 
83 
88 int cdh_ObjidIsEqual(pwr_tObjid Objid_1, pwr_tObjid Objid_2)
89 {
90  return (Objid_1.vid == Objid_2.vid) && (Objid_1.oix == Objid_2.oix);
91 }
92 
94 
100 {
101  return (Objid_1.vid != Objid_2.vid) || (Objid_1.oix != Objid_2.oix);
102 }
103 
105 
111 {
112  return (Objid.vid == pwr_cNObjid.vid) && (Objid.oix == pwr_cNObjid.oix);
113 }
114 
116 
122 {
123  return (Objid.vid != pwr_cNObjid.vid) || (Objid.oix != pwr_cNObjid.oix);
124 }
125 
126 int cdh_RefIdCompare(pwr_tRefId Reference_1, pwr_tRefId Reference_2)
127 {
128  return cdh_ObjidCompare(
129  *(pwr_tObjid*)&Reference_1, *(pwr_tObjid*)&Reference_2);
130 }
131 
132 int cdh_RefIdIsEqual(pwr_tRefId Reference_1, pwr_tRefId Reference_2)
133 {
134  return cdh_ObjidIsEqual(
135  *(pwr_tObjid*)&Reference_1, *(pwr_tObjid*)&Reference_2);
136 }
137 
138 int cdh_RefIdIsNotEqual(pwr_tRefId Reference_1, pwr_tRefId Reference_2)
139 {
140  return cdh_ObjidIsNotEqual(
141  *(pwr_tObjid*)&Reference_1, *(pwr_tObjid*)&Reference_2);
142 }
143 
144 int cdh_RefIdIsNull(pwr_tRefId Reference)
145 {
146  return cdh_ObjidIsNull(*(pwr_tObjid*)&Reference);
147 }
148 
149 int cdh_RefIdIsNotNull(pwr_tRefId Reference)
150 {
151  return cdh_ObjidIsNotNull(*(pwr_tObjid*)&Reference);
152 }
153 
154 int cdh_SubidCompare(pwr_tSubid Subscription_1, pwr_tSubid Subscription_2)
155 {
156  return cdh_ObjidCompare(
157  *(pwr_tObjid*)&Subscription_1, *(pwr_tObjid*)&Subscription_2);
158 }
159 
160 int cdh_SubidIsEqual(pwr_tSubid Subscription_1, pwr_tSubid Subscription_2)
161 {
162  return cdh_ObjidIsEqual(
163  *(pwr_tObjid*)&Subscription_1, *(pwr_tObjid*)&Subscription_2);
164 }
165 
166 int cdh_SubidIsNotEqual(pwr_tSubid Subscription_1, pwr_tSubid Subscription_2)
167 {
168  return cdh_ObjidIsNotEqual(
169  *(pwr_tObjid*)&Subscription_1, *(pwr_tObjid*)&Subscription_2);
170 }
171 
172 int cdh_SubidIsNull(pwr_tSubid Subscription)
173 {
174  return cdh_ObjidIsNull(*(pwr_tObjid*)&Subscription);
175 }
176 
177 int cdh_SubidIsNotNull(pwr_tSubid Subscription)
178 {
179  return cdh_ObjidIsNotNull(*(pwr_tObjid*)&Subscription);
180 }
181 
182 int cdh_DlidCompare(pwr_tDlid DirectLink_1, pwr_tDlid DirectLink_2)
183 {
184  return cdh_ObjidCompare(
185  *(pwr_tObjid*)&DirectLink_1, *(pwr_tObjid*)&DirectLink_2);
186 }
187 
188 int cdh_DlidIsEqual(pwr_tDlid DirectLink_1, pwr_tDlid DirectLink_2)
189 {
190  return cdh_ObjidIsEqual(
191  *(pwr_tObjid*)&DirectLink_1, *(pwr_tObjid*)&DirectLink_2);
192 }
193 
194 int cdh_DlidIsNotEqual(pwr_tDlid DirectLink_1, pwr_tDlid DirectLink_2)
195 {
196  return cdh_ObjidIsNotEqual(
197  *(pwr_tObjid*)&DirectLink_1, *(pwr_tObjid*)&DirectLink_2);
198 }
199 
200 int cdh_DlidIsNull(pwr_tDlid DirectLink)
201 {
202  return cdh_ObjidIsNull(*(pwr_tObjid*)&DirectLink);
203 }
204 
205 int cdh_DlidIsNotNull(pwr_tDlid DirectLink)
206 {
207  return cdh_ObjidIsNotNull(*(pwr_tObjid*)&DirectLink);
208 }
209 
210 int cdh_ArefIsEqual(pwr_sAttrRef* arp1, pwr_sAttrRef* arp2)
211 {
212  if (arp1->Flags.b.Object && arp2->Flags.b.Object)
213  return (arp1->Objid.vid == arp2->Objid.vid
214  && arp1->Objid.oix == arp2->Objid.oix);
215  else
216  return (arp1->Objid.vid == arp2->Objid.vid
217  && arp1->Objid.oix == arp2->Objid.oix && arp1->Offset == arp2->Offset
218  && (arp1->Size == 0 || arp2->Size == 0 || arp1->Size == arp2->Size));
219 }
220 
222 
228 {
229  cdh_uTypeId cid;
230  cdh_uObjid oid;
231 
232  oid.pwr = Objid;
233 
234  cid.c.bix = 0;
235  cid.c.cix = oid.c.cix;
236  cid.c.must_be_zero = 0;
237  cid.c.vid_0 = oid.c.vid_0;
238  cid.c.vid_1 = oid.c.vid_1;
239 
240  return (pwr_tClassId)cid.pwr;
241 }
242 
244 
250 {
251  cdh_uObjid oid;
252  cdh_uTypeId cid;
253 
254  cid.pwr = Class;
255 
256  oid.c.aix = 0;
257  oid.c.reserved = 0;
258  oid.c.bix = 0;
259  oid.c.cix = cid.c.cix;
260  oid.c.must_be_two = 2;
261  oid.c.vid_0 = cid.c.vid_0;
262  oid.c.vid_1 = cid.c.vid_1;
263  oid.c.vid_2 = 0;
264  oid.c.vid_3 = 0;
265 
266  return oid.pwr;
267 }
268 
270 
276 {
277  cdh_uObjid oid;
278  cdh_uTypeId tid;
279 
280  oid.pwr = Objid;
281 
282  if (oid.t.must_be_three == 2) {
283  /* We have a class body. */
284  tid.c.bix = oid.c.bix;
285  tid.c.cix = oid.c.cix;
286  tid.c.must_be_zero = 0;
287  tid.c.vid_0 = oid.c.vid_0;
288  tid.c.vid_1 = oid.c.vid_1;
289  } else if (oid.t.must_be_three == 3) {
290  /* We have a type. */
291  tid.t.tix = oid.t.tix;
292  tid.t.tyg = oid.t.tyg;
293  tid.t.must_be_one = 1;
294  tid.t.vid_0 = oid.t.vid_0;
295  tid.t.vid_1 = oid.t.vid_1;
296  } else {
297  // TODO: We have an error.
298  tid.t.tix = oid.t.tix;
299  tid.t.tyg = oid.t.tyg;
300  tid.t.must_be_one = 1;
301  tid.t.vid_0 = oid.t.vid_0;
302  tid.t.vid_1 = oid.t.vid_1;
303  }
304 
305  return tid.pwr;
306 }
307 
309 
311 {
312  cdh_uTypeId tid;
313 
314  tid.pwr = Type;
315 
316  return tid.t.tix;
317 }
318 
320 
322 {
323  cdh_uObjid oid;
324  cdh_uTypeId tid;
325 
326  tid.pwr = Type;
327 
328  if (tid.t.must_be_one == 1) {
329  oid.t.aix = 0;
330  oid.t.reserved = 0;
331  oid.t.tix = tid.t.tix;
332  oid.t.tyg = tid.t.tyg;
333  oid.t.must_be_three = 3;
334  oid.t.vid_0 = tid.t.vid_0;
335  oid.t.vid_1 = tid.t.vid_1;
336  oid.t.vid_2 = 0;
337  oid.t.vid_3 = 0;
338  } else {
339  oid.c.aix = 0;
340  oid.c.reserved = 0;
341  oid.c.bix = tid.c.bix;
342  oid.c.cix = tid.c.cix;
343  oid.c.must_be_two = 2;
344  oid.c.vid_0 = tid.c.vid_0;
345  oid.c.vid_1 = tid.c.vid_1;
346  oid.c.vid_2 = 0;
347  oid.c.vid_3 = 0;
348  }
349 
350  return oid.pwr;
351 }
352 
355 {
356  pwr_sAttrRef a = pwr_cNAttrRef;
357  a.Objid = Objid;
358  a.Flags.b.Object = 1;
359 
360  return a;
361 }
362 
364 
366  pwr_eType Type, void* Value, char* String, int MaxSize)
367 {
368  pwr_tStatus sts = CDH__SUCCESS;
369  char timbuf[24];
370 
371  switch (Type) {
372  case pwr_eType_Boolean:
373  if (*(pwr_tBoolean*)Value)
374  strcpy(String, "1");
375  else
376  strcpy(String, "0");
377  break;
378  case pwr_eType_Float32: {
379  pwr_tFloat32 f;
380  memcpy(&f, Value, sizeof(f));
381  snprintf(String, MaxSize, "%.7g", f);
382  break;
383  }
384  case pwr_eType_Float64: {
385  pwr_tFloat64 f;
386  memcpy(&f, Value, sizeof(f));
387  snprintf(String, MaxSize, "%.17g", f);
388  break;
389  }
390  case pwr_eType_Char:
391  if (*(pwr_tChar*)Value == 0)
392  *String = '\0';
393  else
394  sprintf(String, "%c", *(pwr_tChar*)Value);
395  break;
396  case pwr_eType_Int8:
397  snprintf(String, MaxSize, "%d", *(pwr_tInt8*)Value);
398  break;
399  case pwr_eType_Int16:
400  snprintf(String, MaxSize, "%hd", *(pwr_tInt16*)Value);
401  break;
402  case pwr_eType_Int32:
403  case pwr_eType_Status:
404  case pwr_eType_NetStatus:
405  case pwr_eType_Enum:
406  snprintf(String, MaxSize, "%d", *(pwr_tInt32*)Value);
407  break;
408  case pwr_eType_Int64:
409  snprintf(String, MaxSize, pwr_dFormatInt64, *(pwr_tInt64*)Value);
410  break;
411  case pwr_eType_UInt8:
412  snprintf(String, MaxSize, "%u", *(pwr_tUInt8*)Value);
413  break;
414  case pwr_eType_UInt16:
415  snprintf(String, MaxSize, "%hu", *(pwr_tUInt16*)Value);
416  break;
417  case pwr_eType_UInt32:
418  case pwr_eType_Mask:
419  snprintf(String, MaxSize, "%u", *(pwr_tUInt32*)Value);
420  break;
421  case pwr_eType_UInt64:
422  snprintf(String, MaxSize, pwr_dFormatUInt64, *(pwr_tUInt64*)Value);
423  break;
424  case pwr_eType_Time:
425  if (ODD(time_AtoAscii(
426  Value, time_eFormat_DateAndTime, timbuf, sizeof(timbuf)))) {
427  strncpy(String, timbuf, MaxSize);
428  } else {
429  strncpy(String, "*** Bad time value ***", MaxSize);
430  sts = CDH__INVTIME;
431  }
432  break;
433  case pwr_eType_DeltaTime:
434  if (ODD(time_DtoAscii(Value, 1, timbuf, sizeof(timbuf)))) {
435  strncpy(String, timbuf, MaxSize);
436  } else {
437  strncpy(String, "*** Bad delta time value ***", MaxSize);
438  sts = CDH__INVDELTATIME;
439  }
440  break;
441  case pwr_eType_String:
442  case pwr_eType_Text:
443  snprintf(String, MaxSize, "%s", (char*)Value);
444  break;
445  case pwr_eType_ProString: {
446  int len = MIN(strlen((char*)Value), MaxSize-1);
447  int i;
448  strcpy(String, "");
449  for (i = 0; i < len; i++)
450  strcat(String, "*");
451  break;
452  }
453  default:
454  sts = CDH__INVTYPE;
455  break;
456  }
457 
458  String[MaxSize - 1] = 0;
459  return sts;
460 }
461 
464 
466  pwr_eType Type, const char* String, void* Value)
467 {
468  pwr_tStatus sts = CDH__SUCCESS;
469  pwr_tBoolean bval = 0;
470  pwr_tInt8 i8val = 0;
471  pwr_tInt16 i16val = 0;
472  pwr_tInt32 i32val = 0;
473  pwr_tInt64 i64val = 0;
474  pwr_tUInt8 ui8val = 0;
475  pwr_tUInt16 ui16val = 0;
476  pwr_tUInt32 ui32val = 0;
477  pwr_tUInt64 ui64val = 0;
478  pwr_tFloat32 f32val = 0.0;
479  pwr_tFloat64 f64val = 0.0;
480  pwr_tClassId cidval = pwr_cNClassId;
481  pwr_tTypeId tidval = pwr_cNTypeId;
482  pwr_tObjectIx oixval = pwr_cNObjectIx;
483  pwr_tVolumeId vidval = pwr_cNVolumeId;
484  pwr_tTime timeval;
485  pwr_tDeltaTime dtimeval;
486  char timbuf[24];
487  unsigned int timlen;
488  char* endp;
489 
490  errno = 0;
491 
492  pwr_Assert(String != NULL);
493  pwr_Assert(Value != NULL);
494 
495  switch (Type) {
496  case pwr_eType_Boolean:
497  if (*String != '\0') {
498  i32val = strtoul(String, &endp, 0);
499  if (errno == ERANGE || *endp != '\0' || (i32val != 0 && i32val != 1)) {
500  sts = CDH__INVBOOL;
501  break;
502  }
503  }
504  bval = i32val;
505  memcpy(Value, &bval, sizeof(bval));
506  break;
507 
508  case pwr_eType_Float32:
509  if (*String != '\0') {
510  f64val = strtod(String, &endp);
511  if (errno == ERANGE || *endp != '\0' || fabs(f64val) > FLT_MAX) {
512  sts = CDH__INVFLOAT32;
513  break;
514  }
515  }
516  f32val = f64val;
517  memcpy(Value, &f32val, sizeof(f32val));
518  break;
519 
520  case pwr_eType_Float64:
521  if (*String != '\0') {
522  f64val = strtod(String, &endp);
523  if (errno == ERANGE || *endp != '\0' || fabs(f64val) > DBL_MAX) {
524  sts = CDH__INVFLOAT64;
525  break;
526  }
527  }
528  memcpy(Value, &f64val, sizeof(f64val));
529  break;
530 
531  case pwr_eType_Char:
532  *((char*)Value) = *String;
533  break;
534 
535  case pwr_eType_Int8:
536  if (*String != '\0') {
537  i32val = strtol(String, &endp, 0);
538  if (errno == ERANGE || *endp != '\0' || i32val > SCHAR_MAX
539  || i32val < SCHAR_MIN) {
540  sts = CDH__INVINT8;
541  break;
542  }
543  }
544  i8val = i32val;
545  memcpy(Value, &i8val, sizeof(i8val));
546  break;
547 
548  case pwr_eType_Int16:
549  if (*String != '\0') {
550  i32val = strtol(String, &endp, 0);
551  if (errno == ERANGE || *endp != '\0' || i32val > SHRT_MAX
552  || i32val < SHRT_MIN) {
553  sts = CDH__INVINT16;
554  break;
555  }
556  }
557  i16val = i32val;
558  memcpy(Value, &i16val, sizeof(i16val));
559  break;
560 
561  case pwr_eType_Int32:
562  case pwr_eType_Status:
563  case pwr_eType_NetStatus:
564  case pwr_eType_Enum:
565  if (*String != '\0') {
566  i32val = strtol(String, &endp, 0);
567  if (errno == ERANGE || *endp != '\0' || i32val > INT_MAX
568  || i32val < INT_MIN) {
569  sts = CDH__INVINT32;
570  break;
571  }
572  }
573  memcpy(Value, &i32val, sizeof(i32val));
574  break;
575 
576  case pwr_eType_Int64:
577  if (*String != '\0') {
578  if (sscanf(String, pwr_dFormatInt64, &i64val) != 1) {
579  sts = CDH__INVINT32;
580  break;
581  }
582  }
583  memcpy(Value, &i64val, sizeof(i64val));
584  break;
585 
586  case pwr_eType_UInt8:
587  while (*String && isspace(*String))
588  String++;
589  if (*String != '\0') {
590  ui32val = strtoul(String, &endp, 0);
591  if (errno == ERANGE || *endp != '\0' || ui32val > UCHAR_MAX
592  || *String == '-') {
593  sts = CDH__INVUINT8;
594  break;
595  }
596  }
597  ui8val = ui32val;
598  memcpy(Value, &ui8val, sizeof(ui8val));
599  break;
600 
601  case pwr_eType_UInt16:
602  while (*String && isspace(*String))
603  String++;
604  if (*String != '\0') {
605  ui32val = strtoul(String, &endp, 0);
606  if (errno == ERANGE || *endp != '\0' || ui32val > USHRT_MAX
607  || *String == '-') {
608  sts = CDH__INVUINT16;
609  break;
610  }
611  }
612  ui16val = ui32val;
613  memcpy(Value, &ui16val, sizeof(ui16val));
614  break;
615 
616  case pwr_eType_UInt32:
617  case pwr_eType_Mask:
618  while (*String && isspace(*String))
619  String++;
620  if (*String != '\0') {
621  ui32val = strtoul(String, &endp, 0);
622  if (errno == ERANGE || *endp != '\0' || ui32val > UINT_MAX
623  || *String == '-') {
624  sts = CDH__INVUINT32;
625  break;
626  }
627  }
628  memcpy(Value, &ui32val, sizeof(ui32val));
629  break;
630 
631  case pwr_eType_UInt64:
632  if (*String != '\0') {
633  if (sscanf(String, pwr_dFormatUInt64, &ui64val) != 1) {
634  sts = CDH__INVUINT32;
635  break;
636  }
637  }
638  memcpy(Value, &ui64val, sizeof(ui64val));
639  break;
640 
641  case pwr_eType_String:
642  case pwr_eType_Text:
643  case pwr_eType_ProString:
644  strcpy(Value, String);
645  break;
646 
647  case pwr_eType_Time:
648  timlen = strlen(String);
649  if (timlen > 23) {
650  sts = CDH__INVTIME;
651  break;
652  }
653  memcpy(timbuf, String, MIN(sizeof(timbuf), timlen));
654  timbuf[MIN(sizeof(timbuf), timlen)] = '\0';
655  sts = time_AsciiToA(timbuf, &timeval);
656  if (EVEN(sts)) {
657  sts = CDH__INVTIME;
658  break;
659  }
660  memcpy(Value, &timeval, sizeof(timeval));
661  break;
662 
663  case pwr_eType_DeltaTime:
664  timlen = strlen(String);
665  if (timlen > 23) {
666  sts = CDH__INVDELTATIME;
667  break;
668  }
669  memcpy(timbuf, String, MIN(sizeof(timbuf), timlen));
670  timbuf[MIN(sizeof(timbuf), timlen)] = '\0';
671  sts = time_AsciiToD(timbuf, &dtimeval);
672  if (EVEN(sts)) {
673  sts = CDH__INVDELTATIME;
674  break;
675  }
676  memcpy(Value, &dtimeval, sizeof(dtimeval));
677  break;
678 
679  case pwr_eType_ClassId:
680  while (*String && isspace(*String))
681  String++;
682  if (*String != '\0') {
683  sts = cdh_StringToClassId(String, &cidval);
684  if (EVEN(sts))
685  break;
686  }
687  memcpy(Value, &cidval, sizeof(cidval));
688  break;
689 
690  case pwr_eType_VolumeId:
691  while (*String && isspace(*String))
692  String++;
693  if (*String != '\0') {
694  sts = cdh_StringToVolumeId(String, &vidval);
695  if (EVEN(sts))
696  break;
697  }
698  memcpy(Value, &vidval, sizeof(vidval));
699  break;
700 
701  case pwr_eType_TypeId:
702  while (*String && isspace(*String))
703  String++;
704  if (*String != '\0') {
705  sts = cdh_StringToTypeId(String, &tidval);
706  if (EVEN(sts))
707  break;
708  }
709  memcpy(Value, &tidval, sizeof(tidval));
710  break;
711 
712  case pwr_eType_ObjectIx:
713  while (*String && isspace(*String))
714  String++;
715  if (*String != '\0') {
716  sts = cdh_StringToObjectIx(String, &oixval);
717  if (EVEN(sts))
718  break;
719  }
720  memcpy(Value, &oixval, sizeof(oixval));
721  break;
722 
723  default:
724  sts = CDH__INVTYPE;
725  break;
726  }
727 
728  return sts;
729 }
730 
733 
734 void cdh_MaskToBinaryString(unsigned int mask, int noofbits, char* str)
735 {
736  unsigned int m;
737  int i;
738 
739  m = 1 << (noofbits - 1);
740  strcpy(str, "");
741  for (i = 0; i < noofbits; i++) {
742  if (m & mask)
743  strcat(str, "1");
744  else
745  strcat(str, "0");
746  m >>= 1;
747  }
748 }
749 
751 
760 {
761  unsigned int vid_0;
762  unsigned int vid_1;
763  unsigned int cix;
764  cdh_uTypeId lcid;
765 
766  pwr_Assert(cid != NULL);
767 
768  lcid.pwr = pwr_cNClassId;
769 
770  if (*s == '_')
771  s++;
772  if (*s == 'C' || *s == 'c')
773  s++;
774 
775  if (sscanf(s, "%d.%d:%d%*s", &vid_1, &vid_0, &cix) != 3)
776  return CDH__INVCID;
777 
778  if (vid_1 > cdh_cMaxVidGroup || vid_0 > cdh_cMaxVidGroup || cix > cdh_cMaxCix)
779  return CDH__INVCID;
780 
781  lcid.c.vid_1 = vid_1;
782  lcid.c.vid_0 = vid_0;
783  lcid.c.cix = cix;
784 
785  *cid = lcid.pwr;
786 
787  return CDH__SUCCESS;
788 }
789 
791 
801 {
802  unsigned int vid_0;
803  unsigned int vid_1;
804  unsigned int vid_2;
805  unsigned int vid_3;
806  unsigned int oix;
807  cdh_uObjid loid;
808 
809  pwr_Assert(oid != NULL);
810 
811  loid.pwr = pwr_cNObjid;
812 
813  if (*s == '_')
814  s++;
815  if (*s == 'O' || *s == 'o')
816  s++;
817  if (*s == 'A' || *s == 'a')
818  s++;
819 
820  if (sscanf(s, "%d.%d.%d.%d:%u%*s", &vid_3, &vid_2, &vid_1, &vid_0, &oix) != 5)
821  return CDH__INVOID;
822 
823  if (vid_3 > cdh_cMaxVidGroup || vid_2 > cdh_cMaxVidGroup
824  || vid_1 > cdh_cMaxVidGroup || vid_0 > cdh_cMaxVidGroup) {
825  return CDH__INVOID;
826  }
827 
828  loid.o.vid_3 = vid_3;
829  loid.o.vid_2 = vid_2;
830  loid.o.vid_1 = vid_1;
831  loid.o.vid_0 = vid_0;
832  loid.o.oix = oix;
833 
834  *oid = loid.pwr;
835 
836  return CDH__SUCCESS;
837 }
838 
840 
851 {
852  char oid_str[40];
853  char body_str[40];
854  char offset_str[40];
855  char size_str[40];
856  pwr_tAttrRef a;
857  pwr_tStatus sts;
858  unsigned int idx;
859  unsigned int state;
860  const char* t;
861 
862  pwr_Assert(aref != NULL);
863 
864  idx = 0;
865  state = 0;
866  for (t = s; *t; t++) {
867  if (state == 0 && *t == '(') {
868  oid_str[idx] = 0;
869  idx = 0;
870  state++;
871  } else if (state == 1 && *t == ')') {
872  body_str[idx] = 0;
873  idx = 0;
874  state++;
875  t++;
876  if (*t != '[')
877  return CDH__INVCID;
878  } else if (state == 2 && *t == '.') {
879  offset_str[idx] = 0;
880  idx = 0;
881  state++;
882  } else if (state == 3 && *t == ']') {
883  size_str[idx] = 0;
884  state++;
885  } else {
886  if (state == 0)
887  oid_str[idx++] = *t;
888  else if (state == 1)
889  body_str[idx++] = *t;
890  else if (state == 2)
891  offset_str[idx++] = *t;
892  else if (state == 3)
893  size_str[idx++] = *t;
894  else
895  return CDH__INVCID;
896  }
897  }
898 
899  memset(&a, 0, sizeof(a));
900 
901  sts = cdh_StringToObjid(oid_str, &a.Objid);
902  if (EVEN(sts))
903  return sts;
904 
905  if (state < 1)
906  a.Flags.b.Object = 1;
907  else {
908  sts = cdh_StringToTypeId(body_str, &a.Body);
909  if (EVEN(sts))
910  return sts;
911 
912  if (state < 2)
913  a.Flags.b.Object = 1;
914  else {
915  if (sscanf(offset_str, "%u", &a.Offset) != 1)
916  return CDH__INVCID;
917  if (sscanf(size_str, "%u", &a.Size) != 1)
918  return CDH__INVCID;
919 
920  a.Flags.m = 0;
921  }
922  }
923 
924  *aref = a;
925 
926  return CDH__SUCCESS;
927 }
928 
930 
938 {
939  unsigned int vid_0;
940  unsigned int vid_1;
941  unsigned int bit;
942  unsigned int tyg;
943  unsigned int tix;
944  cdh_uTypeId ltid;
945 
946  pwr_Assert(tid != NULL);
947 
948  ltid.pwr = pwr_cNTypeId;
949 
950  if (*s == '_')
951  s++;
952  if (*s == 'T' || *s == 't')
953  s++;
954 
955  if (sscanf(s, "%d.%d:%d.%d.%d%*s", &vid_1, &vid_0, &bit, &tyg, &tix) != 5)
956  return CDH__INVTID;
957 
958  if (vid_0 > cdh_cMaxVidGroup || vid_1 > cdh_cMaxVidGroup || bit > 1)
959  return CDH__INVTID;
960 
961  if (bit == 0) { /* Class Type. */
962  if (tyg > cdh_cMaxCix || tix > cdh_cMaxBix)
963  return CDH__INVTID;
964 
965  ltid.c.vid_1 = vid_1;
966  ltid.c.vid_0 = vid_0;
967  ltid.c.must_be_zero = 0;
968  ltid.c.cix = tyg;
969  ltid.c.bix = tix;
970 
971  } else { /* Type. */
972  if (tyg > cdh_cMaxTyg || tix > cdh_cMaxTix)
973  return CDH__INVTID;
974 
975  ltid.t.vid_1 = vid_1;
976  ltid.t.vid_0 = vid_0;
977  ltid.t.must_be_one = 1;
978  ltid.t.tyg = tyg;
979  ltid.t.tix = tix;
980  }
981 
982  *tid = ltid.pwr;
983  return CDH__SUCCESS;
984 }
985 
987 
996 {
997  unsigned int vid_0;
998  unsigned int vid_1;
999  unsigned int vid_2;
1000  unsigned int vid_3;
1001  cdh_uVolumeId lvid;
1002 
1003  pwr_Assert(vid != NULL);
1004 
1005  lvid.pwr = pwr_cNVolumeId;
1006 
1007  if (*s == '_')
1008  s++;
1009  if (*s == 'V' || *s == 'v')
1010  s++;
1011  if (*s == 'O' || *s == 'o')
1012  s++;
1013  if (*s == 'A' || *s == 'a')
1014  s++;
1015 
1016  if (sscanf(s, "%d.%d.%d.%d%*s", &vid_3, &vid_2, &vid_1, &vid_0) != 4)
1017  return CDH__INVVID;
1018 
1019  if (vid_3 > cdh_cMaxVidGroup || vid_2 > cdh_cMaxVidGroup
1020  || vid_1 > cdh_cMaxVidGroup || vid_0 > cdh_cMaxVidGroup)
1021  return CDH__INVVID;
1022 
1023  lvid.v.vid_3 = vid_3;
1024  lvid.v.vid_2 = vid_2;
1025  lvid.v.vid_1 = vid_1;
1026  lvid.v.vid_0 = vid_0;
1027 
1028  *vid = lvid.pwr;
1029 
1030  return CDH__SUCCESS;
1031 }
1032 
1034 
1043 {
1044  pwr_tObjectIx loix = pwr_cNObjectIx;
1045 
1046  pwr_Assert(oix != NULL);
1047  errno = 0;
1048 
1049  if (*s == '_')
1050  s++;
1051  if (*s == 'X' || *s == 'x')
1052  s++;
1053 
1054  loix = strtoul(s, NULL, 0);
1055  if (errno == ERANGE || loix > cdh_cMaxOix)
1056  return CDH__INVOIX;
1057 
1058  *oix = loix;
1059 
1060  return CDH__SUCCESS;
1061 }
1062 
1063 pwr_tStatus cdh_StringToSubid(const char* s, pwr_tSubid* sid)
1064 {
1065  unsigned int vid_0;
1066  unsigned int vid_1;
1067  unsigned int vid_2;
1068  unsigned int vid_3;
1069  unsigned int six;
1070  cdh_uRefId lrid;
1071 
1072  pwr_Assert(sid != NULL);
1073 
1074  lrid.pwr = pwr_cNSubid;
1075 
1076  if (*s == '_')
1077  s++;
1078  if (*s == 'S' || *s == 's')
1079  s++;
1080 
1081  if (sscanf(s, "%d.%d.%d.%d:%u%*s", &vid_3, &vid_2, &vid_1, &vid_0, &six) != 5)
1082  return CDH__INVSID;
1083 
1084  if (vid_3 != cdh_eVid3_subid || vid_2 > cdh_cMaxVidGroup
1085  || vid_1 > cdh_cMaxVidGroup || vid_0 > cdh_cMaxVidGroup) {
1086  return CDH__INVSID;
1087  }
1088 
1089  lrid.r.vid_3 = vid_3;
1090  lrid.r.vid_2 = vid_2;
1091  lrid.r.vid_1 = vid_1;
1092  lrid.r.vid_0 = vid_0;
1093  lrid.r.rix = six;
1094 
1095  *sid = lrid.pwr;
1096 
1097  return CDH__SUCCESS;
1098 }
1099 
1100 pwr_tStatus cdh_StringToDlid(const char* s, pwr_tDlid* did)
1101 {
1102  unsigned int vid_0;
1103  unsigned int vid_1;
1104  unsigned int vid_2;
1105  unsigned int vid_3;
1106  unsigned int dix;
1107  cdh_uRefId lrid;
1108 
1109  pwr_Assert(did != NULL);
1110 
1111  lrid.pwr = pwr_cNDlid;
1112 
1113  if (*s == '_')
1114  s++;
1115  if (*s == 'D' || *s == 'd')
1116  s++;
1117 
1118  if (sscanf(s, "%d.%d.%d.%d:%u%*s", &vid_3, &vid_2, &vid_1, &vid_0, &dix) != 5)
1119  return CDH__INVDID;
1120 
1121  if (vid_3 != cdh_eVid3_dlid || vid_2 > cdh_cMaxVidGroup
1122  || vid_1 > cdh_cMaxVidGroup || vid_0 > cdh_cMaxVidGroup) {
1123  return CDH__INVDID;
1124  }
1125 
1126  lrid.r.vid_3 = vid_3;
1127  lrid.r.vid_2 = vid_2;
1128  lrid.r.vid_1 = vid_1;
1129  lrid.r.vid_0 = vid_0;
1130  lrid.r.rix = dix;
1131 
1132  *did = lrid.pwr;
1133 
1134  return CDH__SUCCESS;
1135 }
1136 
1138 
1151 void cdh_ClassIdToString(char* s, int size, pwr_tClassId cid, int prefix)
1152 {
1153  cdh_uTypeId lcid;
1154 
1155  lcid.pwr = cid;
1156 
1157  if (/* Check validity of class identifier. */
1158  lcid.c.bix != 0 || lcid.c.must_be_zero != 0) {
1159  snprintf(s, size, "%s%u.%u:?%u?", (prefix ? "_C" : ""), lcid.c.vid_1,
1160  lcid.c.vid_0, lcid.c.cix);
1161  } else {
1162  snprintf(s, size, "%s%u.%u:%u", (prefix ? "_C" : ""), lcid.c.vid_1,
1163  lcid.c.vid_0, lcid.c.cix);
1164  }
1165 }
1166 
1168 
1188 void cdh_TypeIdToString(char* s, int size, pwr_tTypeId tid, int prefix)
1189 {
1190  cdh_uTypeId ltid;
1191 
1192  ltid.pwr = tid;
1193 
1194  if (ltid.t.must_be_one == 0) { /* This is a class TypeId. */
1195  snprintf(s, size, "%s%u.%u:0.%u.%u", (prefix ? "_T" : ""), ltid.c.vid_1,
1196  ltid.c.vid_0, ltid.c.cix, ltid.c.bix);
1197  } else { /* This i s a type TypeId. */
1198  snprintf(s, size, "%s%u.%u:1.%u.%u", (prefix ? "_T" : ""), ltid.t.vid_1,
1199  ltid.t.vid_0, ltid.t.tyg, ltid.t.tix);
1200  }
1201 }
1202 
1204 
1216 void cdh_ObjectIxToString(char* s, int size, pwr_tObjectIx oix, int prefix)
1217 {
1218  snprintf(s, size, "%s%u", (prefix ? "_X" : ""), oix);
1219 }
1220 
1222 
1231 void cdh_ArefToString(char* s, int size, pwr_sAttrRef* aref, int prefix)
1232 {
1233  char ls[200];
1234  char tmp[40];
1235 
1236  cdh_OidToString(ls, sizeof(ls), aref->Objid, 0);
1237 
1238  if (aref->Body != pwr_cNTypeId) {
1239  strcat(ls, "(");
1240  cdh_TypeIdToString(&ls[strlen(ls)], sizeof(ls), aref->Body, 1);
1241  strcat(ls, ")");
1242  if (aref->Offset > 0 || aref->Size > 0) {
1243  sprintf(tmp, "[%d.%d]", aref->Offset, aref->Size);
1244  strcat(ls, tmp);
1245  }
1246  }
1247 
1248  sprintf(s, "%s", (prefix ? "_A" : ""));
1249  strncat(s, ls, size - strlen(s));
1250 }
1251 
1253 
1266 char* cdh_AttrRefToString(pwr_sAttrRef* aref, int prefix)
1267 {
1268  static char ls[200];
1269 
1270  cdh_ArefToString(ls, sizeof(ls), aref, prefix);
1271  return ls;
1272 }
1273 
1275 
1290 char* cdh_NodeIdToString(char* s, pwr_tNodeId nid, int prefix, int suffix)
1291 {
1292  cdh_uVolumeId lvid;
1293  static char ls[sizeof("_N255.255.255.255:")];
1294 
1295  lvid.pwr = (pwr_tVolumeId)nid;
1296 
1297  sprintf(ls, "%s%u.%u.%u.%u%s", (prefix ? "_N" : ""), lvid.v.vid_3,
1298  lvid.v.vid_2, lvid.v.vid_1, lvid.v.vid_0, (suffix ? ":" : ""));
1299 
1300  if (s != NULL)
1301  return strcat(s, ls);
1302  else
1303  return ls;
1304 }
1305 
1307 
1316 void cdh_OidToString(char* s, int size, pwr_tObjid oid, int prefix)
1317 {
1318  cdh_uObjid loid;
1319 
1320  loid.pwr = oid;
1321 
1322  snprintf(s, size, "%s%u.%u.%u.%u:%u", (prefix ? "_O" : ""), loid.o.vid_3,
1323  loid.o.vid_2, loid.o.vid_1, loid.o.vid_0, loid.o.oix);
1324 }
1325 
1327 
1340 char* cdh_ObjidToString(pwr_tObjid oid, int prefix)
1341 {
1342  cdh_uObjid loid;
1343  static char ls[sizeof("_O255.255.255.255:4294967295")];
1344 
1345  loid.pwr = oid;
1346 
1347  sprintf(ls, "%s%u.%u.%u.%u:%u", (prefix ? "_O" : ""), loid.o.vid_3,
1348  loid.o.vid_2, loid.o.vid_1, loid.o.vid_0, loid.o.oix);
1349  return ls;
1350 }
1351 
1353 
1367 char* cdh_ObjidToFnString(char* s, pwr_tOid oid)
1368 {
1369  cdh_uObjid loid;
1370  static char str[40];
1371 
1372  loid.pwr = oid;
1373 
1374  sprintf(str, "%3.3u_%3.3u_%3.3u_%3.3u_%8.8x", loid.o.vid_3, loid.o.vid_2,
1375  loid.o.vid_1, loid.o.vid_0, loid.o.oix);
1376 
1377  if (s != NULL)
1378  return strcat(s, str);
1379  else
1380  return str;
1381 }
1382 
1384 
1402  char* s, int size, pwr_tVolumeId vid, int prefix, int suffix)
1403 {
1404  cdh_uVolumeId lvid;
1405  static char ls[sizeof("_V255.255.255.255:")];
1406 
1407  lvid.pwr = vid;
1408 
1409  if (s) {
1410  snprintf(s, size, "%s%u.%u.%u.%u%s", (prefix ? "_V" : ""), lvid.v.vid_3,
1411  lvid.v.vid_2, lvid.v.vid_1, lvid.v.vid_0, (suffix ? ":" : ""));
1412  return s;
1413  } else
1414  sprintf(ls, "%s%u.%u.%u.%u%s", (prefix ? "_V" : ""), lvid.v.vid_3,
1415  lvid.v.vid_2, lvid.v.vid_1, lvid.v.vid_0, (suffix ? ":" : ""));
1416  return ls;
1417 }
1418 
1420 
1428 char* cdh_VolumeIdToFnString(char* s, int size, pwr_tVolumeId vid)
1429 {
1430  cdh_uVolumeId lvid;
1431 
1432  lvid.pwr = vid;
1433 
1434  snprintf(s, size, "%3.3u_%3.3u_%3.3u_%3.3u", lvid.v.vid_3, lvid.v.vid_2,
1435  lvid.v.vid_1, lvid.v.vid_0);
1436 
1437  return s;
1438 }
1439 
1441 
1450 void cdh_SubidToString(char* s, int size, pwr_tSubid sid, int prefix)
1451 {
1452  cdh_uRefId lrid;
1453 
1454  lrid.pwr = sid;
1455 
1456  snprintf(s, size, "%s%u.%u.%u.%u:%u", (prefix ? "_S" : ""), lrid.r.vid_3,
1457  lrid.r.vid_2, lrid.r.vid_1, lrid.r.vid_0, lrid.r.rix);
1458 }
1459 
1461 
1470 void cdh_DlidToString(char* s, int size, pwr_tDlid did, int prefix)
1471 {
1472  cdh_uRefId lrid;
1473 
1474  lrid.pwr = did;
1475 
1476  snprintf(s, size, "%s%u.%u.%u.%u:%u", (prefix ? "_D" : ""), lrid.r.vid_3,
1477  lrid.r.vid_2, lrid.r.vid_1, lrid.r.vid_0, lrid.r.rix);
1478 }
1479 
1480 cdh_sFamily* cdh_Family(cdh_sFamily* f, const char* name, pwr_tObjid poid)
1481 {
1482  cdh_ObjName(&f->name, name);
1483  f->poid = poid;
1484 
1485  return f;
1486 }
1487 
1488 cdh_sObjName* cdh_ObjName(cdh_sObjName* on, const char* name)
1489 {
1490  strncpy(on->orig, name, sizeof(pwr_tObjName));
1491  on->orig[sizeof(pwr_tObjName) - 1] = '\0';
1492  str_ToUpper(on->norm, on->orig);
1493  on->pack.key = cdh_PackName(on->norm);
1494 
1495  return on;
1496 }
1497 
1498 cdh_sParseName* cdh_ParseName(pwr_tStatus* sts, cdh_sParseName* pn,
1499  pwr_tObjid poid, const char* name, pwr_tUInt32 flags)
1500 {
1501  pwr_tStatus lsts = 1;
1502  const char* inp;
1503  char* outp;
1504  char* outcp;
1505  pwr_tUInt32 len;
1506  pwr_tUInt32 seglen = 0;
1507  pwr_tUInt32 number = 0;
1508  unsigned char c;
1509  unsigned char cc;
1510  char* segp;
1511  char* segcp;
1512  pwr_tInt32 state;
1513  cdh_sParseName ParseName;
1514  char origName[256];
1515  char normName[256];
1516 
1517  /* Conversion table.
1518  ! : illegal character
1519  * : terminates state
1520  ^ : lowercase, subtract 32 if cdh_mParseName_UpperCase
1521  + : eat
1522  - : new segment
1523  . : new segment
1524  ~ : end of string
1525  */
1526 
1527  static const char* cvttab[] = { /* 0: init */
1528  "\
1529 ~+++++++++++++++++++++++++++++++\
1530 +*******************************\
1531 ********************************\
1532 ********************************\
1533 ++++++++++++++++++++++++++++++++\
1534 ********************************\
1535 ********************************\
1536 ********************************\
1537 ",
1538  /* 1: id() before '(' */
1539  "\
1540 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1541 !!!!!!!!*!!!!-.!0123456789:!!!!!\
1542 !A!CD!!!!!!!!!!O!!!ST!V!X!!!!!!_\
1543 !^!^^!!!!!!!!!!^!!!^^!^!^!!!!!!!\
1544 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1545 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1546 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1547 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1548 ",
1549  /* 2: id(bname)attribute[index], (bvol:Class-b-b-b) before ':' */
1550  "\
1551 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1552 !!!!$!!!!!!!!!!!0123456789*!!!!!\
1553 !ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!_\
1554 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1555 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1556 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1557 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1558 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1559 ",
1560  /* 3: id(bname)attribute[index], (bvol:Class-b-b-b) before ')' */
1561  "\
1562 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1563 !!!!$!!!!*!!!-!!0123456789!!!!!!\
1564 !ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!_\
1565 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1566 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1567 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1568 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1569 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1570 ",
1571  /* 4: id(bname)attribute[index], attribute before '[' */
1572  "\
1573 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1574 !!!!$!!!!!!!!!!!0123456789!!!!!!\
1575 !ABCDEFGHIJKLMNOPQRSTUVWXYZ*!!!_\
1576 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1577 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1578 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1579 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
1580 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!\
1581 ",
1582  /* 5: id(bname)attribute[index], index before ']' */
1583  "\
1584 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1585 !!!!!!!!!!!!!!!!0123456789!!!!!!\
1586 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!\
1587 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1588 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1589 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1590 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1591 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1592 ",
1593  /* 6: id(bname)attribute[index], after ']' */
1594  "\
1595 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1596 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1597 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1598 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1599 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1600 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1601 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1602 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1603 ",
1604  /* 7: id(bid)[offset.size], bid before ')' */
1605  "\
1606 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1607 !!!!!!!!!*!!!!.!0123456789:!!!!!\
1608 !!!!!!!!!!!!!!!!!!!!T!!!!!!!!!!_\
1609 !!!!!!!!!!!!!!!!!!!!^!!!!!!!!!!!\
1610 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1611 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1612 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1613 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1614 ",
1615  /* 8: id(bid)[offset.size], offset before '.' */
1616  "\
1617 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1618 !!!!!!!!!!!!!!*!0123456789!!!!!!\
1619 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1620 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1621 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1622 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1623 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1624 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1625 ",
1626  /* 9: id(bid)[offset.size], size before ']' */
1627  "\
1628 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1629 !!!!!!!!!!!!!!!!0123456789!!!!!!\
1630 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!\
1631 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1632 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1633 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1634 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1635 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1636 ",
1637  /* 10: id(bid)[offset.size], after ']' */
1638  "\
1639 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1640 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1641 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1642 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1643 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1644 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1645 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1646 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1647 ",
1648  /* 11: name.attribute[index], name before ':' */
1649  "\
1650 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1651 !!!!$!!!!!!!!**!0123456789*!!!!!\
1652 !ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!_\
1653 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1654 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1655 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1656 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
1657 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!\
1658 ",
1659  /* 12: name.attribute[index], name before '.' */
1660  "\
1661 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1662 !!!!$!!!!!!!!-*!0123456789!!!!!!\
1663 !ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!_\
1664 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1665 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1666 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1667 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
1668 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!\
1669 ",
1670  /* 13: name.attribute[index], attribute before '[' or '.' */
1671  "\
1672 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1673 !!!!$!!!!!!!!!.!0123456789!!!!!!\
1674 !ABCDEFGHIJKLMNOPQRSTUVWXYZ*!!!_\
1675 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1676 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1677 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1678 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
1679 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!\
1680 ",
1681  /* 14: name.attribute[index], index before ']' */
1682  "\
1683 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1684 !!!!!!!!!!!!!!!!0123456789!!!!!!\
1685 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!\
1686 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1687 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1688 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1689 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1690 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1691 ",
1692  /* 15: name.attribute[index], after ']' */
1693  "\
1694 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1695 !!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!!\
1696 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1697 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1698 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1699 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1700 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1701 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1702 ",
1703  "\
1704 ~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1705 !!!!$!!!!!!!!-.!0123456789:!!!!!\
1706 !ABCDEFGHIJKLMNOPQRSTUVWXYZ[!]!_\
1707 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
1708 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1709 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1710 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
1711 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!"
1712  };
1713 
1714  /* Conversion table.
1715  ! : do not convert
1716  any other copy as is. */
1717 
1718  static const char ascii7tab[] = { "\
1719 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1720 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1721 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1722 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1723 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1724 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
1725 AAAAAAACEEEEIIII!NOOOOOOOUUUUY!!\
1726 aaaaaaaceeeeiiii!nooooooouuuuy!!\
1727 " };
1728 
1729  len = strlen(name);
1730  if (len >= sizeof(origName)) {
1731  *sts = CDH__NAMELEN;
1732  return NULL;
1733  }
1734 
1735  if (pn == NULL)
1736  pn = &ParseName;
1737 
1738  memset(pn, 0, sizeof(*pn));
1739 
1740  if (cdh_ObjidIsNotNull(poid)) {
1741  pn->poid = poid;
1742  pn->flags.b.parent = 1;
1743  }
1744  pn->parseFlags.m = flags;
1745 
1746  inp = name;
1747  outp = normName;
1748  outcp = origName;
1749  *outp = '\0';
1750  *outcp = '\0';
1751  segp = outp;
1752  segcp = outcp;
1753  seglen = 0;
1754 
1755  state = 0;
1756 
1757  while (inp <= name + len) {
1758  cc = c = *inp;
1759  if (cvttab[state][c] == '!') {
1760  printf("State: %d, %c\n", state, c);
1761  lsts = CDH__INVCHAR;
1762  goto error;
1763  } else if (cvttab[state][c] == '^')
1764  c -= 32;
1765  else
1766  c = cvttab[state][c];
1767 
1768  if (pn->parseFlags.b.ascii_7 && ascii7tab[c] != '!') {
1769  c = ascii7tab[c];
1770  cc = ascii7tab[cc];
1771  }
1772 
1773  switch (state) {
1774  case 0: /* 0: init */
1775  if (c == '*') {
1776  if (*inp == '_') {
1777  state++;
1778  } else if (*inp == '.') {
1779  ++inp;
1780  state = 13;
1781  } else if (pn->flags.b.parent) {
1782  state = 12;
1783  } else {
1784  state = 11;
1785  }
1786  } else if (c == '~') {
1787  lsts = CDH__NONAME;
1788  goto error;
1789  } else if (c == '+') {
1790  ++inp;
1791  }
1792  break;
1793  case 1: /* 1: id before '(' */
1794  if (c == '~') {
1795  if (outp == segp) {
1796  lsts = CDH__INVID;
1797  goto error;
1798  }
1799  *outp++ = '\0';
1800  *outcp++ = '\0';
1801  pn->flags.b.idString = 1;
1802  switch (segp[1]) {
1803  case 'O':
1804  lsts = cdh_StringToObjid(segp, &pn->uId.oid);
1805  pn->eId = cdh_eId_objid;
1806  break;
1807  case 'C':
1808  lsts = cdh_StringToClassId(segp, &pn->uId.cid);
1809  pn->eId = cdh_eId_classId;
1810  break;
1811  case 'V':
1812  lsts = cdh_StringToVolumeId(segp, &pn->uId.vid);
1813  pn->eId = cdh_eId_volumeId;
1814  break;
1815  case 'T':
1816  lsts = cdh_StringToTypeId(segp, &pn->uId.tid);
1817  pn->eId = cdh_eId_typeId;
1818  break;
1819  case 'A':
1820  lsts = cdh_StringToObjid(segp, &pn->uId.aref.Objid);
1821  pn->eId = cdh_eId_aref;
1822  break;
1823  case 'S':
1824  lsts = cdh_StringToSubid(segp, &pn->uId.sid);
1825  pn->eId = cdh_eId_subid;
1826  break;
1827  case 'D':
1828  lsts = cdh_StringToDlid(segp, &pn->uId.did);
1829  pn->eId = cdh_eId_dlid;
1830  break;
1831  case 'X':
1832  lsts = cdh_StringToObjectIx(segp, &pn->uId.oix);
1833  pn->eId = cdh_eId_objectIx;
1834  break;
1835  default:
1836  lsts = CDH__INVIDCHAR;
1837  goto error;
1838  }
1839  if (EVEN(lsts))
1840  goto error;
1841  segp = outp;
1842  segcp = outcp;
1843  seglen = 0;
1844  } else if (c == '*') {
1845  if (outp == segp) {
1846  lsts = CDH__INVSYNTAX;
1847  goto error;
1848  }
1849  *outp++ = '\0';
1850  *outcp++ = '\0';
1851  pn->flags.b.idString = 1;
1852  switch (segp[1]) {
1853  case 'A':
1854  lsts = cdh_StringToObjid(segp, &pn->uId.aref.Objid);
1855  pn->eId = cdh_eId_aref;
1856  if (*(inp + 1) == '_')
1857  state = 7;
1858  else
1859  state = 2;
1860  break;
1861  default:
1862  lsts = CDH__INVIDCHAR;
1863  goto error;
1864  }
1865  if (EVEN(lsts)) {
1866  goto error;
1867  }
1868  segp = outp;
1869  segcp = outcp;
1870  seglen = 0;
1871  } else if (c == '-') {
1872  if (outp == segp) {
1873  lsts = CDH__INVSYNTAX;
1874  goto error;
1875  }
1876  *outp++ = '\0';
1877  *outcp++ = '\0';
1878  pn->flags.b.parent = 1;
1879  switch (segp[1]) {
1880  case 'A':
1881  case 'O':
1882  lsts = cdh_StringToObjid(segp, &pn->poid);
1883  state = 12;
1884  break;
1885  default:
1886  lsts = CDH__INVIDCHAR;
1887  goto error;
1888  }
1889  if (EVEN(lsts))
1890  goto error;
1891  segp = outp;
1892  segcp = outcp;
1893  seglen = 0;
1894  } else {
1895  *outp++ = c;
1896  *outcp++ = cc;
1897  seglen++;
1898  }
1899  inp++;
1900  break;
1901  case 2: /* 2: id(bname)attribute[index], (bvol:Class-b-b-b) before ':' */
1902  if (c == '*') {
1903  if (outp == segp) {
1904  lsts = CDH__INVTYPENAME;
1905  goto error;
1906  }
1907  *outp++ = '\0';
1908  *outcp++ = '\0';
1909  if (seglen >= sizeof(pwr_tObjName)) {
1910  lsts = CDH__SEGLEN;
1911  goto error;
1912  }
1913  strcpy(pn->body[pn->nBody].name.orig, segcp);
1914  strcpy(pn->body[pn->nBody].name.norm, segp);
1915  pn->body[pn->nBody].name.pack.key = cdh_PackName(segp);
1916  pn->nBody++;
1917  segp = outp;
1918  segcp = outcp;
1919  seglen = 0;
1920  state++;
1921  } else {
1922  *outp++ = c;
1923  *outcp++ = cc;
1924  seglen++;
1925  }
1926  inp++;
1927  break;
1928  case 3: /* 3: id(bname)attribute[index], (bvol:Class-b-b-b) before ')' */
1929  if (c == '*') {
1930  if (outp == segp) {
1931  lsts = CDH__INVTYPENAME;
1932  goto error;
1933  }
1934  *outp++ = '\0';
1935  *outcp++ = '\0';
1936  pn->flags.b.bodyName = 1;
1937  if (seglen >= sizeof(pwr_tObjName)) {
1938  lsts = CDH__SEGLEN;
1939  goto error;
1940  }
1941  strcpy(pn->body[pn->nBody].name.orig, segcp);
1942  strcpy(pn->body[pn->nBody].name.norm, segp);
1943  pn->body[pn->nBody].name.pack.key = cdh_PackName(segp);
1944  pn->nBody++;
1945  segp = outp;
1946  segcp = outcp;
1947  seglen = 0;
1948  state++;
1949  } else if (c == '-') {
1950  if (outp == segp) {
1951  lsts = CDH__INVTYPENAME;
1952  goto error;
1953  }
1954  *outp++ = '\0';
1955  *outcp++ = '\0';
1956  if (seglen >= sizeof(pwr_tObjName)) {
1957  lsts = CDH__SEGLEN;
1958  goto error;
1959  }
1960  strcpy(pn->body[pn->nBody].name.orig, segcp);
1961  strcpy(pn->body[pn->nBody].name.norm, segp);
1962  pn->body[pn->nBody].name.pack.key = cdh_PackName(segp);
1963  pn->nBody++;
1964  segp = outp;
1965  segcp = outcp;
1966  seglen = 0;
1967  } else {
1968  *outp++ = c;
1969  *outcp++ = cc;
1970  seglen++;
1971  }
1972  inp++;
1973  break;
1974  case 4: /* 4: id(bname)attribute[index], attribute before '[' */
1975  if (c == '~') {
1976  if (outp != segp) {
1977  *outp++ = '\0';
1978  *outcp++ = '\0';
1979  pn->flags.b.attribute = 1;
1980  if (seglen >= sizeof(pwr_tObjName)) {
1981  lsts = CDH__SEGLEN;
1982  goto error;
1983  }
1984  strcpy(pn->attribute[0].name.orig, segcp);
1985  strcpy(pn->attribute[0].name.norm, segp);
1986  pn->attribute[0].name.pack.key = cdh_PackName(segp);
1987  segp = outp;
1988  segcp = outcp;
1989  seglen = 0;
1990  }
1991  } else if (c == '*') {
1992  if (outp == segp) {
1993  lsts = CDH__INVATTRNAME;
1994  goto error;
1995  }
1996  *outp++ = '\0';
1997  *outcp++ = '\0';
1998  pn->flags.b.attribute = 1;
1999  if (seglen >= sizeof(pwr_tObjName)) {
2000  lsts = CDH__SEGLEN;
2001  goto error;
2002  }
2003  strcpy(pn->attribute[0].name.orig, segcp);
2004  strcpy(pn->attribute[0].name.norm, segp);
2005  pn->attribute[0].name.pack.key = cdh_PackName(segp);
2006  segp = outp;
2007  segcp = outcp;
2008  seglen = 0;
2009  state++;
2010  } else {
2011  *outp++ = c;
2012  *outcp++ = cc;
2013  seglen++;
2014  }
2015  inp++;
2016  break;
2017  case 7: /* 7: id(bid)[offset.size], bid before ')' */
2018  if (c == '*') {
2019  if (outp == segp) {
2020  lsts = CDH__INVBID;
2021  goto error;
2022  }
2023  *outp++ = '\0';
2024  *outcp++ = '\0';
2025  lsts = cdh_StringToTypeId(segp, &pn->bid);
2026  if (EVEN(lsts))
2027  goto error;
2028  pn->uId.aref.Body = pn->bid;
2029  pn->flags.b.bodyId = 1;
2030  segp = outp;
2031  segcp = outcp;
2032  seglen = 0;
2033  if (*(inp + 1) == '[') {
2034  inp++;
2035  state = 8;
2036  } else {
2037  state = 10;
2038  }
2039  } else {
2040  *outp++ = c;
2041  *outcp++ = cc;
2042  seglen++;
2043  }
2044  inp++;
2045  break;
2046  case 11: /* 11: name.attribute[index], name before ':' */
2047  if (c == '~') {
2048  if (outp == segp) {
2049  lsts = CDH__INVCHAR;
2050  goto error;
2051  }
2052  *outp++ = '\0';
2053  *outcp++ = '\0';
2054  pn->flags.b.object = 1;
2055  if (seglen >= sizeof(pwr_tObjName)) {
2056  lsts = CDH__SEGLEN;
2057  goto error;
2058  }
2059  strcpy(pn->object[pn->nObject].name.orig, segcp);
2060  strcpy(pn->object[pn->nObject].name.norm, segp);
2061  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2062  pn->nObject++;
2063  segp = outp;
2064  segcp = outcp;
2065  seglen = 0;
2066  } else if (c == '*') {
2067  if (outp == segp) {
2068  lsts = CDH__INVCHAR;
2069  goto error;
2070  }
2071  *outp++ = '\0';
2072  *outcp++ = '\0';
2073  if (*inp == ':') {
2074  if (seglen >= sizeof(pwr_tObjName)) {
2075  lsts = CDH__SEGLEN;
2076  goto error;
2077  }
2078  strcpy(pn->volume.name.orig, segcp);
2079  strcpy(pn->volume.name.norm, segp);
2080  pn->volume.name.pack.key = cdh_PackName(segp);
2081  pn->flags.b.volume = 1;
2082  state = 12;
2083  } else if (*inp == '-') {
2084  pn->flags.b.object = 1;
2085  if (seglen >= sizeof(pwr_tObjName)) {
2086  lsts = CDH__SEGLEN;
2087  goto error;
2088  }
2089  strcpy(pn->object[pn->nObject].name.orig, segcp);
2090  strcpy(pn->object[pn->nObject].name.norm, segp);
2091  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2092  pn->nObject++;
2093  state = 12;
2094  } else if (*inp == '.') {
2095  pn->flags.b.object = 1;
2096  if (seglen >= sizeof(pwr_tObjName)) {
2097  lsts = CDH__SEGLEN;
2098  goto error;
2099  }
2100  strcpy(pn->object[pn->nObject].name.orig, segcp);
2101  strcpy(pn->object[pn->nObject].name.norm, segp);
2102  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2103  pn->nObject++;
2104  state = 13;
2105  }
2106  segp = outp;
2107  segcp = outcp;
2108  seglen = 0;
2109  } else {
2110  *outp++ = c;
2111  *outcp++ = cc;
2112  seglen++;
2113  }
2114  inp++;
2115  break;
2116  case 12: /* 12: name.attribute[index], name before '.' */
2117  if (c == '~') {
2118  if (outp != segp) {
2119  *outp++ = '\0';
2120  *outcp++ = '\0';
2121  pn->flags.b.object = 1;
2122  if (seglen >= sizeof(pwr_tObjName)) {
2123  lsts = CDH__SEGLEN;
2124  goto error;
2125  }
2126  strcpy(pn->object[pn->nObject].name.orig, segcp);
2127  strcpy(pn->object[pn->nObject].name.norm, segp);
2128  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2129  pn->nObject++;
2130  segp = outp;
2131  segcp = outcp;
2132  seglen = 0;
2133  }
2134  } else if (c == '*') {
2135  if (outp == segp) {
2136  lsts = CDH__INVCHAR;
2137  goto error;
2138  }
2139  *outp++ = '\0';
2140  *outcp++ = '\0';
2141  pn->flags.b.object = 1;
2142  if (seglen >= sizeof(pwr_tObjName)) {
2143  lsts = CDH__SEGLEN;
2144  goto error;
2145  }
2146  strcpy(pn->object[pn->nObject].name.orig, segcp);
2147  strcpy(pn->object[pn->nObject].name.norm, segp);
2148  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2149  pn->nObject++;
2150  segp = outp;
2151  segcp = outcp;
2152  seglen = 0;
2153  state = 13;
2154  } else if (c == '-') {
2155  if (outp == segp) {
2156  lsts = CDH__INVCHAR;
2157  goto error;
2158  }
2159  *outp++ = '\0';
2160  *outcp++ = '\0';
2161  pn->flags.b.object = 1;
2162  if (seglen >= sizeof(pwr_tObjName)) {
2163  lsts = CDH__SEGLEN;
2164  goto error;
2165  }
2166  strcpy(pn->object[pn->nObject].name.orig, segcp);
2167  strcpy(pn->object[pn->nObject].name.norm, segp);
2168  pn->object[pn->nObject].name.pack.key = cdh_PackName(segp);
2169  pn->nObject++;
2170  segp = outp;
2171  segcp = outcp;
2172  seglen = 0;
2173  } else {
2174  *outp++ = c;
2175  *outcp++ = cc;
2176  seglen++;
2177  }
2178  inp++;
2179  break;
2180  case 13: /* 13: name.attribute[index], attribute before '[' */
2181  if (c == '~') {
2182  if (outp == segp) {
2183  lsts = CDH__INVATTRNAME;
2184  goto error;
2185  }
2186  *outp++ = '\0';
2187  *outcp++ = '\0';
2188  pn->flags.b.attribute = 1;
2189  if (seglen >= sizeof(pwr_tObjName)) {
2190  lsts = CDH__SEGLEN;
2191  goto error;
2192  }
2193  strcpy(pn->attribute[pn->nAttribute].name.orig, segcp);
2194  strcpy(pn->attribute[pn->nAttribute].name.norm, segp);
2195  pn->attribute[pn->nAttribute].name.pack.key = cdh_PackName(segp);
2196  pn->nAttribute++;
2197  segp = outp;
2198  segcp = outcp;
2199  seglen = 0;
2200  } else if (c == '*') {
2201  if (outp == segp) {
2202  lsts = CDH__INVATTRNAME;
2203  goto error;
2204  }
2205  *outp++ = '\0';
2206  *outcp++ = '\0';
2207  pn->flags.b.attribute = 1;
2208  if (seglen >= sizeof(pwr_tObjName)) {
2209  lsts = CDH__SEGLEN;
2210  goto error;
2211  }
2212  strcpy(pn->attribute[pn->nAttribute].name.orig, segcp);
2213  strcpy(pn->attribute[pn->nAttribute].name.norm, segp);
2214  pn->attribute[pn->nAttribute].name.pack.key = cdh_PackName(segp);
2215  pn->nAttribute++;
2216  segp = outp;
2217  segcp = outcp;
2218  seglen = 0;
2219  state++;
2220  } else if (c == '.') {
2221  if (outp == segp) {
2222  lsts = CDH__INVATTRNAME;
2223  goto error;
2224  }
2225  *outp++ = '\0';
2226  *outcp++ = '\0';
2227  pn->flags.b.attribute = 1;
2228  if (seglen >= sizeof(pwr_tObjName)) {
2229  lsts = CDH__SEGLEN;
2230  goto error;
2231  }
2232  strcpy(pn->attribute[pn->nAttribute].name.orig, segcp);
2233  strcpy(pn->attribute[pn->nAttribute].name.norm, segp);
2234  pn->attribute[pn->nAttribute].name.pack.key = cdh_PackName(segp);
2235  pn->nAttribute++;
2236  segp = outp;
2237  segcp = outcp;
2238  seglen = 0;
2239  } else {
2240  *outp++ = c;
2241  *outcp++ = cc;
2242  seglen++;
2243  }
2244  inp++;
2245  break;
2246  case 5: /* 5: id(bname)attribute[index], index before ']' */
2247  case 8: /* 8: id(bid)[offset.size], offset before '.' */
2248  case 9: /* 9: id(bid)[offset.size], size before ']' */
2249  case 14: /* 14: name.attribute[index], index before ']' */
2250  if (c == '*') {
2251  switch (state) {
2252  case 5:
2253  case 14:
2254  pn->index[pn->nAttribute - 1] = number;
2255  pn->hasIndex[pn->nAttribute - 1] = 1;
2256  pn->flags.b.index = 1;
2257  break;
2258  case 8:
2259  pn->offset = number;
2260  pn->uId.aref.Offset = pn->offset;
2261  break;
2262  case 9:
2263  pn->size = number;
2264  pn->uId.aref.Size = pn->size;
2265  pn->flags.b.index = 1;
2266  break;
2267  }
2268  number = 0;
2269  state++;
2270  } else {
2271  number = number * 10 + (c - '0');
2272  if (number > 65535) {
2273  lsts = CDH__INVATTRINDEX;
2274  goto error;
2275  }
2276  }
2277  inp++;
2278  break;
2279  case 6: /* 6: id(bname)attribute[index], after ']' */
2280  case 10: /* 10: id(bid)[offset.size], after ']' */
2281  case 15: /* 15: name.attribute[index], after ']' */
2282  if (c == '*') {
2283  state = 13;
2284  } else {
2285  state = -1;
2286  }
2287  inp++;
2288  break;
2289  }
2290  }
2291 
2292  if (pn->nObject > 1)
2293  pn->flags.b.path = 1;
2294  *sts = lsts;
2295  return pn;
2296 
2297 error:
2298  *sts = lsts;
2299  return NULL;
2300 }
2301 
2302 pwr_tUInt32 cdh_PackName(const char* name)
2303 {
2304  cdh_uPackName pack;
2305  unsigned int len = strlen(name);
2306  const char* s = name;
2307  unsigned char hash = 0;
2308 
2309  while (*s)
2310  hash = (hash * 3) ^ *s++;
2311 
2312  pack.c.len = len;
2313  pack.c.hash = hash;
2314  pack.c.first = name[0];
2315  pack.c.last = name[len - 1];
2316 
2317  return pack.key;
2318 }
2319 
2321 
2326 char* cdh_Low(const char* s)
2327 {
2328  static char buf[500];
2329 
2330  return str_ToLower(buf, s);
2331 }
2332 
2334 
2341 char* cdh_OpSysToStr(pwr_mOpSys opsys)
2342 {
2343  static char str[32];
2344 
2345  switch (opsys) {
2346  case pwr_mOpSys_PPC_LINUX:
2347  strcpy(str, "ppc_linux");
2348  break;
2349  case pwr_mOpSys_X86_LINUX:
2350  strcpy(str, "x86_linux");
2351  break;
2352  case pwr_mOpSys_X86_64_LINUX:
2353  strcpy(str, "x86_64_linux");
2354  break;
2355  case pwr_mOpSys_X86_64_MACOS:
2356  strcpy(str, "x86_64_macos");
2357  break;
2358  case pwr_mOpSys_ARM_LINUX:
2359  strcpy(str, "arm_linux");
2360  break;
2361  case pwr_mOpSys_ARM64_LINUX:
2362  strcpy(str, "arm64_linux");
2363  break;
2364  case pwr_mOpSys_X86_64_FREEBSD:
2365  strcpy(str, "x86_64_freebsd");
2366  break;
2367  case pwr_mOpSys_X86_64_OPENBSD:
2368  strcpy(str, "x86_64_openbsd");
2369  break;
2370  case pwr_mOpSys_X86_CYGWIN:
2371  strcpy(str, "x86_cygwin");
2372  break;
2373  default:
2374  strcpy(str, "");
2375  }
2376  return str;
2377 }
2378 
2380 
2387 char* cdh_OpSysToDirStr(pwr_mOpSys opsys)
2388 {
2389  static char str[80];
2390 
2391  switch (opsys) {
2392  case pwr_mOpSys_PPC_LINUX:
2393  strcpy(str, "os_linux/hw_ppc");
2394  break;
2395  case pwr_mOpSys_X86_LINUX:
2396  strcpy(str, "os_linux/hw_x86");
2397  break;
2398  case pwr_mOpSys_X86_64_LINUX:
2399  strcpy(str, "os_linux/hw_x86_64");
2400  break;
2401  case pwr_mOpSys_X86_64_MACOS:
2402  strcpy(str, "os_macos/hw_x86_64");
2403  break;
2404  case pwr_mOpSys_ARM_LINUX:
2405  strcpy(str, "os_linux/hw_arm");
2406  break;
2407  case pwr_mOpSys_ARM64_LINUX:
2408  strcpy(str, "os_linux/hw_arm64");
2409  break;
2410  case pwr_mOpSys_X86_64_FREEBSD:
2411  strcpy(str, "os_freebsd/hw_x86_64");
2412  break;
2413  case pwr_mOpSys_X86_64_OPENBSD:
2414  strcpy(str, "os_openbsd/hw_x86_64");
2415  break;
2416  case pwr_mOpSys_X86_CYGWIN:
2417  strcpy(str, "os_cygwin/hw_x86");
2418  break;
2419  default:
2420  strcpy(str, "");
2421  }
2422  return str;
2423 }
2424 
2425 int cdh_IsClassVolume(pwr_tVid vid)
2426 {
2427  return ((cdh_cSystemClassVolMin <= vid && vid <= cdh_cSystemClassVolMax)
2429  || (cdh_cUserClassVolMin <= vid && vid <= cdh_cUserClassVolMax));
2430 }
2431 
2432 pwr_sAttrRef cdh_ArefToCastAref(pwr_sAttrRef* arp)
2433 {
2434  pwr_sAttrRef cast_aref;
2435 
2436  cast_aref = *arp;
2437  if (arp->Flags.b.DisableAttr)
2438  cast_aref.Offset -= pwr_cAlignLW;
2439  cast_aref.Offset -= pwr_cAlignLW;
2440  cast_aref.Size = sizeof(pwr_tCastId);
2441  cast_aref.Flags.b.ObjectAttr = 0;
2442  cast_aref.Flags.b.CastAttr = 0;
2443  cast_aref.Flags.b.DisableAttr = 0;
2444  cast_aref.Flags.b.Indirect = 0;
2445  return cast_aref;
2446 }
2447 
2448 pwr_sAttrRef cdh_ArefToDisableAref(pwr_sAttrRef* arp)
2449 {
2450  pwr_sAttrRef dis_aref;
2451 
2452  dis_aref = *arp;
2453  dis_aref.Offset -= pwr_cAlignLW;
2454  dis_aref.Size = sizeof(pwr_tDisableAttr);
2455  dis_aref.Flags.b.ObjectAttr = 0;
2456  dis_aref.Flags.b.CastAttr = 0;
2457  dis_aref.Flags.b.DisableAttr = 0;
2458  return dis_aref;
2459 }
2460 
2461 pwr_sAttrRef cdh_ArefAdd(pwr_sAttrRef* arp1, pwr_sAttrRef* arp2)
2462 {
2463  pwr_sAttrRef aref = *arp1;
2464  aref.Offset += arp2->Offset;
2465  aref.Size = arp2->Size;
2466  aref.Flags = arp2->Flags;
2467  return aref;
2468 }
2469 
2470 void cdh_SuppressSuper(char* out, char* in)
2471 {
2472  char* s = in;
2473  while (str_StartsWith(s, "Super."))
2474  s += 6;
2475  strcpy(out, s);
2476 }
2477 
2478 void cdh_SuppressSuperAll(char* out, char* in)
2479 {
2480  char *s, *t;
2481 
2482  for (s = in, t = out; *s;) {
2483  if (str_StartsWith(s, "Super."))
2484  s += 6;
2485  else {
2486  *t = *s;
2487  s++;
2488  t++;
2489  }
2490  }
2491  *t = 0;
2492 }
2493 
2494 int cdh_TypeToMaxStrSize(pwr_eType type, int attr_size, int attr_elements)
2495 {
2496  int size;
2497 
2498  switch (type) {
2499  case pwr_eType_Boolean:
2500  size = 1;
2501  break;
2502  case pwr_eType_Int64:
2503  size = 20;
2504  break;
2505  case pwr_eType_UInt64:
2506  size = 20;
2507  break;
2508  case pwr_eType_Enum:
2509  case pwr_eType_Mask:
2510  case pwr_eType_Status:
2511  case pwr_eType_NetStatus:
2512  case pwr_eType_Int32:
2513  size = 11;
2514  break;
2515  case pwr_eType_UInt32:
2516  size = 10;
2517  break;
2518  case pwr_eType_Int16:
2519  size = 6;
2520  break;
2521  case pwr_eType_UInt16:
2522  size = 5;
2523  break;
2524  case pwr_eType_Int8:
2525  size = 4;
2526  break;
2527  case pwr_eType_UInt8:
2528  size = 3;
2529  break;
2530  case pwr_eType_Char:
2531  size = 1;
2532  break;
2533  case pwr_eType_Float32:
2534  size = 40;
2535  break;
2536  case pwr_eType_Float64:
2537  size = 40;
2538  break;
2539  case pwr_eType_Time:
2540  size = 23;
2541  break;
2542  case pwr_eType_DeltaTime:
2543  size = 40;
2544  break;
2545  case pwr_eType_AttrRef:
2546  size = sizeof(pwr_tAName) - 1;
2547  break;
2548  case pwr_eType_TypeId:
2549  case pwr_eType_ClassId:
2550  case pwr_eType_Objid:
2551  size = sizeof(pwr_tOName) - 1;
2552  break;
2553  case pwr_eType_VolumeId:
2554  size = sizeof(pwr_tObjName) - 1;
2555  break;
2556  case pwr_eType_String:
2557  case pwr_eType_Text:
2558  size = attr_size / attr_elements - 1;
2559  break;
2560  default:
2561  size = 80;
2562  }
2563  return size;
2564 }
2565 
2566 int cdh_TypeToSize(pwr_eType type)
2567 {
2568  int size;
2569 
2570  switch (type) {
2571  case pwr_eType_Boolean:
2572  size = sizeof(pwr_tBoolean);
2573  break;
2574  case pwr_eType_Enum:
2575  size = sizeof(pwr_tEnum);
2576  break;
2577  case pwr_eType_Mask:
2578  size = sizeof(pwr_tMask);
2579  break;
2580  case pwr_eType_Status:
2581  case pwr_eType_NetStatus:
2582  size = sizeof(pwr_tStatus);
2583  break;
2584  case pwr_eType_Int64:
2585  case pwr_eType_UInt64:
2586  size = sizeof(pwr_tInt64);
2587  break;
2588  case pwr_eType_Int32:
2589  case pwr_eType_UInt32:
2590  size = sizeof(pwr_tInt32);
2591  break;
2592  case pwr_eType_Int16:
2593  case pwr_eType_UInt16:
2594  size = sizeof(pwr_tInt16);
2595  break;
2596  case pwr_eType_Int8:
2597  case pwr_eType_UInt8:
2598  size = sizeof(pwr_tInt8);
2599  break;
2600  case pwr_eType_Char:
2601  size = sizeof(pwr_tChar);
2602  break;
2603  case pwr_eType_Float32:
2604  size = sizeof(pwr_tFloat32);
2605  break;
2606  case pwr_eType_Float64:
2607  size = sizeof(pwr_tFloat64);
2608  break;
2609  case pwr_eType_Time:
2610  size = sizeof(pwr_tTime);
2611  break;
2612  case pwr_eType_DeltaTime:
2613  size = sizeof(pwr_tDeltaTime);
2614  break;
2615  case pwr_eType_AttrRef:
2616  size = sizeof(pwr_tAttrRef);
2617  break;
2618  case pwr_eType_TypeId:
2619  size = sizeof(pwr_tTypeId);
2620  break;
2621  case pwr_eType_ClassId:
2622  size = sizeof(pwr_tClassId);
2623  break;
2624  case pwr_eType_ObjectIx:
2625  size = sizeof(pwr_tObjectIx);
2626  break;
2627  case pwr_eType_RefId:
2628  size = sizeof(pwr_tRefId);
2629  break;
2630  case pwr_eType_CastId:
2631  size = sizeof(pwr_tCastId);
2632  break;
2633  case pwr_eType_DisableAttr:
2634  size = sizeof(pwr_tDisableAttr);
2635  break;
2636  case pwr_eType_Objid:
2637  size = sizeof(pwr_tObjid);
2638  break;
2639  case pwr_eType_VolumeId:
2640  size = sizeof(pwr_tVolumeId);
2641  break;
2642  default:
2643  size = 0;
2644  }
2645  return size;
2646 }
2647 
2649 
2658 char* cdh_StringToObjectName(char* t, const char* s)
2659 {
2660  static const char valtab[] = "\
2661 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
2662 !!!!$!!!!!!!!!!!0123456789!!!!!!\
2663 !ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!_\
2664 !^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!\
2665 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
2666 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\
2667 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ!ÑÒÓÔÕÖרÙÚÛÜÝ!!\
2668 ^^^^^^^^^^^^^^^^!^^^^^^^^^^^^^!!";
2669  char* rs = t;
2670  const char* s1 = s;
2671 
2672  if (t == NULL)
2673  return NULL;
2674  if (s == NULL)
2675  s = t;
2676 
2677  while (*s1)
2678  if (valtab[(unsigned char)*s1] == '!') {
2679  if (s1 == s)
2680  *t++ = 'O';
2681  else
2682  *t++ = '_';
2683  s1++;
2684  } else
2685  *t++ = *s1++;
2686 
2687  *t = *s1; /* Copy the null byte. */
2688 
2689  return rs;
2690 }
2691 
2693 
2702 pwr_tStatus cdh_NextObjectName(char* t, const char* s)
2703 {
2704  int i;
2705  int num;
2706  int len = strlen(s);
2707  char name[80];
2708 
2709  for (i = len - 1; i >= 0; i--) {
2710  if (isdigit(s[i]) == 0)
2711  break;
2712  }
2713  if (i == len - 1)
2714  return CDH__NONAME;
2715 
2716  strncpy(name, s, i + 1);
2717  sscanf(&s[i + 1], "%d", &num);
2718  num++;
2719  if (s[i + 1] == '0')
2720  sprintf(&name[i + 1], "%0*d", len - i - 1, num);
2721  else
2722  sprintf(&name[i + 1], "%d", num);
2723 
2724  if (strlen(name) > sizeof(pwr_tObjName) - 1)
2725  return CDH__NAMELEN;
2726 
2727  strcpy(t, name);
2728  return CDH__SUCCESS;
2729 }
2730 
2732 
2740 void cdh_CutNameSegments(char* outname, char* name, int segments)
2741 {
2742  char* s[20];
2743  int i, j, last_i = 0;
2744 
2745  if (segments == 0) {
2746  strcpy(outname, "");
2747  return;
2748  }
2749 
2750  for (i = 0; i < segments; i++) {
2751  s[i] = strrchr(name, '-');
2752  if (s[i] == 0) {
2753  last_i = i;
2754  break;
2755  }
2756  *s[i] = '+';
2757  last_i = i;
2758  }
2759  for (j = 0; j <= last_i; j++) {
2760  if (s[j] != 0)
2761  *s[j] = '-';
2762  }
2763  if (s[last_i] == 0)
2764  strcpy(outname, name);
2765  else
2766  strcpy(outname, s[last_i] + 1);
2767 }
2768 
2770 
2773 pwr_tUInt32 cdh_AttrSize(pwr_sParInfo* info)
2774 {
2775  if (info->Flags & PWR_MASK_POINTER && !(info->Flags & PWR_MASK_PRIVATE))
2776  /* Return pointer size, info size contains size of pointed entity */
2777  return sizeof(pwr_tUInt64) * info->Elements;
2778 
2779  return info->Size;
2780 }
2781 
2783 
2786 pwr_tUInt32 cdh_AttrElemSize(pwr_sParInfo* info)
2787 {
2788  return cdh_AttrSize(info) / info->Elements;
2789 }
2790 
Include file for Cdh Class definition handler.
Include file for Time management.
#define cdh_cManufactClassVolMax
Largest value of volume identity for manufacturer classvolumes.
Definition: co_cdh.h:127
#define cdh_cManufactClassVolMin
Smallest value of volume identity for manufacturer classvolumes.
Definition: co_cdh.h:124
#define cdh_cSystemClassVolMin
Smallest value of volume identity for system classvolumes.
Definition: co_cdh.h:136
#define cdh_cUserClassVolMin
Smallest value of volume identity for user classvolumes.
Definition: co_cdh.h:130
#define cdh_cSystemClassVolMax
Largest value of volume identity for system classvolumes.
Definition: co_cdh.h:139
#define cdh_cUserClassVolMax
Largest value of volume identity for user classvolumes.
Definition: co_cdh.h:133
@ cdh_eId_objid
Object identity.
Definition: co_cdh.h:381
@ cdh_eId_objectIx
Object index.
Definition: co_cdh.h:380
@ cdh_eId_typeId
Type identity.
Definition: co_cdh.h:384
@ cdh_eId_volumeId
Volume identity.
Definition: co_cdh.h:383
@ cdh_eId_classId
Class identity.
Definition: co_cdh.h:382
@ cdh_eId_dlid
Direct link identity.
Definition: co_cdh.h:386
@ cdh_eId_aref
Attribute reference.
Definition: co_cdh.h:387
@ cdh_eId_subid
Subscription identity.
Definition: co_cdh.h:385
char * cdh_VolumeIdToString(char *s, int size, pwr_tVolumeId vid, int prefix, int suffix)
Converts a volume identifier, 'vid' to a string.
Definition: co_cdh.c:1401
void cdh_DlidToString(char *s, int size, pwr_tDlid did, int prefix)
Converts a direct link identifier, 'did' to a string.
Definition: co_cdh.c:1470
int cdh_ObjidIsNull(pwr_tObjid Objid)
Test if object identity is null.
Definition: co_cdh.c:110
char * cdh_ObjidToFnString(char *s, pwr_tOid oid)
Converts a object identifier, 'oid' to a filename string.
Definition: co_cdh.c:1367
pwr_tStatus cdh_StringToAref(const char *s, pwr_tAttrRef *aref)
Convert AttrRef string to id.
Definition: co_cdh.c:850
void cdh_ObjectIxToString(char *s, int size, pwr_tObjectIx oix, int prefix)
Converts a object index, 'oix' to a string.
Definition: co_cdh.c:1216
char * cdh_AttrRefToString(pwr_sAttrRef *aref, int prefix)
Converts an attribute reference , 'aref' to a string.
Definition: co_cdh.c:1266
int cdh_ObjidIsNotNull(pwr_tObjid Objid)
Test if object identity is not null.
Definition: co_cdh.c:121
char * cdh_VolumeIdToFnString(char *s, int size, pwr_tVolumeId vid)
Converts a volume identifier, 'vid' to a filename string.
Definition: co_cdh.c:1428
pwr_tStatus cdh_StringToObjid(const char *s, pwr_tObjid *oid)
Convert Objid string to id.
Definition: co_cdh.c:800
char * cdh_OpSysToDirStr(pwr_mOpSys opsys)
Convert operating system to directory string.
Definition: co_cdh.c:2387
pwr_tStatus cdh_AttrValueToString(pwr_eType Type, void *Value, char *String, int MaxSize)
Converts an attribute given in internal binary format to a text string.
Definition: co_cdh.c:365
pwr_tStatus cdh_StringToClassId(const char *s, pwr_tClassId *cid)
Convert ClassId string to id.
Definition: co_cdh.c:759
void cdh_CutNameSegments(char *outname, char *name, int segments)
Cut the leading segments of an object name.
Definition: co_cdh.c:2740
char * cdh_Low(const char *s)
Convert string to lower case.
Definition: co_cdh.c:2326
char * cdh_StringToObjectName(char *t, const char *s)
Convert string to valid object name.
Definition: co_cdh.c:2658
pwr_tStatus cdh_StringToVolumeId(const char *s, pwr_tVolumeId *vid)
Convert VolumeId string to id.
Definition: co_cdh.c:995
void cdh_SubidToString(char *s, int size, pwr_tSubid sid, int prefix)
Converts a subscription identifier, 'sid' to a string.
Definition: co_cdh.c:1450
pwr_tUInt32 cdh_AttrElemSize(pwr_sParInfo *info)
Get attribute array element size.
Definition: co_cdh.c:2786
void cdh_MaskToBinaryString(unsigned int mask, int noofbits, char *str)
Definition: co_cdh.c:734
pwr_tStatus cdh_StringToObjectIx(const char *s, pwr_tObjectIx *oix)
Converts ObjectIx string to index.
Definition: co_cdh.c:1042
void cdh_TypeIdToString(char *s, int size, pwr_tTypeId tid, int prefix)
Converts a type identifier, 'tid' to a string.
Definition: co_cdh.c:1188
void cdh_OidToString(char *s, int size, pwr_tObjid oid, int prefix)
Converts a object identifier, 'oid' to a string.
Definition: co_cdh.c:1316
void cdh_ClassIdToString(char *s, int size, pwr_tClassId cid, int prefix)
Converts a class identifier, 'cid' to a string.
Definition: co_cdh.c:1151
pwr_tClassId cdh_ClassObjidToId(pwr_tObjid Objid)
Convert Objid to ClassId.
Definition: co_cdh.c:227
pwr_tStatus cdh_NextObjectName(char *t, const char *s)
Create an similar objectname from another object name.
Definition: co_cdh.c:2702
pwr_tObjid cdh_ClassIdToObjid(pwr_tClassId Class)
Convert ClassId to Objid.
Definition: co_cdh.c:249
pwr_tTypeId cdh_TypeObjidToId(pwr_tObjid Objid)
Convert Objid to TypeId.
Definition: co_cdh.c:275
int cdh_ObjidCompare(pwr_tObjid Objid_1, pwr_tObjid Objid_2)
Compare two object identities.
Definition: co_cdh.c:67
pwr_tStatus cdh_StringToAttrValue(pwr_eType Type, const char *String, void *Value)
Definition: co_cdh.c:465
int cdh_ObjidIsEqual(pwr_tObjid Objid_1, pwr_tObjid Objid_2)
Test if two object identities are equal.
Definition: co_cdh.c:88
void cdh_ArefToString(char *s, int size, pwr_sAttrRef *aref, int prefix)
Converts an attribute reference , 'aref' to a string.
Definition: co_cdh.c:1231
int cdh_ObjidIsNotEqual(pwr_tObjid Objid_1, pwr_tObjid Objid_2)
Test if two object identities are different.
Definition: co_cdh.c:99
char * cdh_OpSysToStr(pwr_mOpSys opsys)
Convert operating system to string.
Definition: co_cdh.c:2341
pwr_sAttrRef cdh_ObjidToAref(pwr_tObjid Objid)
Converts an objid to an attrref.
Definition: co_cdh.c:354
pwr_tObjid cdh_TypeIdToObjid(pwr_tTypeId Type)
Convert TypeId to Objid.
Definition: co_cdh.c:321
pwr_tStatus cdh_StringToTypeId(const char *s, pwr_tTypeId *tid)
Convert TypeId string to id.
Definition: co_cdh.c:937
int cdh_TypeIdToIndex(pwr_tTypeId Type)
Convert TypeId to index.
Definition: co_cdh.c:310
char * cdh_NodeIdToString(char *s, pwr_tNodeId nid, int prefix, int suffix)
Converts a volume identifier, 'vid' to a string.
Definition: co_cdh.c:1290
char * cdh_ObjidToString(pwr_tObjid oid, int prefix)
Converts a object identifier, 'oid' to a string.
Definition: co_cdh.c:1340
pwr_tUInt32 cdh_AttrSize(pwr_sParInfo *info)
Get attribute size.
Definition: co_cdh.c:2773
@ time_eFormat_DateAndTime
Display date and time, 01-JAN-1970 01:00:00.00.
Definition: co_time.h:73
pwr_tStatus time_AsciiToA(const char *, pwr_tTime *)
Convert ascii time to timespec.
Definition: co_time.c:999
pwr_tStatus time_AsciiToD(const char *, pwr_tDeltaTime *)
Convert ascii to timespec.
Definition: co_time.c:928
pwr_tStatus time_DtoAscii(pwr_tDeltaTime *, int, char *, int)
Convert a delta time to ascii string.
Definition: co_time.c:819
pwr_tStatus time_AtoAscii(pwr_tTime *, time_eFormat, char *, int)
Convert timespec to ascii.
Definition: co_time.c:878
#define EVEN(a)
Check if value is even.
Definition: pwr.h:623
unsigned int pwr_tUInt32
32-bit unsigned integer type.
Definition: pwr.h:233
char pwr_tAName[399+1]
Full Aref Name type.
Definition: pwr.h:397
double pwr_tFloat64
64-bit float.
Definition: pwr.h:135
char pwr_tChar
Character type.
Definition: pwr.h:139
pwr_tNid pwr_tNodeId
Node identity type.
Definition: pwr.h:298
unsigned int pwr_tVid
Volume identity type.
Definition: pwr.h:237
pwr_tOix pwr_tObjectIx
Object index type.
Definition: pwr.h:244
pwr_tTypeId pwr_tCastId
CastId type.
Definition: pwr.h:460
#define pwr_cNDlid
Zero direct link identity constant.
Definition: pwr.h:586
pwr_tTid pwr_tTypeId
Type identity type.
Definition: pwr.h:279
unsigned int pwr_tBoolean
Boolean type.
Definition: pwr.h:127
pwr_tCid pwr_tClassId
Class identity type.
Definition: pwr.h:274
char pwr_tInt8
8-bit integer type.
Definition: pwr.h:151
pwr_tRid pwr_tSubid
Subscription identity type.
Definition: pwr.h:312
pwr_tOid pwr_tObjid
Object identity type.
Definition: pwr.h:268
short pwr_tInt16
16-bit integer type.
Definition: pwr.h:155
int pwr_tInt32
32-bit integer type.
Definition: pwr.h:159
#define pwr_cNSubid
Zero subscription identity constant.
Definition: pwr.h:585
unsigned char pwr_tUInt8
8-bit unsigned integer type.
Definition: pwr.h:225
int pwr_tStatus
Status type.
Definition: pwr.h:284
pwr_tInt32 pwr_tEnum
Enumeration type.
Definition: pwr.h:252
pwr_tVid pwr_tVolumeId
Volume identity type.
Definition: pwr.h:238
pwr_tRid pwr_tDlid
Direct link identity type.
Definition: pwr.h:311
char pwr_tOName[199+1]
Full Object Name type.
Definition: pwr.h:396
#define ODD(a)
Check if value is odd.
Definition: pwr.h:618
pwr_tRid pwr_tRefId
Reference identity type.
Definition: pwr.h:310
unsigned int pwr_tDisableAttr
DisableAttr type.
Definition: pwr.h:464
unsigned short pwr_tUInt16
16-bit unsigned integer type.
Definition: pwr.h:229
char pwr_tObjName[31+1]
Object name type.
Definition: pwr.h:377
pwr_tUInt32 pwr_tMask
Mask type.
Definition: pwr.h:248
float pwr_tFloat32
32-bit float.
Definition: pwr.h:131
unsigned int vid_3
Object index.
Definition: co_cdh.h:151
Family struct.
Definition: co_cdh.h:434
Object name struct.
Definition: co_cdh.h:427
Parse name struct.
Definition: co_cdh.h:684
Attribute reference.
Definition: pwr.h:557
pwr_tUInt32 Size
Attribute size.
Definition: pwr.h:561
pwr_tCid Body
Typeid of attribute, body or class.
Definition: pwr.h:559
pwr_tOid Objid
Object identity.
Definition: pwr.h:558
pwr_mAttrRef Flags
Attribute flags.
Definition: pwr.h:562
pwr_tUInt32 Offset
Offset in body.
Definition: pwr.h:560
Delta time type.
Definition: pwr.h:369
Object identity type.
Definition: pwr.h:263
struct cdh_mName::@4 b
Bit mask representation.
struct cdh_mParseName::@3 b
Bitmask representation.
Type for representions of object identity.
Definition: co_cdh.h:340
cdh_mClassObjid c
ClassDef object representation.
Definition: co_cdh.h:343
cdh_mObjid o
Common object representation.
Definition: co_cdh.h:342
pwr_tOid pwr
Extern representation.
Definition: co_cdh.h:341
cdh_mTypeObjid t
TypeDef object representation.
Definition: co_cdh.h:344
Pack name.
Definition: co_cdh.h:404
struct cdh_uPackName::@2 c
Name structure.
Type for representations of reference identity.
Definition: co_cdh.h:349
cdh_mRid r
Intern representation.
Definition: co_cdh.h:351
pwr_tRid pwr
Extern representation.
Definition: co_cdh.h:350
Type for representation of type identity.
Definition: co_cdh.h:356
cdh_mCid c
Class identity representation.
Definition: co_cdh.h:358
cdh_mTid t
Type identity representation.
Definition: co_cdh.h:359
pwr_tCid pwr
Extern representation.
Definition: co_cdh.h:357
Type for representation of volume identity.
Definition: co_cdh.h:364
cdh_mVid v
Intern representation.
Definition: co_cdh.h:366
pwr_tVid pwr
Extern representation.
Definition: co_cdh.h:365
struct pwr_mAttrRef::@1 b
Bitmask representation.