int check_ext_menu( char **tcl_lines ) { int eax; int idx = find_pos( "\"&Xtns\" all options 1", tcl_lines, ebp_32 ); if ( idx == -1 ) { idx = find_pos( "\"&Help\" all options", tcl_lines, 0 ); if ( idx == -1 ) { idx = find_pos( "}]", tcl_lines, 0 ); if ( idx == -1 ) print_error( -21, "could not parse 'menu.tcl'.\n" ); insert_str( " \"&Xtns\" all options 1 {\n", idx, tcl_lines ); idx++; insert_str( " }\n", idx, tcl_lines ); return idx; } else { insert_str( " \"&Xtns\" all options 1 {\n", idx, tcl_lines ); idx++; insert_str( " }\n", idx, tcl_lines ); } } }
void solve() { fc = find_pos( 'F' ); cc = find_pos( 'C' ); simulation( fc, f_p, f_path ); simulation( cc, c_p, c_path ); fout << process() << std::endl; }
int syntax_error_character(char *str, char *base, char *ops) { while (str[0]) { if (find_pos(base, *str) == -1 && find_pos(ops, *str) == -1) return (1); str = str + 1; } return (0); }
void deletes(int n) { struct node *par = 0; temp = root; par = find_pos(n, root); if(temp -> data == n) { if( par -> left == temp){ if(temp -> right == 0) par ->left = temp -> left; else if(temp -> left == 0) par ->left = temp -> right; else { del_min(); } } else if(par -> right == temp) { if(temp -> right == 0) par ->right = temp -> left; else if(temp -> left == 0) par ->right = temp -> right; else { del_min(); } } else { printf("root changed\n"); if(root -> right == 0) root = root -> left; else del_min(); } } bf(par); }
bool SEIntList::remove_val(const int val) { int pos = find_pos(val); if (pos >= 0) return remove_pos(pos); return false; }
bool SEStringList::remove_val(const SEString& val) { int pos = find_pos(val); if (pos >= 0) return remove_pos(pos); return false; }
/** @fn void* pool_buddy_malloc(pool_buddy* p, pool_size size, pool_err* err) @brief Allocates size bytes in the memory @param[inout] p The buddy struct @param[in] size The number of bytes to allocate @param[out] err The error that happened @return The pointer to the allocated memory */ POOL_FUNC void* pool_buddy_malloc(pool_buddy* p, pool_size size, pool_err* err) { pool_u max_level; pool_u pos; pool_u pos_level; pool_u8 depth = pool_log2(POOL_CEIL_DIV(POOL_BUDDY_MAX_SIZE, POOL_BUDDY_BLOCK_SIZE)); POOL_SET_ERR(err, POOL_ERR_OK); POOL_SET_ERR_IF(p == NULL, err, POOL_ERR_INVALID_POOL, NULL); POOL_SET_ERR_IF(size == 0, err, POOL_ERR_INVALID_SIZE, NULL); POOL_SET_ERR_IF(size > POOL_BUDDY_MAX_SIZE, err, POOL_ERR_OUT_OF_MEM, NULL); if (size < POOL_BUDDY_BLOCK_SIZE) size = POOL_BUDDY_BLOCK_SIZE; max_level = pool_log2(POOL_BUDDY_MAX_SIZE / size); pos = find_pos(p->tree, max_level, 1, depth); POOL_SET_ERR_IF(pos == 0, err, POOL_ERR_OUT_OF_MEM, NULL); POOL_UST_BIT(p->tree, pos); pos_level = pool_log2(pos); for (; pos_level < depth; pos_level++) pos *= 2; p->allocated += pool_pow2(depth - max_level); return (void*)((pos - POOL_BUDDY_BLOCK_N)*POOL_BUDDY_BLOCK_SIZE + (char*)p->mem); }
static bool parse_base_variable_name(const char **pstr, struct Name *name, SymTable *ctxt) { const char *str = *pstr; const char *tstr; bool has_modifier = false; switch(str[1]) { case '(': case '{': /* Find eventual modifiers in the variable */ tstr = VarName_Get(str+2, name, ctxt, false, find_pos(str[1])); if (*tstr == ':') has_modifier = true; else if (*tstr != '\0') { tstr++; } break; default: name->s = str+1; name->e = str+2; name->tofree = false; tstr = str + 2; break; } *pstr = tstr; return has_modifier; }
void delete_ext_html(char *ext, char *gisbase, char **html) { int pos1, pos2, pos3; int start, end; char item[MAXSTR]; int found; int i; pos1 = find_pos("<b>Drivers sections:</b>", html, 0); /* first go to section on "Drivers" */ if (pos1 < 0) { /* we have a new version of the HTML docs that does not have a "Drivers" section anymore */ /* let's check for the special GEM comment */ pos1 = find_pos ("<!-- GEM Extensions StartHTML. Do not delete or change this comment! -->", html, 0); if (pos1 < 0) { /* sorry, I can't handle these HTML docs */ print_warning ("Unknown format of index.html. Unable to de-register HTML man pages.\n"); return; } } pos2 = find_pos("<hr>", html, pos1); /* the horizontal ruler marks the end of the HTML text */ if (find_pos("<h3>Installed extensions:</h3>", html, pos1) == -1) { /* Extensions section does not exist: bail out! */ print_warning("no extensions section found in index.html.\n"); return; } start = find_pos("<h3>Installed extensions:</h3>", html, pos1); end = find_pos("</ul>", html, start); /* check if the entry exists and if so delete */ found = 0; sprintf(item, "\">%s", ext); pos3 = find_pos(item, html, start); if (pos3 == -1) { /* does not exist: */ print_warning("extension '%s' not listed in index.html.\n", ext); return; } /* delete item, if it was found in the extensions section */ if (pos3 < end) { delete_str(pos3, html); } end--; /* end of extensions section is no one up! */ /* if no more entries left in the extensions list: delete the entire section */ pos3 = find_pos("<ul>", html, start); if ((pos3 != -1) && (end > pos3) && (end - pos3 < 2)) { for (i = 0; i < 4; i++) { delete_str(pos3 - 1, html); } } }
bool SERefList::remove_val(const SEReference & val) { int pos = find_pos(val); if (pos >= 0) return remove_pos(pos); return false; }
int analyse(char *str, char *ops, char *base, int *level_paren) { if (str[1] == ops[0]) { if (find_pos(base, *str) != -1) return (1); (*level_paren)++; } if (str[1] == ops[1]) { if (str[2]) if (find_pos(base, str[2]) != -1) return (1); (*level_paren)--; } if (*level_paren < 0) return (1); return (0); }
void node::add(key_t key, unique_ptr<node>& other) { check_invariants(); assert(size < range_max); assert(other.get() != nullptr); const auto pos = find_pos(key); place_key(key, pos); children[pos + 1] = move(other); children[pos + 1]->parent = this; check_invariants(); }
void quick_sort(int *arr, int low, int high) { int pos; if (low < high) { pos = find_pos(arr, low, high); quick_sort(arr, low, pos - 1); quick_sort(arr, pos + 1, high); } }
void node::insert(key_t key) { check_invariants(); if(!is_leaf()) { auto key_pos = find_pos(key); if(!children[key_pos]) children[key_pos] = unique_ptr<node>(new node(this)); else if(children[key_pos]->size == range_max) { split(children[key_pos].get()); key_pos = find_pos(key); } children[key_pos]->insert(key); check_invariants(); return; } place_key(key, find_pos(key)); check_invariants(); }
void my_abs(char **str, int sens, char *ops) { char *result; t_limits limite; int signe; result = *str; signe = 1; limite.left = limite.right = 0; while (result[limite.right] && (find_pos(ops, result[limite.right]) == 2 || find_pos(ops, result[limite.right]) == 3)) { if (find_pos(ops, result[limite.right]) == 3) signe *= -1; limite.right = limite.right + 1; } result = my_remove(result, limite.right, my_strlen(result), ops); if ((signe == -1 && sens == 0) || sens < 0) add_sign(&result, ops[3]); *str = result; }
int book_move(board_t * board) { int best_move; int best_score; int pos; entry_t entry[1]; int move; int score; list_t list[1]; int i; ASSERT(board!=NULL); if (BookFile != NULL && BookSize != 0) { // draw a move according to a fixed probability distribution best_move = MoveNone; best_score = 0; for (pos = find_pos(board->key); pos < BookSize; pos++) { read_entry(entry,pos); if (entry->key != board->key) break; move = entry->move; score = entry->count; // pick this move? ASSERT(score>0); best_score += score; if (my_random(best_score) < score) best_move = move; } if (best_move != MoveNone) { // convert PolyGlot move into Fruit move; TODO: handle promotes gen_legal_moves(list,board); for (i = 0; i < list->size; i++) { move = list->move[i]; if ((move & 07777) == best_move) return move; } } } return MoveNone; }
void del_min() { struct node *del = temp, *par; temp = temp -> right; par = find_pos(0, del); del -> data = temp -> data; if(par -> right == temp) par -> right = 0; else par -> left = 0; free(temp); }
int gravity_monster(t_struct *st) { t_pos pos; int i; int size; size = count_char(st->file, 'm'); i = 0; while (i < size) { pos = find_pos(st->tmap, i); if (pos.y != -42) check_m(st, pos); i++; } return (0); }
void inserts(int n) { struct node *p, *par; temp = root; par = find_pos(n, root); p = (struct node *)malloc(sizeof(struct node)); p -> data = n; p -> left = 0; p -> right = 0; p -> right = 0; p -> parent = temp; if ( temp -> data > n) temp -> left = p; if (temp -> data < n) temp -> right = p; bf(temp); }
struct node *find_pos(int n, struct node *parent) { if(temp) { if(temp -> data > n){ if(temp -> left) { parent = temp; temp = temp -> left; } else return parent; } else if(temp -> data < n) { if(temp -> right) { parent = temp; temp = temp -> right; } else return parent; } else return parent; find_pos(n, parent); } else return parent; }
iterator insert( const data_type& t ) { size_type x = find_pos( t.first ); return at_insert( x, t ); }
void Ship2::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CPropertyPage::OnPaint() //获取经纬度用到的变量 int i, j, k, TF; const char *find_pos(const char *min_pos, const char *begin, char **ret_string); double transLgt(char *lgt); double transLat(char *lat); void calWidth(double *latitude, double *longitude, double * width); double latitude[9999] = { 0 }, longitude[9999] = { 0 }, width[9999] = { -9999 }; char *buffer = (char *)malloc(MAX_BUFFER); //获取船信息用到的变量 char *buffer2 = (char *)malloc(MAX_BUFFER); char *buffer3 = (char *)malloc(MAX_BUFFER); char shipname[100], type[100], load_status[10], loa[20], breadth[20], draft[20], disp[20]; int bound[1000]; FILE *input; //将CString转换成const char * LPCTSTR p = pathname2.GetBuffer(); DWORD dwMinSize; dwMinSize = WideCharToMultiByte(CP_ACP, NULL, p, -1, NULL, 0, NULL, FALSE); char *pathname_c = new char[dwMinSize];; WideCharToMultiByte(CP_OEMCP, NULL, p, -1, pathname_c, dwMinSize, NULL, FALSE); fopen_s(&input, pathname_c, "r"); int flag = 0; int jj, iii; //获取船的信息 for (j = 0;;) { if (flag == 2) break; fgets(buffer2, MAX_BUFFER, input); if (feof(input)) break; //先匹配到OS,获取船名等信息 if (buffer2[0] == 'O' && buffer2[1] == 'S') { flag++; // printf("%s", buffer); fgets(buffer3, MAX_BUFFER, input); // printf("%s", buffer2); for (int ii = 4, num = 0; num < 3; ii++) { if (buffer2[ii] != ':') continue; else { num++; int jj, iii; for (jj = ii + 2; buffer2[jj]; jj++) { if (buffer2[jj] == ',') break; // else // continue; } switch (num) { case 1: { for (iii = 0; iii < jj - ii - 2; iii++) { shipname[iii] = buffer2[ii + 2 + iii]; } shipname[iii] = '\0'; break; } case 2: { for (iii = 0; iii < jj - ii - 2; iii++) { type[iii] = buffer2[ii + 2 + iii]; } type[iii] = '\0'; break; } case 3: { for (iii = 0; iii < jj - ii - 2; iii++) { load_status[iii] = buffer2[ii + 2 + iii]; } load_status[iii - 1] = '\0'; break; } } } } for (int ii = 0, num = 3; num < 7; ii++) { if (buffer3[ii] != ':') continue; else { num++; int jj, iii; for (jj = ii + 2; buffer3[jj]; jj++) { if (buffer3[jj] == ',') break; // else // continue; } switch (num) { case 4: { for (iii = 0; iii < jj - ii - 2; iii++) { loa[iii] = buffer3[ii + 2 + iii]; } loa[iii] = '\0'; break; } case 5: { for (iii = 0; iii < jj - ii - 2; iii++) { breadth[iii] = buffer3[ii + 2 + iii]; } breadth[iii] = '\0'; break; } case 6: { for (iii = 0; iii < jj - ii - 2; iii++) { draft[iii] = buffer3[ii + 2 + iii]; } draft[iii] = '\0'; break; } case 7: { for (iii = 0; iii < jj - ii - 2; iii++) { disp[iii] = buffer3[ii + 2 + iii]; } disp[iii - 1] = '\0'; break; } } } } } else continue; } _bstr_t bstrShipname(shipname); shipName2.SetWindowTextW((LPTSTR)bstrShipname); _bstr_t bstrType(type); type2.SetWindowTextW((LPTSTR)bstrType); _bstr_t bstrLoadstatus(load_status); loadStatus2.SetWindowTextW((LPTSTR)bstrLoadstatus); _bstr_t bstrLoa(loa); LOA2.SetWindowTextW((LPTSTR)bstrLoa); _bstr_t bstrBreadth(breadth); breadth2.SetWindowTextW((LPTSTR)bstrBreadth); _bstr_t bstrDraft(draft); draft2.SetWindowTextW((LPTSTR)bstrDraft); _bstr_t bstrDisp_v(disp); DISP_V2.SetWindowTextW((LPTSTR)bstrDisp_v); //获取经纬度 int count_l = 0; for (j = 0;;) { if (count_l == 1) break; for (i = 0; i < 9999; i++) { latitude[i] = 0; longitude[i] = 0; width[i] = -9999; } int test = 0; fgets(buffer, MAX_BUFFER, input); if (feof(input)) break; //先匹配到一行行头为‘-’,找到新的一块儿数据,j为块号 if (buffer[0] != '-') continue; else { j++; count_l++; // printf("【%d】\n", j); } for (i = 0, k = 0, TF = 0;; i++) { fgets(buffer, MAX_BUFFER, input); if (feof(input)) break; char *lat, *lgt; const char *tmp = buffer; tmp = find_pos(buffer, tmp, &lat); tmp = find_pos(buffer, tmp, &lgt); if ((lat == NULL || lgt == NULL) && TF) break; else if (lat == NULL || lgt == NULL) continue; else TF = 1; latitude[k] = transLat(lat); longitude[k] = transLgt(lgt); printf("%lf %lf\n", latitude[k], longitude[k]); k++; free(lat); free(lgt); } int final, count_dc = 0; CWnd *pwnd = GetDlgItem(IDC_IMAGE2); CRect rect; pwnd->GetWindowRect(&rect); int width_rec = rect.Width(); int height_rec = rect.Height(); double max_lat = 0.0, min_lat = latitude[0]; double max_lon = 0.0, min_lon = longitude[0]; double new_longitude[MAX_BUFFER], new_latitude[MAX_BUFFER]; //初始化新声明的坐标数组 for (i = 0; i < MAX_BUFFER; i++) { new_latitude[i] = 0.0; new_longitude[i] = 0.0; } //求最大,最小的经度和纬度 for (i = 0;; i++) { if (latitude[i] == 0 && longitude[i] == 0) break; if (latitude[i] > max_lat) max_lat = latitude[i]; if (latitude[i] < min_lat) min_lat = latitude[i]; if (longitude[i]>max_lon) max_lon = longitude[i]; if (longitude[i] < min_lon) min_lon = longitude[i]; } //将坐标等比例转换为控件坐标 for (i = 0;; i++) { if (latitude[i] == 0 && longitude[i] == 0) break; if (max_lon != min_lon) new_longitude[i] = height_rec*((longitude[i] - min_lon) / (max_lon - min_lon)); else new_longitude[i] = longitude[i]; if (max_lat != min_lat) new_latitude[i] = width_rec*((latitude[i] - min_lat) / (max_lat - min_lat)); else new_latitude[i] = latitude[i]; } CClientDC *dc[MAX_BUFFER]; for (i = 1;; i++) { if (new_latitude[i] == 0 && new_longitude[i] == 0) break; //若有不同坐标,则画线 if (new_latitude[i] != new_latitude[i - 1] || new_longitude[i] != new_longitude[i - 1]) { dc[count_dc] = new CClientDC(pwnd); (*dc[count_dc]).MoveTo((int)new_latitude[i - 1], (int)new_longitude[i - 1]); (*dc[count_dc]).LineTo((int)new_latitude[i], (int)new_longitude[i]); count_dc++; } } calWidth(latitude, longitude, width); for (i = 0; width[i] != -9999 && i < 9999; i++) { printf("【width %d】%lf\n", i, width[i]); } } }
void new_ext_html(char *ext, char *gisbase, char **html, int major, int minor, int revision) { int pos1, pos2, pos3; int start, end; int insert_here; char *first_char; char *last_char; char item[MAXSTR]; int len; pos1 = find_pos("<b>Drivers sections:</b>", html, 0); /* first go to section on "Drivers" */ if (pos1 < 0) { /* we have a new version of the HTML docs that does not have a "Drivers" section anymore */ /* let's check for the special GEM comment */ pos1 = find_pos ("<!-- GEM Extensions StartHTML. Do not delete or change this comment! -->", html, 0); if (pos1 < 0) { /* sorry, I can't handle these HTML docs */ print_warning ("Unknown format of index.html. Unable to register HTML man pages.\n"); return; } } pos2 = find_pos("<hr>", html, pos1); /* the horizontal ruler marks the end of the HTML text */ if (find_pos("<h3>Installed extensions:</h3>", html, pos1) == -1) { /* Extensions section does not yet exist: create it now */ insert_str("<h3>Installed extensions:</h3>\n", pos2, html); insert_str("<ul>\n", pos2 + 1, html); insert_str("</ul>\n", pos2 + 2, html); insert_str("<p>\n", pos2 + 3, html); } start = find_pos("<h3>Installed extensions:</h3>", html, pos1); end = find_pos("</ul>", html, start); insert_here = start + 2; /* check if this entry already exists and if so: bail out or overwrite, if force mode */ sprintf(item, "\">%s", ext); pos3 = find_pos(item, html, insert_here); if (pos3 != -1) { /* exists: */ print_warning("list item '%s' exists in index.html.\n", ext); if ((FORCE) && (UPGRADE)) { sprintf(item, "<li><a href=\"../extensions/%s/index.html\">%s (%i.%i.%i)</a>\n", ext, ext, major, minor, revision); strcpy(html[pos3], item); } return; } /* now go through all links in the Extensions section and insert this one in the right alphabetical position */ pos3 = find_pos("<li><a href=", html, start); while ((pos3 != -1) && (pos3 < end)) { /* extract name of extension at this position */ first_char = strrchr(html[pos3], '"'); last_char = strrchr(html[pos3], '<'); len = (last_char - first_char) / sizeof(char); strncpy(item, first_char + 2 * sizeof(char), len); item[len - 1] = '\0'; /* get rid of '<' */ if (strcmp(ext, item) < 0) { insert_here = pos3; break; /* found our position: let's quit this! */ } /* look for next item */ start++; pos3 = find_pos("<li><a href=", html, start); } /* now insert new entry for this extension */ sprintf(item, "<li><a href=\"../extensions/%s/index.html\">%s (%i.%i.%i)</a>\n", ext, ext, major, minor, revision); insert_str(item, insert_here, html); }
void Var_SubstVar(Buffer buf, /* To store result */ const char *str, /* The string in which to substitute */ struct LoopVar *l, /* Handle */ const char *val) /* Its value */ { const char *var = l->me->name; var_set_value(l->me, val); for (;;) { const char *start; /* Copy uninteresting stuff */ for (start = str; *str != '\0' && *str != '$'; str++) ; Buf_Addi(buf, start, str); start = str; if (*str++ == '\0') break; str++; /* and escaped dollars */ if (start[1] == '$') { Buf_Addi(buf, start, start+2); continue; } /* Simple variable, if it's not us, copy. */ if (start[1] != '(' && start[1] != '{') { if (start[1] != *var || var[1] != '\0') { Buf_AddChars(buf, 2, start); continue; } } else { const char *p; char paren = start[1]; /* Find the end of the variable specification. */ p = find_pos(paren)(str); /* A variable inside the variable. We don't know how to * expand the external variable at this point, so we * try again with the nested variable. */ if (*p == '$') { Buf_Addi(buf, start, p); str = p; continue; } if (strncmp(var, str, p - str) != 0 || var[p - str] != '\0') { /* Not the variable we want to expand. */ Buf_Addi(buf, start, p); str = p; continue; } if (*p == ':') { bool doFree; /* should val be freed ? */ char *newval; struct Name name; doFree = false; name.s = var; name.e = var + (p-str); /* val won't be freed since !doFree, but * VarModifiers_Apply doesn't know that, * hence the cast. */ newval = VarModifiers_Apply((char *)val, &name, NULL, false, &doFree, &p, paren); Buf_AddString(buf, newval); if (doFree) free(newval); str = p; continue; } else str = p+1; } Buf_AddString(buf, val); } }
void main() { SeqList mylist; InitSeqList(&mylist); ElemType Item; int pos; int select = 1; while(select) { printf("**********************************************\n"); printf("** [1] push_back [2] push_front **\n"); printf("** [3] pop_back [4] pop_front **\n"); printf("** [5] insert_pos [6] show_list **\n"); printf("** [7] del_pos [8] del_val **\n"); printf("** [9] find_pos [10]find_Elem **\n"); printf("** [11]sort [12]resver **\n"); printf("** [13]clear [14]merge **\n"); printf("** [15]destroy [0]quit_system **\n"); printf("**********************************************\n"); printf("请选择:>"); scanf("%d",&select); if(select == 0) { break; } switch(select) { case 1: { printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&Item),Item!=-1) //此处为逗号表达式,真假值由最后一个表达式决定, //所以此处在扫描到Item不是-1时就会自动执行一下下面的函数, //所以每输入一次非-1的数就头插一次。 { push_back(&mylist,Item); } break; } case 2: { printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&Item),Item!=-1) //此处为逗号表达式,真假值由最后一个表达式决定, //所以此处在扫描到Item不是-1时就会自动执行一下下面的函数, //所以每输入一次非-1的数就头插一次。 { push_front(&mylist,Item); } break; } case 3: { pop_back(&mylist); break; } case 4: { pop_front(&mylist); break; } case 5: { ElemType e; printf("请输入要插入的位置,当前有元素%d:",mylist.size); scanf("%d",&pos); printf("请输入要插入的元素值:"); scanf("%d",&e); insert_pos(&mylist,pos,e); break; } case 6: { show_list(&mylist); break; } case 7: { printf("请输入要删除的位置,当前有元素%d:",mylist.size); scanf("%d",&pos); del_pos(&mylist,pos); break; } case 8: { printf("请输入要删除的元素:"); scanf("%d",&Item); printf("start and Item=%d\n",Item); del_val(&mylist,Item); break; } case 9: { printf("请输入要查找线性表元素的位置:"); scanf("%d",&pos); find_pos(&mylist,pos,&Item); printf("线性表的第%d个元素为:%d\n",pos,Item); break; } case 10: { printf("请输入要查找的元素:"); scanf("%d",&Item); find_Elem(&mylist,Item,&pos); printf("元素%d所在位置为:%d\n",Item,pos); break; } case 11: { sort(&mylist); break; } case 12: { printf("resver start.\n"); resver(&mylist); printf("resver end!\n"); break; } case 13: { clear(&mylist); break; } case 14: { printf("目前无法测试,因为只有一个线性表,无法做合并操作。\n"); //merge(SeqList *list1,SeqList *list2,SeqList *list_merge); break; } case 15: { destroy(&mylist); break; } default: { printf("输入的选择不存在,请重新输入。\n"); select=1; break; } } } }
bool SEStringList::contains(const SEString& val) { return (find_pos(val) >= 0); }
bool SERefList::contains(const SEReference & val) { return (find_pos(val) >= 0); }
bool SEIntList::contains(const int val) { return (find_pos(val) >= 0); }
int deregister_entries_gisman( char *pkg_short_name, char *gisbase ) { int eax; char file[2048]; char str[2048]; char tmp[2048]; char **line; int n_lines, i; int n_lines_org, n_lines_new; FILE *f_in, *f_out; int pos; int start, end; int start_sub, end_sub; char *lq, *rq; int num_removed; sprintf( file, "%s/etc/dm/menu.tcl", gisbase ); f_in = (FILE*)fopen( file, "r" ); if ( f_in == 0 ) { if ( *(int*)(__errno_location( )) == 2 ) { return num_removed; } else { fclose( f_in ); print_error( -22, "checking for file '%s': %s\n", file[0], strerror( *(int*)(__errno_location( )) ) ); } } memcpy( TMP_GISMAN, "/tmp/grass.extensions.db.XXXXXX", 32 ); mkstemp( TMP_GISMAN ); f_out = (FILE*)fopen( TMP_GISMAN, "w+" ); if ( f_out == 0 ) { print_error( -21, "could not create temp file '%s': %s\n \t\t\tMake sure that directory /tmp exists on your system and you have write permission.\n", TMP_GISMAN[0], strerror( *(int*)(__errno_location( )) ) ); } atexit( &exit_db ); if ( VERBOSE ) sprintf( str, "cp -vf %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak ; \t\t\t\t\t\tcp -vf %s %s/etc/dm/menu.tcl ; chmod -v a+r %s/etc/dm/menu.tcl ;", gisbase, gisbase, TMP_GISMAN, gisbase, gisbase ); else sprintf( str, "cp -f %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak &> %s ; \t\t\t\t\t\tcp -f %s %s/etc/dm/menu.tcl &> %s ; chmod a+r %s/etc/dm/menu.tcl &> %s ;", gisbase, gisbase, TMP_NULL, TMP_GISMAN, gisbase, TMP_NULL, gisbase, TMP_NULL ); strcpy( GISMAN_CMD, str ); n_lines = 0; for ( ; fgets( str, 2048, f_in ); n_lines++ ) { // n_lines++; } if ( n_lines == 0 ) { } else { rewind( f_in ); n_lines_org = n_lines; line = calloc( n_lines + 1, sizeof( char* ) ); i = 0; for ( ; i < n_lines + 1; i++ ) { line[ i ] = 0; // i++; } i = 0; for ( ; fgets( str, 2048, f_in ); i++ ) { line[ i ] = malloc( ( strlen( str ) + 1 ) * sizeof( char ) ); strcpy( line[ i ], str ); // i++; } sprintf( str, "#(DO_NOT_REMOVE_THIS_COMMENT) <%s> {cascad", pkg_short_name ); pos = find_pos( str, line, 0 ); if ( pos == -1 ) { print_warning( "could not find uninstall information in 'menu.tcl'.\n" ); } else { lq = strchr( line[ pos ], '"' ); lq++; rq = strchr( lq, '"' ); strcpy( tmp, lq ); tmp[ rq - lq ] = 0; start = find_pos( "\"&Xtns\" all options 1", line, 0 ); end = find_pos( "\" all options", line, start + 1 ) + -1; if ( end == -1 ) { end = find_pos( "}]", line, 0 ); } if ( start == -1 ) { print_warning( "menu 'Xtns' does not exist.\n" ); } else { sprintf( str, "{cascad \"%s\"", tmp ); start_sub = find_pos( str, line, start ); if ( start_sub == -1 || end < start_sub ) { print_warning( "could not find submenu entry '%s' in 'menu.tcl'.\n", tmp[0] ); } else { end_sub = find_pos( " \t\t\t}}", line, start_sub ); if ( end_sub == -1 || end < end_sub ) { print_warning( "could not find end of submenu entry '%s' in 'menu.tcl'.\n", tmp[0] ); } else { num_removed = 0; i = 0; for ( ; i < ( end_sub - start_sub ) + 1; i++ ) { delete_str( start_sub, line ); num_removed++; // i++; } sprintf( str, "#(DO_NOT_REMOVE_THIS_COMMENT) <%s> {cascad", pkg_short_name ); pos = find_pos( str, line, 0 ); delete_str( pos, line ); num_removed++; start = find_pos( "\"&Xtns\" all options 1", line, 0 ); end = find_pos( "\" all options", line, start + 1 ) + -1; if ( end - start <= 2 ) { i = 0; for ( ; i < ( end - start ) + 1; i++ ) { delete_str( start, line ); num_removed++; // i++; } } i = 0; for ( ; line[ i ]; i++ ) { fprintf( f_out, line[ i ] ); // i++; } fflush( f_out ); rewind( f_out ); n_lines_new = 0; for ( ; fgets( str, 2048, f_out ); n_lines_new++ ) { // n_lines_new++; } if ( n_lines_new == 0 ) { print_warning( "file truncation detected. Retaining orginal file 'menu.tcl'.\n" ); memcpy( GISMAN_CMD, "", 1 ); } fclose( f_in ); fclose( f_out ); i = 0; for ( ; i < n_lines + 1; i++ ) { free( line[ i ] ); // i++; } free( line ); } } } } } }
int new_submenu( char *pkg_short_name, char *menu, char **tcl_lines ) { int eax; char tmp[2048]; char tmp2[2048]; char searchstr[2048]; int idx = find_pos( "\"&Xtns\" all options", tcl_lines, 0 ), idx2; int insert_here; int last = find_pos( "\" all options", tcl_lines, idx + 1 ) + -1; char *first_quote; char *second_quote; int len; int terminator; if ( last == -1 ) { last = find_pos( "}]", tcl_lines, 0 ); } if ( is_submenu( menu ) == 0 ) { print_warning( "first line not a submenu specifier in 'entries-gisman'.\n" ); } else { len = strrchr( menu, ']' ) - strchr( menu, '[' ); strncpy( tmp, strchr( menu, '[' ) + 1, len ); tmp[ len + -1 ] = 0; sprintf( searchstr, "{cascad \"%s\"", tmp ); idx2 = find_pos( searchstr, tcl_lines, idx ); if ( idx2 != -1 && idx2 < last ) { print_warning( "submenu '%s' exists in GIS Manager's Xtns menu.\n", tmp[0] ); } else { insert_here = idx + 1; idx2 = find_pos( "{cascad ", tcl_lines, idx ); for ( ; idx2 != -1 && idx2 < last; ) { first_quote = strchr( tcl_lines[ idx2 ], '"' ); second_quote = strchr( &first_quote[1], '"' ); len = second_quote - first_quote; strncpy( tmp2, &first_quote[1], len ); tmp2[ len + -1 ] = 0; if ( strcmp( tmp, tmp2 ) < 0 ) { insert_here = idx2; break; } else { idx++; idx2 = find_pos( "{cascad ", tcl_lines, idx ); } } sprintf( tmp, " \t\t\t%s {} \"\" 1 {\n", searchstr ); insert_str( tmp, insert_here, tcl_lines ); insert_str( " \t\t\t}}\n", insert_here + 1, tcl_lines ); terminator = find_pos( "}]", tcl_lines, 0 ); sprintf( tmp, "#(DO_NOT_REMOVE_THIS_COMMENT) <%s> %s {} \"\" 1 {\n", pkg_short_name, searchstr ); insert_str( tmp, terminator + 1, tcl_lines ); } } return insert_here + 1; }