void strcmp_command(wchar_t *arg) { wchar_t arg1[BUFFER_SIZE], arg2[BUFFER_SIZE], if_then[BUFFER_SIZE], if_else[BUFFER_SIZE], temp[BUFFER_SIZE]; arg = get_arg_in_braces(arg,arg1,STOP_SPACES,sizeof(arg1)/sizeof(wchar_t)-1); substitute_vars(arg1,temp, sizeof(temp)/sizeof(wchar_t)); substitute_myvars(temp,arg1, sizeof(arg1)/sizeof(wchar_t)); arg = get_arg_in_braces(arg,arg2,STOP_SPACES,sizeof(arg2)/sizeof(wchar_t)-1); substitute_vars(arg2,temp, sizeof(temp)/sizeof(wchar_t)); substitute_myvars(temp,arg2, sizeof(arg2)/sizeof(wchar_t)); arg = get_arg_in_braces(arg,if_then,WITH_SPACES,sizeof(if_then)/sizeof(wchar_t)-1); substitute_vars(if_then,temp, sizeof(temp)/sizeof(wchar_t)); substitute_myvars(temp,if_then, sizeof(if_then)/sizeof(wchar_t)); arg = get_arg_in_braces(arg,if_else,WITH_SPACES,sizeof(if_else)/sizeof(wchar_t)-1); substitute_vars(if_else,temp, sizeof(temp)/sizeof(wchar_t)); substitute_myvars(temp,if_else, sizeof(if_else)/sizeof(wchar_t)); wchar_t *to_parse = !wcscmp(arg1, arg2) ? if_then : if_else; if( to_parse && wcslen(to_parse) ) { parse_input(to_parse); } }
void deathlog_command(const char *arg, struct session *ses) { FILE *fh; char fname[BUFFER_SIZE], text[BUFFER_SIZE], temp[BUFFER_SIZE], lfname[BUFFER_SIZE]; if (*arg) { arg = get_arg_in_braces(arg, temp, 0); arg = get_arg_in_braces(arg, text, 1); substitute_vars(temp, fname); substitute_myvars(fname, temp, ses); expand_filename(temp, fname, lfname); substitute_vars(text, temp); substitute_myvars(temp, text, ses); if ((fh = fopen(lfname, "a"))) { cfprintf(fh, "%s\n", text); fclose(fh); } else tintin_eprintf(ses, "#ERROR: COULDN'T OPEN FILE {%s}.", fname); } else tintin_eprintf(ses, "#ERROR: valid syntax is: #deathlog <file> <text>"); }
void math_command(wchar_t *line) { wchar_t left[BUFFER_SIZE], right[BUFFER_SIZE], temp[BUFFER_SIZE], result[BUFFER_SIZE]; int i; line=get_arg_in_braces(line,left,STOP_SPACES,sizeof(left)/sizeof(wchar_t)-1); line=get_arg_in_braces(line,right,WITH_SPACES,sizeof(right)/sizeof(wchar_t)-1); substitute_vars(right, result, sizeof(result)/sizeof(wchar_t)); substitute_myvars(result, right, sizeof(right)/sizeof(wchar_t)); i=eval_expression(right); swprintf(temp,L"%d",i); VAR_INDEX ind = VarList.find(left); VAR* pvar; if ( ind != VarList.end() ) { pvar = ind->second; pvar->m_strVal = temp; } else { pvar = new VAR(temp); VarList[left] = pvar; } }
void if_command(wchar_t *line) { wchar_t if_expr[BUFFER_SIZE], if_then[BUFFER_SIZE], if_else[BUFFER_SIZE], temp[BUFFER_SIZE]; line=get_arg_in_braces(line,if_expr,STOP_SPACES,sizeof(if_expr)/sizeof(wchar_t)-1); substitute_vars(if_expr,temp, sizeof(temp)/sizeof(wchar_t));substitute_myvars(temp,if_expr, sizeof(if_expr)/sizeof(wchar_t)); line=get_arg_in_braces(line,if_then,WITH_SPACES,sizeof(if_then)/sizeof(wchar_t)-1); substitute_vars(if_then,temp, sizeof(temp)/sizeof(wchar_t));substitute_myvars(temp,if_then, sizeof(if_then)/sizeof(wchar_t)); line=get_arg_in_braces(line,if_else,WITH_SPACES,sizeof(if_else)/sizeof(wchar_t)-1); substitute_vars(if_else,temp, sizeof(temp)/sizeof(wchar_t));substitute_myvars(temp,if_else, sizeof(if_else)/sizeof(wchar_t)); wchar_t *to_parse = eval_expression(if_expr) ? if_then : if_else; if( to_parse && wcslen(to_parse) ) { parse_input(to_parse); } }
void unlink_command(const char *arg, struct session *ses) { char file[BUFFER_SIZE], temp[BUFFER_SIZE], lstr[BUFFER_SIZE]; if (*arg) { arg = get_arg_in_braces(arg, temp, 1); substitute_vars(temp, file); substitute_myvars(file, temp, ses); expand_filename(temp, file, lstr); unlink(lstr); } else tintin_eprintf(ses, "#ERROR: valid syntax is: #unlink <filename>"); }
static void content_reg( banner_lay_tag * ban ) { text_chars * curr_t; char * pbuf; symsub * symsubval; int k; int rc; switch( ban->region->contents.content_type ) { case string_content: pbuf = mem_alloc( buf_size ); *pbuf = '\0'; if( ban->region->script_format ) { /***************************************************************/ /* substitute variables and create text_chars instances */ /***************************************************************/ for( k = 0; k < 3; ++k ) { if( ban->region->script_region[k].string != NULL ) { substitute_vars( pbuf, ban->region->script_region[k].string, ban->region->script_region[k].len ); if( *pbuf ) { curr_t = alloc_text_chars( pbuf, strlen( pbuf ), ban->region->font ); /***************************************************/ /* use font 0 for width calculation */ /* even if another font is used for banregion */ /* to get the same result as wgml4 TBD */ /***************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, 0 ); // ban->region->font ); reg_text[k] = curr_t; } } } } else { // no script format only normal string with perhaps vars substitute_vars( pbuf, ban->region->contents.string, strlen( ban->region->contents.string ) ); if( *pbuf ) { curr_t = alloc_text_chars( pbuf, strlen( pbuf ), ban->region->font ); /***********************************************************/ /* is font 0 used for width calc? TBD */ /***********************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, ban->region->font ); if( ban->region->region_position == pos_left ) { reg_text[0] = curr_t; } else if( ban->region->region_position == pos_center ) { reg_text[1] = curr_t; } else if( ban->region->region_position == pos_right ) { reg_text[2] = curr_t; } else { reg_text[0] = curr_t; // position left if unknown } } } mem_free( pbuf ); break; case author_content : rc = find_symvar( &global_dict, "$author", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "author", 6, ban->region->font ); } break; case bothead_content : rc = find_symvar( &global_dict, "$bothead", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "bothead", 7, ban->region->font ); } break; case date_content : rc = find_symvar( &global_dict, "$date", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "date", 4, ban->region->font ); } break; case docnum_content : rc = find_symvar( &global_dict, "$docnum", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "docnum", 6, ban->region->font ); } break; case head0_content : rc = find_symvar( &global_dict, "$head0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head0", 5, ban->region->font ); } break; case head1_content : rc = find_symvar( &global_dict, "$head1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head1", 5, ban->region->font ); } break; case head2_content : rc = find_symvar( &global_dict, "$head2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head2", 5, ban->region->font ); } break; case head3_content : rc = find_symvar( &global_dict, "$head3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head3", 5, ban->region->font ); } break; case head4_content : rc = find_symvar( &global_dict, "$head4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head4", 5, ban->region->font ); } break; case head5_content : rc = find_symvar( &global_dict, "$head5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head5", 5, ban->region->font ); } break; case head6_content : rc = find_symvar( &global_dict, "$head6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head6", 5, ban->region->font ); } break; case headnum0_content : rc = find_symvar( &global_dict, "$hnum0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum0", 5, ban->region->font ); } break; case headnum1_content : rc = find_symvar( &global_dict, "$hnum1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum1", 5, ban->region->font ); } break; case headnum2_content : rc = find_symvar( &global_dict, "$hnum2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum2", 5, ban->region->font ); } break; case headnum3_content : rc = find_symvar( &global_dict, "$hnum3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum3", 5, ban->region->font ); } break; case headnum4_content : rc = find_symvar( &global_dict, "$hnum4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum4", 5, ban->region->font ); } break; case headnum5_content : rc = find_symvar( &global_dict, "$hnum5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum5", 5, ban->region->font ); } break; case headnum6_content : rc = find_symvar( &global_dict, "$hnum6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum6", 5, ban->region->font ); } break; case headtext0_content : rc = find_symvar( &global_dict, "$htext0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext0", 5, ban->region->font ); } break; case headtext1_content : rc = find_symvar( &global_dict, "$htext1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext1", 5, ban->region->font ); } break; case headtext2_content : rc = find_symvar( &global_dict, "$htext2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext2", 5, ban->region->font ); } break; case headtext3_content : rc = find_symvar( &global_dict, "$htext3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext3", 5, ban->region->font ); } break; case headtext4_content : rc = find_symvar( &global_dict, "$htext4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext4", 5, ban->region->font ); } break; case headtext5_content : rc = find_symvar( &global_dict, "$htext5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext5", 5, ban->region->font ); } break; case headtext6_content : rc = find_symvar( &global_dict, "$htext6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext6", 5, ban->region->font ); } break; case pgnuma_content : rc = find_symvar( &global_dict, "$pgnuma", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnuma", 6, ban->region->font ); } break; case pgnumad_content : rc = find_symvar( &global_dict, "$pgnumad", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumad", 7, ban->region->font ); } break; case pgnumc_content : rc = find_symvar( &global_dict, "$pgnumc", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumc", 6, ban->region->font ); } break; case pgnumcd_content : rc = find_symvar( &global_dict, "$pgnumcd", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumcd", 7, ban->region->font ); } break; case pgnumr_content : rc = find_symvar( &global_dict, "$pgnumr", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumr", 6, ban->region->font ); } break; case pgnumrd_content : rc = find_symvar( &global_dict, "$pgnumrd", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumrd", 7, ban->region->font ); } break; case sec_content : rc = find_symvar( &global_dict, "$sec", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "sec", 3, ban->region->font ); } break; case stitle_content : rc = find_symvar( &global_dict, "$stitle", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "stitle", 6, ban->region->font ); } break; case title_content : rc = find_symvar( &global_dict, "$title", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "title", 6, ban->region->font ); } break; case time_content : rc = find_symvar( &global_dict, "$time", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "time", 4, ban->region->font ); } break; case tophead_content : rc = find_symvar( &global_dict, "$tophead", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "tophead", 7, ban->region->font ); } break; case no_content : // empty region curr_t = NULL; // curr_t = alloc_text_chars( "no content", 10, ban->region->font ); break; default: // the other possible banner region values are TBD curr_t = alloc_text_chars( "Dummy region", 12, ban->region->font ); break; } if( curr_t == NULL ) { /* do nothing */ } else { if( ban->region->contents.content_type != string_content ) { /***********************************************************/ /* is font 0 used for width calc? TBD */ /***********************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, ban->region->font ); if( ban->region->region_position == pos_left ) { reg_text[0] = curr_t; } else if( ban->region->region_position == pos_center ) { reg_text[1] = curr_t; } else if( ban->region->region_position == pos_right ) { reg_text[2] = curr_t; } else { reg_text[0] = curr_t; // position left if invalid } } } return; }
//* en void spit_command(char *arg) { char filename[BUFFER_SIZE], spformat[BUFFER_SIZE], soptions[BUFFER_SIZE], buffer[BUFFER_SIZE], *cptr1/*,*cptr2,*cptr3*/; FILE *myfile; BOOL bPassSpace = FALSE; BOOL bSilent = FALSE; arg=get_arg_in_braces(arg, filename, STOP_SPACES); arg=get_arg_in_braces(arg, spformat, WITH_SPACES); arg=get_arg_in_braces(arg, soptions, STOP_SPACES); if ( !filename || !*filename ) { tintin_puts2(rs::rs(1173)); return; } if ( !spformat || !*spformat ) { strcpy(spformat,"%0"); } BOOL hasD = FALSE; for(cptr1=spformat;*cptr1&&*cptr1!='\0';cptr1++) if(*cptr1=='%'&&*(cptr1+1)=='0') hasD = TRUE; if(!hasD) strcpy(cptr1," %0\0"); for(cptr1=soptions;*cptr1&&*cptr1!='\0';cptr1++) { if(*cptr1=='n') bPassSpace = TRUE; if(*cptr1=='s') bSilent = TRUE; } if((myfile=fopen(filename, "r"))==NULL) { char buff[MAX_PATH]; sprintf(buff, rs::rs(1174), filename); tintin_puts2(buff); return; } while(fgets(buffer, sizeof(buffer), myfile)) { char cbuffer[BUFFER_SIZE]; if((*buffer=='\n'||strlen(buffer)<2)&&bPassSpace) continue; /* for(cptr1=spformat,cptr3=cbuffer; *cptr1 && *cptr1!='\0'; cptr1++,cptr3++) if(*cptr1=='@') { for(cptr2=buffer;*cptr2&&*cptr2!='\0'&&*cptr2!='\n';cptr2++,cptr3++) *cptr3=*cptr2; cptr3--; } else *cptr3=*cptr1; *cptr3='\0'; */ for(cptr1=buffer;*cptr1&&*cptr1!='\n';cptr1++); *cptr1='\0'; sprintf(vars[0], "%s", buffer); substitute_vars(spformat,cbuffer); parse_input(cbuffer); } fclose(myfile); if(!bSilent) tintin_puts2(rs::rs(1175)); }
void grab_command(char *arg) { char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE], arg3[BUFFER_SIZE], buffer[BUFFER_SIZE], result[BUFFER_SIZE], *cptr; FILE *myfile; int needLine = 0; BOOL wn = FALSE; arg=get_arg_in_braces(arg, arg1, STOP_SPACES); arg=get_arg_in_braces(arg, arg2, WITH_SPACES); arg=get_arg_in_braces(arg, arg3, WITH_SPACES); if(*arg1 && isdigit(*arg1)) { wn = TRUE; needLine = atoi(arg1); } else if(!strcmpi(arg1,lastGrab)) needLine = lastLine+1; else { needLine = 1; maxLines = count_lines(arg1); } if (((!wn)&&(!arg1||!*arg1))||((wn)&&(!arg2||!*arg2))) { tintin_puts2(rs::rs(1173)); return; } if (((!wn)&&(!arg2||!*arg2))||((wn)&&(!arg3||!*arg3))) { strcpy(wn?arg3:arg2,"%0\0"); } BOOL hasD = FALSE; cptr=wn?arg3:arg2; for(;*cptr&&*cptr!='\0';cptr++) if(*cptr=='%'&&*(cptr+1)=='0') hasD = TRUE; if(!hasD) strcpy(cptr," %0\0"); if((myfile=fopen(wn?arg2:arg1, "r"))==NULL) { char buff[MAX_PATH]; sprintf(buff, rs::rs(1174), wn?arg2:arg1); tintin_puts2(buff); return; } int currLine = 0; while(fgets(buffer, sizeof(buffer), myfile)) { currLine++; if(currLine == needLine) { for(cptr=buffer;*cptr&&*cptr!='\n';cptr++); *cptr='\0'; sprintf(vars[0], "%s", buffer); substitute_vars(wn?arg3:arg2,result); parse_input(result); break; } } lastLine = (needLine != maxLines)?needLine:0; strcpy(lastGrab,wn?arg2:arg1); fclose(myfile); }
void dogoto_command(const char *arg, struct session *ses) { char A[BUFFER_SIZE], B[BUFFER_SIZE], distvar[BUFFER_SIZE], locvar[BUFFER_SIZE], pathvar[BUFFER_SIZE]; char left[BUFFER_SIZE], right[BUFFER_SIZE], tmp[BUFFER_SIZE], cond[BUFFER_SIZE]; int a, b, i, j, s; int d[MAX_LOCATIONS], ok[MAX_LOCATIONS], way[MAX_LOCATIONS]; char path[BUFFER_SIZE], *pptr; arg=get_arg(arg, A, 0, ses); arg=get_arg(arg, B, 0, ses); arg=get_arg(arg, distvar, 0, ses); arg=get_arg(arg, locvar, 0, ses); arg=get_arg(arg, pathvar, 0, ses); if ((!*A)||(!*B)) { tintin_eprintf(ses, "#SYNTAX: #dogoto <from> <to> [<distvar> [<locvar> [<pathvar>]]] [#else ...]"); return; } bool flag=*distvar||*locvar||*pathvar; for (a=0;a<MAX_LOCATIONS;a++) if (ses->locations[a]&&!strcmp(ses->locations[a], A)) break; if (a==MAX_LOCATIONS) goto not_found; for (b=0;b<MAX_LOCATIONS;b++) if (ses->locations[b]&&!strcmp(ses->locations[b], B)) break; if (b==MAX_LOCATIONS) goto not_found; for (i=0;i<MAX_LOCATIONS;i++) { d[i]=INF; ok[i]=0; } d[a]=0; do { s=INF; for (j=0;j<MAX_LOCATIONS;j++) if (!ok[j]&&(d[j]<s)) s=d[i=j]; if (s==INF) goto not_found; ok[i]=1; for (struct routenode *r=ses->routes[i];r;r=r->next) if (d[r->dest]>s+r->distance) { if (!*(r->cond)) goto good; substitute_vars(r->cond, tmp); substitute_myvars(tmp, cond, ses); if (eval_expression(cond, ses)) { good: d[r->dest]=s+r->distance; way[r->dest]=i; } } } while (!ok[b]); sprintf(tmp, "%d", d[b]); if (*distvar) set_variable(distvar, tmp, ses); j=0; for (i=b;i!=a;i=way[i]) d[j++]=i; d[j]=a; pptr=path; for (i=j;i>=0;i--) pptr+=snprintf(pptr, path-pptr+BUFFER_SIZE, " %s", ses->locations[d[i]]); pptr=path+(pptr!=path); if (*locvar) set_variable(locvar, pptr, ses); pptr=path; for (i=j;i>0;i--) { for (struct routenode *r=ses->routes[d[i]];r;r=r->next) if (r->dest==d[i-1]) { if (flag) pptr+=snprintf(pptr, path-pptr+BUFFER_SIZE, " {%s}", r->path); else { tintin_printf(ses, "%-10s>%-10s {%s}", ses->locations[d[i]], ses->locations[d[i-1]], r->path); } } } pptr=path+(pptr!=path); if (*pathvar) set_variable(pathvar, pptr, ses); return; not_found: arg=get_arg_in_braces(arg, left, 0); if (*left == tintin_char) { if (is_abrev(left + 1, "else")) { get_arg_in_braces(arg, right, 1); parse_input(right, true, ses); return; } if (is_abrev(left + 1, "elif")) { if_command(arg, ses); return; } } if (*left) tintin_eprintf(ses, "#ERROR: cruft after #dogoto: {%s}", left); if (!flag) tintin_printf(ses, "No paths from %s to %s found.", A, B); }
void goto_command(const char *arg, struct session *ses) { char A[BUFFER_SIZE], B[BUFFER_SIZE], tmp[BUFFER_SIZE], cond[BUFFER_SIZE]; int a, b, i, j, s; int d[MAX_LOCATIONS], ok[MAX_LOCATIONS], way[MAX_LOCATIONS]; char *path[MAX_LOCATIONS], *locs[MAX_LOCATIONS]; arg=get_arg(arg, A, 0, ses); arg=get_arg(arg, B, 1, ses); if ((!*A)||(!*B)) { tintin_eprintf(ses, "#SYNTAX: #goto <from> <to>"); return; } for (a=0;a<MAX_LOCATIONS;a++) if (ses->locations[a]&&!strcmp(ses->locations[a], A)) break; if (a==MAX_LOCATIONS) { tintin_eprintf(ses, "#Location not found: [%s]", A); return; } for (b=0;b<MAX_LOCATIONS;b++) if (ses->locations[b]&&!strcmp(ses->locations[b], B)) break; if (b==MAX_LOCATIONS) { tintin_eprintf(ses, "#Location not found: [%s]", B); return; } for (i=0;i<MAX_LOCATIONS;i++) { d[i]=INF; ok[i]=0; } d[a]=0; do { s=INF; for (j=0;j<MAX_LOCATIONS;j++) if (!ok[j]&&(d[j]<s)) s=d[i=j]; if (s==INF) { tintin_eprintf(ses, "#No route from %s to %s!", A, B); return; } ok[i]=1; for (struct routenode *r=ses->routes[i];r;r=r->next) if (d[r->dest]>s+r->distance) { if (!*(r->cond)) goto good; substitute_vars(r->cond, tmp); substitute_myvars(tmp, cond, ses); if (eval_expression(cond, ses)) { good: d[r->dest]=s+r->distance; way[r->dest]=i; } } } while (!ok[b]); j=0; for (i=b;i!=a;i=way[i]) d[j++]=i; for (d[i=j]=a;i>0;i--) { locs[i]=mystrdup(ses->locations[d[i]]); for (struct routenode *r=ses->routes[d[i]];r;r=r->next) if (r->dest==d[i-1]) path[i]=mystrdup(r->path); } /* we need to copy all used route data (paths and location names) because of ugly bad users who can use #unroute in the middle of a #go command */ locs[0]=mystrdup(ses->locations[b]); for (i=j;i>0;i--) { if (ses->mesvar[MSG_GOTO]) { tintin_printf(ses, "#going from %s to %s", locs[i], locs[i-1]); } parse_input(path[i], true, ses); } for (i=j;i>=0;i--) SFREE(locs[i]); for (i=j;i>0;i--) SFREE(path[i]); set_variable("loc", B, ses); }