/**************************************************************** * mdsdcl_define: * Define an mds macro ... ****************************************************************/ int mdsdcl_define() /* Return: status */ { int i,k; int sts; char name[32]; char *p; struct _mdsdcl_macro *m; static DYNAMIC_DESCRIPTOR(dsc_name); static DYNAMIC_DESCRIPTOR(dsc_cmd); static char fmt1[] = "Macro '%s' is open -- cannot be edited"; sts = cli_get_value("P1",&dsc_name); if (~sts & 1) return(sts); k = dsc_name.dscW_length; if (k >= sizeof(name)) k = sizeof(name) - 1; l2un(name,dsc_name.dscA_pointer,k); name[k] = '\0'; /*======================================================= * Get addr of macro struct. Delete any existing lines ... *======================================================*/ m = get_macro(name); if (m->isOpen) return(MdsMsg(MDSDCL_STS_ERROR,fmt1,m->name)); for (i=0 ; i<m->numLines ; i++) free(m->lines[i]); m->numLines = 0; /*====================================================== * Read new macro from input ... *=====================================================*/ for ( ; (sts = mdsdcl_get_input_nosymbols("DEFMAC> ",&dsc_cmd)) & 1 ; ) { if ((dsc_cmd.dscW_length > 0) && dsc_cmd.dscA_pointer) p = nonblank(dsc_cmd.dscA_pointer); else p = 0; if (!p || end_macro(p)) { break; } if (m->numLines >= m->maxLines) extend_macro(m); m->lines[m->numLines++] = STRING_ALLOC(dsc_cmd.dscA_pointer); } return(1); }
/*************************************************************** * end_macro: * Return TRUE if line consists of words "END MACRO" ***************************************************************/ static int end_macro( /* Return: TRUE if "END MACRO" */ char originalLine[] /* <r> line to check */ ) { char *p; char line[40]; p = nonblank(originalLine); if (p) { int len = (strlen(p) > (sizeof(line)-1)) ? sizeof(line) - 1 : strlen(p); l2un(line,p,len); line[len]=0; strntrim(line,0,len); return(!strcmp(line,"END MACRO") ? 1 : 0); } else return(0); }
/*************************************************************** * cliToken: * Get token, as described by CLI flags ***************************************************************/ int cliToken( char **pp /* <m> addr of ptr to char string */ ,struct descriptor *dsc_ret /* <w> return token here */ ,int flags /* <r> cli flags, describing data type */ ) { int k; int sts; int typeflag; char c; char *p,*p2; char util[1024]; static char legalMdsChars[] = "0123456789._-:;*?%\\"; static struct descriptor dscUtil = { sizeof(util)-1,DSC_K_DTYPE_T,DSC_K_CLASS_S,0}; typeflag = flags & 0x0FFF; p = *pp = nonblank(*pp); if (!p) return(0); dscUtil.dscA_pointer = util; /* set addr in dscUtil descrip */ if (!typeflag || typeflag==VAL_M_QUOTED_STRING || typeflag==VAL_M_USER_DEFINED_TYPE) sts = ascToken(&p,&dscUtil,0,legalMdsChars); else if (typeflag == VAL_M_FILE) sts = ascFilename(&p,&dscUtil,0); else if (typeflag == VAL_M_NUMBER) { if (isdigit(*p) || (*p=='-' && isdigit(*(p+1)))) { sts = longToken(&p,&dscUtil,0,0); } else if (*p == '%') { c = toupper(*(p+1)); p2 = p + 2; /* first char of putative number */ if (c == 'X') { for ( ; isxdigit(*p2) ; p2++) ; } else if (c == 'O') { /* octal number ... */ for ( ; isdigit(*p2) && *p2<='7' ; p2++) ; } k = p2 - p; /* number of chars scanned */ if (k == 2) sts = 0; /*..invalid number */ else { if (k > dscUtil.dscW_length) k = dscUtil.dscW_length; strncpy(dscUtil.dscA_pointer,p,k); if (k < dscUtil.dscW_length) dscUtil.dscA_pointer[k] = '\0'; l2un(dscUtil.dscA_pointer,0,k); p = nonblank(p2); sts = CLI_STS_NORMAL; } } } else if (typeflag == VAL_M_DELTATIME) { sts = deltatimeToken(&p,&dscUtil,0,0); } else if (typeflag == VAL_M_REST_OF_LINE) { k = strlen(p); if (k > dscUtil.dscW_length) k = dscUtil.dscW_length; strncpy(dscUtil.dscA_pointer,p,k); if (k < dscUtil.dscW_length) dscUtil.dscA_pointer[k] = '\0'; p = 0; sts = CLI_STS_NORMAL; } else { printf("\n*ERR* cliToken can't handle typeflag %04X\n\n", typeflag); exit(0); } /*================================================ * Return to caller ... *===============================================*/ str_copy_dx(dsc_ret,&dscUtil); if (sts & 1) *pp = nonblank(p); return(sts); }