Beispiel #1
0
/****************************************************************
 * 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);
}
Beispiel #2
0
/***************************************************************
 * 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);
}
Beispiel #3
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);
   }