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; }
const Config::Node &Config::operator[](const std::string &key) const { return getsub(key, _doc); }
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 ; }
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 */
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 ; }