Esempio n. 1
0
long getsub(long* pvalue, long N, long sum, long index){
	long i, ret = sum,last;
	if (index = -1)
	{
		return -1;
	}

	for (int i = index; i >= 0; ++i)
	{
		if (pvalue[i] <= ret)
		{
			ret -= pvalue[i];
			last = i;
		}
	}
	if (ret != 0)
	{
		return getsub(pvalue, N, sum, index - 1);
	}
	else
		return last;
}
Esempio n. 2
0
const Config::Node &Config::operator[](const std::string &key) const
{
  return getsub(key, _doc);
}
Esempio n. 3
0
void dot(int iii) {                     /* DOT, starts out like LET */
                                                
    int  i, k, NROW, NCOL, XBASE,AROW, ACOL, ABASE, XXBASE, sub ;
    double  val ;  ptr  px, p, q, r ;

    px=getvar() ; if (errnum) derror(errnum) ; /* address the result */
    if (vartyp==0) derror(84) ;
    if (px==NULL) px=instal() ;
    else if (px->symtype!=1 || px->symtype!=-1) derror(84) ;
    if (vartyp<0) sub=getsub(px) ;

    if (warea[gi++]!='=') derror(29) ;                     /* skip = */
      
    start=1 ; val=0 ;                          /* arrays only; sum=0 */
      
    L10 : p=getvar() ; if (errnum) derror(errnum) ;    /* get first vector */
    if (p==NULL) derror(70) ;
    i=p->valptr ; if (intval[i]!=1 || p->symtype!=-1) derror(84) ;
    NROW=intval[i+1] ;                            /* number of terms */
    XBASE=intval[i+2] ;                /* index base of first vector */   

    if (warea[gi++]!='*') derror(60) ;                    /* check * */

    if (warea[gi]=='1') {                           /* a simple sum! */
	for (k=0; k<NROW ; k++) val+=relval[XBASE+k] ;                       
	gi++ ; goto L20 ;
    }
         
    q=getvar() ; if (errnum) derror(errnum) ;        /* x or A next? */
    if (q==NULL || q->symtype!=-1) derror(70) ;
    i=q->valptr ;

    if (intval[i]==1) {                  /* multiplier is a vector x */
	if (intval[i+1]!=NROW) derror(74) ;        /* not conformable */
	for (k=0; k<NROW ; k++) 
	    val+=relval[XBASE+k]*relval[intval[i+2]+k] ;        
    }
             
    else {                            /* multiplier is matrix*vector */
	if (intval[i]!=2) derror(84) ;         /* not a matrix, error */
	AROW=intval[i+1] ;  ACOL=intval[i+2] ; 
	ABASE=intval[i+3] ;                   
	if (warea[gi]=='*') {
            gi++ ;                                 /* A*x term, skip * */
            if (AROW!=NROW) derror(74) ;            /* must match rows */

            r=getvar() ; if (errnum) derror(errnum) ;    /* get vector */
            if (r==NULL || r->symtype!=-1) derror(70) ;
            i=r->valptr ;
            if (intval[i]!=1 || intval[i+1]!=ACOL) derror(74) ; 
            XXBASE=intval[i+2] ;             
            
            for (k=0; k<NROW ; k++)                         
		val+=relval[XBASE+k]*vaik(AROW,ACOL,ABASE,XXBASE,k) ; 
	}                  

	else if (warea[gi]=='%') {
	    gi++ ;                                            /* skip % */
	    if (ACOL!=NROW) derror(74) ;        /* ncol must match rows */
	    if (warea[gi++]!='*') derror(60) ;  /* check for * and skip */
           
	    r=getvar() ; if (errnum) derror(errnum) ;    /* get vector */
	    if (r==NULL || r->symtype!=-1) derror(70) ;
	    i=r->valptr ;
	    if (intval[i]!=1 || intval[i+1]!=AROW) derror(74) ; 
	    XXBASE=intval[i+2] ;        
                               
	    for (k=0; k<NROW ; k++) 
		val+=relval[XBASE+k]*vaki(AROW,ACOL,ABASE,XXBASE,k) ; 
	}                      
    }

    L20 : if (iii==2) val=val/NROW ;                /* AVG */
   
/** else if (warea[gi]=='+') { gi++ ; goto L10 ; }  NO more terms! **/
    
    if (px->symtype>0) relval[px->valptr]=val ;
    else relval[intval[intval[px->valptr]+px->valptr+1]+sub]=val ;
    if (tracer>=4) {
	printf("%c%s",'\33',"[7m") ;            /* ANSI reverse video */
	printf("A: %s = $g",px->name,val) ;
	printf("%c%s",'\33',"[0m") ;            /* ANSI restore video */
    }
    start=0 ;
}                                                   
Esempio n. 4
0
void call(int i)                              /* CALL, INVOKE for i = 0, 1 */
{
    int  gkk, li, sym ;  double  val ;
    ptr  p, q, s ;   dsptr  r ;

    if (!runf) derror(22) ;
    p=getvar() ; if (errnum) derror(errnum) ;
    if (p==NULL) derror (201) ;                        /* undefined */
    /* defined, get parameters */
    sym=p->symtype ;                                   /* save type */
    if (i==0 && sym<8 || i>0 && sym!= -59) derror(201) ;
    p->SWITCH=FALSE ;                          /* prevent recursion */
    q=p ;          /* save pointer to procedure or macro definition */

    if (warea[++gi]==')') {                         /* done or ...  */
	if (p->next==NULL) goto L10 ; derror(56) ; }    /* ... mismatch */
    if (p->next==NULL) derror(56) ;                     /* mismatch */
    p=p->next ;                      /* else link to first argument */

    if (i>0) goto L85 ;                                   /* invoke */
    if (warea[gi]==';') {
	if (sym==8) goto L80 ; derror(56) ; } /* call */
    if (sym==8) derror(56) ;                            /* mismatch */

    li=0 ;                          /* call, count value parameters */
    L9 :   li++ ;
    p->SWITCH=TRUE ;                      /* turn local variable ON */
    if (p->symtype==1) relval[p->valptr]=evalexp() ;        /* REAL */
    else if (p->symtype==3)                              /* COMPLEX */
	cvalexp(relval[p->valptr],relval[p->valptr+1]) ;
    else {
	val=evalexp() ;if (errnum) derror(errnum) ;       /* INTEGER */
	if (val>maxint || -val>maxint) derror(20) ;
	intval[p->valptr]=(int) val ;
    }
    if (errnum) derror(errnum) ;

    if (warea[gi]==')') {
	if (p->next==NULL) goto L10 ; derror(56) ; }    /* done */
    if (p->next==NULL) derror(56) ;                     /* mismatch */
    p=p->next ;                       /* else link to next argument */

    if (warea[gi]==';') {               /* no more value parameters */
	if (sym==8+li) goto L80 ; derror(56) ; }
    if (warea[gi]==',') { gi++ ; goto L9 ; } derror(56) ;   /* next */

    L80 :  gi++ ;             /* skip ';' or ',', deal with VAR parameters */
    L85 :  p->SWITCH=TRUE;                       /* turn local variable ON */
    gkk=gi ; s=getvar() ;                     /* might be an array! */
    if (errnum) {
	if (errnum==73) {
	    errnum=0 ;
	    gi=gkk ; start=1 ; s=getvar() ; start=0 ;
	    if (errnum) derror(errnum) ;
	    if (s==NULL || s->symtype!= -1) derror(196) ;
	    p->valptr=s->valptr ;               /* pass array address */
	    goto L87 ;
	}
	derror(errnum) ;
    }

    /*$$*/ if (s==NULL) s=instal() ;             /* no array, install REAL */

    if (s->symtype== -1 && p->symtype==1) goto L90 ;
    if (s->symtype!=p->symtype && s->symtype!= -p->symtype) derror(56) ;
    /* no match */
    L90 :  if (s->symtype>0) p->valptr=s->valptr ;    /* pass by reference */
    else {
	if (s->symtype== -1)                         /* relval index */
	    p->valptr=intval[intval[s->valptr]+s->valptr+1]+getsub(s) ;
	else if (s->symtype== -2)                    /* intval index */
	    p->valptr=intval[s->valptr]+s->valptr+1+getsub(s) ;
	else p->valptr=intval[intval[s->valptr]+s->valptr+1]+2*getsub(s) ;
    }

    L87 :  if (warea[gi]==')') {
	if (p->next==NULL) goto L10 ; derror(56) ; }
    if (p->next==NULL) derror(56) ;
    p=p->next ;

    if (warea[gi]==',') goto L80 ;            /* next VAR parameter */
    derror(33) ;                                 /* bad termination */

    L10 :  gi++ ;                                                /* skip ) */
    /* control stack for return */

    r= (struct dstak*) malloc(sizeof(struct dstak)) ;
    r->head='C' ;
    r->cvar=q ;
    r->radd=gi ;                                      /* on lf or | */
    r->dslink=stktop ;
    stktop=r ;
    flag1=TRUE ;                     /* prevents nested definitions */
    gi=q->valptr ;                              /* go to subroutine */

    if (tracer>0) {
	if (tracer==2 || tracer==3 || tracer>=6) {
	    printf("%c%s",'\33',"[7m") ;        /* ANSI reverse video */
	    printf("%s%s%c","G: EXECUTING PROCEDURE ",q->name,'\n') ;
	    printf("%c%s",'\33',"[0m") ;        /* ANSI restore video */
	}
    }
}                                                       /* call */
Esempio n. 5
0
int main( )
{
	char s1[ ] = "Hello" ;
	char s2[ ] = "Hello World" ;
	char s3[ ] = "Four hundred thirty two" ;
	char ch, *s ;
	int i ;

	system ( "cls" ) ;

	printf ( "String s1: %s\n", s1 ) ;

	/* check for the first occurrence of a character */
	printf ( "Enter character to search: " ) ;
	scanf ( "%c", &ch ) ;
	i = search ( s1, ch ) ;
	if ( i != -1 )
		printf ( "The first occurrence of character %c is found at index no. %d\n\n", ch, i ) ;
	else
		printf ( "Character %c is not present in the list.\n", ch ) ;

	printf ( "String s2: %s\n", s2 ) ;

	/* compares two strings s1 and s2 */
	i = isequals ( s1, s2 ) ;
	if ( i == 1 )
		printf ( "Strings s1 and s2 are identical\n" ) ;
	else
		printf ( "Strings s1 and s2 are not identical\n" ) ;
	i = issmaller ( s1, s2 ) ;
	if ( i == 1 )
		printf ( "String s1 is smaller than string s2\n" ) ;
	else
		printf ( "String s1 is not smaller than string s2\n" ) ;

	i = isgreater ( s1, s2 ) ;
	if ( i == 1 )
		printf ( "String s1 is greater than string s2\n" ) ;
	else
		printf ( "String s1 is not greater than string s2\n\n" ) ;

	/* extract characters at given position */
	printf ( "String s3: %s\n", s3 ) ;
	s = getsub ( s3, 5, 7 ) ;
	printf ( "Sub string: %s\n", s ) ;
	free ( s ) ;

	/* extract leftmost n characters */
	s = leftsub ( s3, 4 ) ;
	printf ( "Left sub string: %s\n", s ) ;
	free ( s ) ;

	/* extract rightmost n characters */
	s = rightsub ( s3, 3 ) ;
	printf ( "Right sub string: %s\n", s ) ;
	free ( s ) ;

	/*  convert string to uppercase */
	upper ( s3 ) ;
	printf ( "String in upper case: %s\n", s3 ) ;

	/* convert string to lowercase */
	lower ( s3 ) ;
	printf ( "String in lower case: %s\n", s3 ) ;

	/* reverse the given string */
	reverse ( s3 ) ;
	printf ( "Reversed string: %s\n", s3 ) ;

	/* replace first occurrence of one char with new one */
	replace ( s1, 'H' , 'M' ) ;
	printf ( "String s1: %s\n", s1 ) ;

	/* sets a char at a given position */
	i = setat ( s1, 'M', 3 ) ;
	if ( i )
		printf ( "String s1: %s\n", s1 ) ;
	else
		printf ( "Invalid position.\n" ) ;

	return 0 ;
}