int editcmd_dialog_replace_prompt_show (WEdit * edit, char *from_text, char *to_text, int xpos, int ypos) { Widget *w = WIDGET (edit); /* dialog size */ int dlg_height = 10; int dlg_width; char tmp[BUF_MEDIUM]; char *repl_from, *repl_to; int retval; if (xpos == -1) xpos = w->x + option_line_state_width + 1; if (ypos == -1) ypos = w->y + w->lines / 2; /* Sometimes menu can hide replaced text. I don't like it */ if ((edit->curs_row >= ypos - 1) && (edit->curs_row <= ypos + dlg_height - 1)) ypos -= dlg_height; dlg_width = WIDGET (w->owner)->cols - xpos - 1; g_snprintf (tmp, sizeof (tmp), "\"%s\"", from_text); repl_from = g_strdup (str_trunc (tmp, dlg_width - 7)); g_snprintf (tmp, sizeof (tmp), "\"%s\"", to_text); repl_to = g_strdup (str_trunc (tmp, dlg_width - 7)); { quick_widget_t quick_widgets[] = { /* *INDENT-OFF* */ QUICK_LABEL (repl_from, NULL), QUICK_LABEL (N_("Replace with:"), NULL), QUICK_LABEL (repl_to, NULL), QUICK_START_BUTTONS (TRUE, TRUE), QUICK_BUTTON (N_("&Replace"), B_ENTER, NULL, NULL), QUICK_BUTTON (N_("A&ll"), B_REPLACE_ALL, NULL, NULL), QUICK_BUTTON (N_("&Skip"), B_SKIP_REPLACE, NULL, NULL), QUICK_BUTTON (N_("&Cancel"), B_CANCEL, NULL, NULL), QUICK_END /* *INDENT-ON* */ }; quick_dialog_t qdlg = { ypos, xpos, -1, N_("Confirm replace"), NULL, quick_widgets, NULL, NULL }; retval = quick_dialog (&qdlg); } g_free (repl_from); g_free (repl_to); return retval; }
static int ssl_cert_digest(SSL* p_ssl, struct vsf_session* p_sess, struct mystr* p_str) { X509* p_cert = SSL_get_peer_certificate(p_ssl); unsigned int num_bytes = 0; if (p_cert == NULL) { return 0; } str_reserve(p_str, EVP_MAX_MD_SIZE); str_empty(p_str); str_rpad(p_str, EVP_MAX_MD_SIZE); if (!X509_digest(p_cert, EVP_sha256(), (unsigned char*) str_getbuf(p_str), &num_bytes)) { die("X509_digest failed"); } X509_free(p_cert); if (tunable_debug_ssl) { unsigned int i; str_alloc_text(&debug_str, "Cert digest:"); for (i = 0; i < num_bytes; ++i) { str_append_char(&debug_str, ' '); str_append_ulong( &debug_str, (unsigned long) (unsigned char) str_get_char_at(p_str, i)); } vsf_log_line(p_sess, kVSFLogEntryDebug, &debug_str); } str_trunc(p_str, num_bytes); return 1; }
static int control_getline(struct mystr* p_str, struct vsf_session* p_sess) { int ret; if (p_sess->p_control_line_buf == 0) { vsf_secbuf_alloc(&p_sess->p_control_line_buf, VSFTP_MAX_COMMAND_LINE); } ret = ftp_getline(p_sess, p_str, p_sess->p_control_line_buf); if (ret == 0) { return ret; } else if (ret < 0) { vsf_cmdio_write_exit(p_sess, FTP_BADCMD, "Input line too long.", 1); } /* As mandated by the FTP specifications.. */ str_replace_char(p_str, '\0', '\n'); /* If the last character is a \r, strip it */ { unsigned int len = str_getlen(p_str); while (len > 0 && str_get_char_at(p_str, len - 1) == '\r') { str_trunc(p_str, len - 1); --len; } } return 1; }
static void tree_copy (WTree * tree, const char *default_dest) { char msg[BUF_MEDIUM]; char *dest; if (tree->selected_ptr == NULL) return; g_snprintf (msg, sizeof (msg), _("Copy \"%s\" directory to:"), str_trunc (vfs_path_as_str (tree->selected_ptr->name), 50)); dest = input_expand_dialog (Q_ ("DialogTitle|Copy"), msg, MC_HISTORY_FM_TREE_COPY, default_dest, INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD); if (dest != NULL && *dest != '\0') { file_op_context_t *ctx; file_op_total_context_t *tctx; ctx = file_op_context_new (OP_COPY); tctx = file_op_total_context_new (); file_op_context_create_ui (ctx, FALSE, FILEGUI_DIALOG_MULTI_ITEM); tctx->ask_overwrite = FALSE; copy_dir_dir (tctx, ctx, vfs_path_as_str (tree->selected_ptr->name), dest, TRUE, FALSE, FALSE, NULL); file_op_total_context_destroy (tctx); file_op_context_destroy (ctx); } g_free (dest); }
static void tree_copy (WTree *tree, const char *default_dest) { char msg [BUF_MEDIUM]; char *dest; off_t count = 0; double bytes = 0; FileOpContext *ctx; if (tree->selected_ptr == NULL) return; g_snprintf (msg, sizeof (msg), _("Copy \"%s\" directory to:"), str_trunc (tree->selected_ptr->name, 50)); dest = input_expand_dialog (_(" Copy "), msg, MC_HISTORY_FM_TREE_COPY, default_dest); if (dest != NULL && *dest != '\0') { ctx = file_op_context_new (OP_COPY); file_op_context_create_ui (ctx, FALSE); copy_dir_dir (ctx, tree->selected_ptr->name, dest, 1, 0, 0, 0, &count, &bytes); file_op_context_destroy (ctx); } g_free (dest); }
/* * void encrypt_string( STRING *sstr, STRING *estr, int shift ) * * Performs encrypting on a single string. Both the source string * (sstr) and the container (estr) must be valid. * Additionally a custom shift value can be passed. * * Another variant using the default shift macro (__SHIFT) can be found below. */ void encrypt_string( STRING *sstr, STRING *estr, int shift ) { if( !sstr || !estr ) return; sstr = str_create(sstr); estr = str_create(""); STRING *buffer = ""; int counter = 0; int temp_val = 0; int length = str_len(sstr); while( counter < length ) { str_cpy(buffer, sstr); str_clip(buffer, counter); str_trunc(buffer, length - counter - 1); temp_val = str_to_asc(buffer) + shift; str_for_asc(buffer, temp_val); str_cat(estr, buffer); counter++; } }
static void str_split_text_common(struct mystr* p_src, struct mystr* p_rhs, const char* p_text, int is_reverse) { struct str_locate_result locate_result; unsigned int indexx; unsigned int search_len = vsf_sysutil_strlen(p_text); if (is_reverse) { locate_result = str_locate_text_reverse(p_src, p_text); } else { locate_result = str_locate_text(p_src, p_text); } /* Not found? */ if (!locate_result.found) { str_empty(p_rhs); return; } indexx = locate_result.index; if (indexx + search_len > p_src->len) { bug("indexx invalid in str_split_text"); } /* Build rhs */ private_str_alloc_memchunk(p_rhs, p_src->p_buf + indexx + search_len, p_src->len - indexx - search_len); /* Build lhs */ str_trunc(p_src, indexx); }
void edit_symlink_cmd (void) { if (S_ISLNK (selection (current_panel)->st.st_mode)) { char buffer[MC_MAXPATHLEN]; char *p = NULL; int i; char *q; vfs_path_t *p_vpath; p = selection (current_panel)->fname; p_vpath = vfs_path_from_str (p); q = g_strdup_printf (_("Symlink '%s\' points to:"), str_trunc (p, 32)); i = readlink (p, buffer, MC_MAXPATHLEN - 1); if (i > 0) { char *dest; buffer[i] = 0; dest = input_expand_dialog (_("Edit symlink"), q, MC_HISTORY_FM_EDIT_LINK, buffer, INPUT_COMPLETE_FILENAMES); if (dest) { if (*dest && strcmp (buffer, dest)) { save_cwds_stat (); if (mc_unlink (p_vpath) == -1) { message (D_ERROR, MSG_ERROR, _("edit symlink, unable to remove %s: %s"), p, unix_error_string (errno)); } else { vfs_path_t *dest_vpath; dest_vpath = vfs_path_from_str_flags (dest, VPF_NO_CANON); if (mc_symlink (dest_vpath, p_vpath) == -1) message (D_ERROR, MSG_ERROR, _("edit symlink: %s"), unix_error_string (errno)); vfs_path_free (dest_vpath); } update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } g_free (dest); } } g_free (q); vfs_path_free (p_vpath); } else { message (D_ERROR, MSG_ERROR, _("'%s' is not a symbolic link"), selection (current_panel)->fname); } }
void str_empty(struct mystr* p_str) { /* Ensure a buffer is allocated. */ (void) str_getbuf(p_str); str_trunc(p_str, 0); }
const char * path_trunc (const char *path, size_t trunc_len) { char *secure_path = strip_password (g_strdup (path), 1); const char *ret = str_trunc (secure_path, trunc_len); g_free (secure_path); return ret; }
int str_getline (str_t d, FILE *f) { char *res, *ptr; int szres, pending = 0; str_size_check (d, 0); str_trunc (d, 0); for (;;) { int j; ptr = d->heap + d->length; szres = d->size - d->length; res = fgets (ptr, szres, f); if (res == NULL) { if (feof (f) && pending) return 0; return (-1); } for (j = 0; j < szres; j++) { if (ptr[j] == '\n' || ptr[j] == 0) { ptr[j] = 0; d->length += j; break; } } if (j < szres - 1) break; pending = 1; str_size_check (d, 2 * d->length); } if (d->length > 0) { if (d->heap[d->length - 1] == '\015') { d->heap[d->length - 1] = 0; d->length --; } } return 0; }
int str_netfd_read(struct mystr* p_str, int fd, unsigned int len) { int retval; str_reserve(p_str, len); str_trunc(p_str, len); retval = str_read_loop(p_str, fd); if (vsf_sysutil_retval_is_error(retval) || (unsigned int) retval != len) { return -1; } return retval; }
static void do_link (link_type_t link_type, const char *fname) { char *dest = NULL, *src = NULL; if (link_type == LINK_HARDLINK) { src = g_strdup_printf (_("Link %s to:"), str_trunc (fname, 46)); dest = input_expand_dialog (_("Link"), src, MC_HISTORY_FM_LINK, ""); if (!dest || !*dest) goto cleanup; save_cwds_stat (); if (-1 == mc_link (fname, dest)) message (D_ERROR, MSG_ERROR, _("link: %s"), unix_error_string (errno)); } else { char *s; char *d; /* suggest the full path for symlink, and either the full or relative path to the file it points to */ s = concat_dir_and_file (current_panel->cwd, fname); if (get_other_type () == view_listing) d = concat_dir_and_file (other_panel->cwd, fname); else d = g_strdup (fname); if (link_type == LINK_SYMLINK_RELATIVE) s = diff_two_paths (other_panel->cwd, s); symlink_dialog (s, d, &dest, &src); g_free (d); g_free (s); if (!dest || !*dest || !src || !*src) goto cleanup; save_cwds_stat (); if (-1 == mc_symlink (dest, src)) message (D_ERROR, MSG_ERROR, _("symlink: %s"), unix_error_string (errno)); } update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); cleanup: g_free (src); g_free (dest); }
/** Draw the status line at the top of the screen. The size of the filename * field varies depending on the width of the screen and the length of * the filename. */ void edit_status (WEdit * edit) { const int w = edit->widget.owner->cols; const size_t status_size = w + 1; char *const status = g_malloc (status_size); int status_len; const char *fname = ""; int fname_len; const int gap = 3; /* between the filename and the status */ const int right_gap = 5; /* at the right end of the screen */ const int preferred_fname_len = 16; status_string (edit, status, status_size); status_len = (int) str_term_width1 (status); if (edit->filename_vpath != NULL) fname = vfs_path_get_last_path_str (edit->filename_vpath); fname_len = str_term_width1 (fname); if (fname_len < preferred_fname_len) fname_len = preferred_fname_len; if (fname_len + gap + status_len + right_gap >= w) { if (preferred_fname_len + gap + status_len + right_gap >= w) fname_len = preferred_fname_len; else fname_len = w - (gap + status_len + right_gap); fname = str_trunc (fname, fname_len); } dlg_move (edit->widget.owner, 0, 0); tty_setcolor (STATUSBAR_COLOR); printwstr (fname, fname_len + gap); printwstr (status, w - (fname_len + gap)); if (simple_statusbar && w > EDITOR_MINIMUM_TERMINAL_WIDTH) { size_t percent = 100; if (edit->total_lines + 1 != 0) percent = (edit->curs_line + 1) * 100 / (edit->total_lines + 1); dlg_move (edit->widget.owner, 0, w - 5); tty_printf (" %3d%%", percent); } g_free (status); }
void edit_symlink_cmd (void) { if (S_ISLNK (selection (current_panel)->st.st_mode)) { char buffer[MC_MAXPATHLEN]; char *p = NULL; int i; char *dest, *q; p = selection (current_panel)->fname; q = g_strdup_printf (_("Symlink `%s\' points to:"), str_trunc (p, 32)); i = readlink (p, buffer, MC_MAXPATHLEN - 1); if (i > 0) { buffer[i] = 0; dest = input_expand_dialog (_("Edit symlink"), q, MC_HISTORY_FM_EDIT_LINK, buffer); if (dest) { if (*dest && strcmp (buffer, dest)) { save_cwds_stat (); if (-1 == mc_unlink (p)) { message (D_ERROR, MSG_ERROR, _("edit symlink, unable to remove %s: %s"), p, unix_error_string (errno)); } else { if (-1 == mc_symlink (dest, p)) message (D_ERROR, MSG_ERROR, _("edit symlink: %s"), unix_error_string (errno)); } update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } g_free (dest); } } g_free (q); } else { message (D_ERROR, MSG_ERROR, _("`%s' is not a symbolic link"), selection (current_panel)->fname); } }
static inline void edit_status_fullscreen (WEdit * edit, int color) { Widget *h = WIDGET (WIDGET (edit)->owner); const int w = h->cols; const size_t status_size = w + 1; char *const status = g_malloc (status_size); int status_len; const char *fname = ""; int fname_len; const int gap = 3; /* between the filename and the status */ const int right_gap = 5; /* at the right end of the screen */ const int preferred_fname_len = 16; status_string (edit, status, status_size); status_len = (int) str_term_width1 (status); if (edit->filename_vpath != NULL) fname = vfs_path_get_last_path_str (edit->filename_vpath); fname_len = str_term_width1 (fname); if (fname_len < preferred_fname_len) fname_len = preferred_fname_len; if (fname_len + gap + status_len + right_gap >= w) { if (preferred_fname_len + gap + status_len + right_gap >= w) fname_len = preferred_fname_len; else fname_len = w - (gap + status_len + right_gap); fname = str_trunc (fname, fname_len); } widget_move (h, 0, 0); tty_setcolor (color); printwstr (fname, fname_len + gap); printwstr (status, w - (fname_len + gap)); if (simple_statusbar && w > EDITOR_MINIMUM_TERMINAL_WIDTH) { int percent; percent = edit_buffer_calc_percent (&edit->buffer, edit->buffer.curs1); widget_move (h, 0, w - 6 - 6); tty_printf (" %3d%%", percent); } g_free (status); }
int ssl_read_into_str(struct vsf_session* p_sess, void* p_ssl, struct mystr* p_str) { unsigned int len = str_getlen(p_str); int ret = ssl_read(p_sess, p_ssl, (char*) str_getbuf(p_str), len); if (ret >= 0) { str_trunc(p_str, (unsigned int) ret); } else { str_empty(p_str); } return ret; }
static void tree_move (WTree * tree, const char *default_dest) { char msg[BUF_MEDIUM]; char *dest; struct stat buf; file_op_context_t *ctx; file_op_total_context_t *tctx; vfs_path_t *dest_vpath = NULL; if (tree->selected_ptr == NULL) return; g_snprintf (msg, sizeof (msg), _("Move \"%s\" directory to:"), str_trunc (vfs_path_as_str (tree->selected_ptr->name), 50)); dest = input_expand_dialog (Q_ ("DialogTitle|Move"), msg, MC_HISTORY_FM_TREE_MOVE, default_dest, INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD); if (dest == NULL || *dest == '\0') goto ret; dest_vpath = vfs_path_from_str (dest); if (mc_stat (dest_vpath, &buf)) { message (D_ERROR, MSG_ERROR, _("Cannot stat the destination\n%s"), unix_error_string (errno)); goto ret; } if (!S_ISDIR (buf.st_mode)) { file_error (_("Destination \"%s\" must be a directory\n%s"), dest); goto ret; } ctx = file_op_context_new (OP_MOVE); tctx = file_op_total_context_new (); file_op_context_create_ui (ctx, FALSE, FILEGUI_DIALOG_ONE_ITEM); move_dir_dir (tctx, ctx, vfs_path_as_str (tree->selected_ptr->name), dest); file_op_total_context_destroy (tctx); file_op_context_destroy (ctx); ret: vfs_path_free (dest_vpath); g_free (dest); }
const char * path_trunc (const char *path, size_t trunc_len) { vfs_path_t *vpath; char *secure_path; const char *ret; vpath = vfs_path_from_str (path); secure_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_PASSWORD); vfs_path_free (vpath); ret = str_trunc (secure_path, trunc_len); g_free (secure_path); return ret; }
static void tree_move (WTree *tree, const char *default_dest) { char msg [BUF_MEDIUM]; char *dest; struct stat buf; double bytes = 0; off_t count = 0; FileOpContext *ctx; if (tree->selected_ptr == NULL) return; g_snprintf (msg, sizeof (msg), _("Move \"%s\" directory to:"), str_trunc (tree->selected_ptr->name, 50)); dest = input_expand_dialog (_(" Move "), msg, MC_HISTORY_FM_TREE_MOVE, default_dest); if (dest == NULL || *dest == '\0') { g_free (dest); return; } if (stat (dest, &buf)){ message (D_ERROR, MSG_ERROR, _(" Cannot stat the destination \n %s "), unix_error_string (errno)); g_free (dest); return; } if (!S_ISDIR (buf.st_mode)){ file_error (_(" Destination \"%s\" must be a directory \n %s "), dest); g_free (dest); return; } ctx = file_op_context_new (OP_MOVE); file_op_context_create_ui (ctx, FALSE); move_dir_dir (ctx, tree->selected_ptr->name, dest, &count, &bytes); file_op_context_destroy (ctx); g_free (dest); }
static void control_getline(struct mystr* p_str, struct vsf_session* p_sess) { if (p_sess->p_control_line_buf == 0) { vsf_secbuf_alloc(&p_sess->p_control_line_buf, VSFTP_MAX_COMMAND_LINE); } ftp_getline(p_sess, p_str, p_sess->p_control_line_buf); /* As mandated by the FTP specifications.. */ str_replace_char(p_str, '\0', '\n'); /* If the last character is a \r, strip it */ { unsigned int len = str_getlen(p_str); while (len > 0 && str_get_char_at(p_str, len - 1) == '\r') { str_trunc(p_str, len - 1); --len; } } }
static void ftp_getline(struct mystr* p_str) { static char* s_p_readline_buf; if (s_p_readline_buf == 0) { vsf_secbuf_alloc(&s_p_readline_buf, VSFTP_MAX_COMMAND_LINE); } str_netfd_alloc(p_str, VSFTP_COMMAND_FD, '\n', s_p_readline_buf, VSFTP_MAX_COMMAND_LINE); /* As mandated by the FTP specifications.. */ str_replace_char(p_str, '\0', '\n'); /* If the last character is a \r, strip it */ { unsigned int len = str_getlen(p_str); if (len > 0 && str_get_char_at(p_str, len - 1) == '\r') { str_trunc(p_str, len - 1); } } }
int str_loadfile (const char *filename, str_t text) { struct stat info[1]; FILE *fp; int j, n, tsize; if(stat (filename, info) != 0) return 1; tsize = info->st_size; fp = fopen (filename, "r"); if (fp == NULL) return 1; str_size_check (text, tsize + 1); n = fread (text->heap, 1, tsize, fp); #ifndef WIN32 if(n != tsize) { str_trunc (text, 0); fclose (fp); return 1; } #endif text->length = n; text->heap[n] = '\0'; /* This is a dirty hack to get rid of the stupid \015 on Windows */ for (j = 0; j < tsize; j++) if (text->heap[j] == '\015') text->heap[j] = ' '; fclose (fp); return 0; }
/* -------------------------------------------------- void mpPlay(STRING *songName) Desc: Returns: - -------------------------------------------------- */ void mpPlay(STRING *songName) { WriteLog("[ ] Now playing: "); if(media_playing(mpHandle)) media_stop(mpHandle); if(mpCount > mpSongs - 1 || mpCount < 0) return; str_cpy(_mpSongTemp,songName); str_trunc(_mpSongTemp, str_len(EXT_MUSIC)-1 ); // because our four chars are: .ogg WriteLog(_mpSongTemp); NewLine(); str_cpy(mpSongTemp,PATH_MUSIC); str_cat(mpSongTemp,songName); str_for_num(_mpCount, mpCount); // strcpy is unnecessary here mpHandle = media_play(mpSongTemp,NULL,VOL_MUSIC); while(media_playing(mpHandle)) wait(1); mpNext(); }
char * file_mask_dialog (FileOpContext * ctx, FileOperation operation, gboolean only_one, const char *format, const void *text, const char *def_text, gboolean * do_bg) { const size_t FMDY = 13; const size_t FMDX = 68; size_t fmd_xlen; /* buttons */ const size_t gap = 1; size_t b0_len, b2_len; size_t b1_len = 0; int source_easy_patterns = easy_patterns; size_t i, len; char fmd_buf[BUF_MEDIUM]; char *source_mask, *orig_mask, *dest_dir, *tmp; char *def_text_secure; int val; QuickWidget fmd_widgets[] = { /* 0 */ QUICK_BUTTON (42, 64, 10, FMDY, N_("&Cancel"), B_CANCEL, NULL), #ifdef WITH_BACKGROUND /* 1 */ QUICK_BUTTON (25, 64, 10, FMDY, N_("&Background"), B_USER, NULL), #define OFFSET 0 #else #define OFFSET 1 #endif /* WITH_BACKGROUND */ /* 2 - OFFSET */ QUICK_BUTTON (14, FMDX, 10, FMDY, N_("&OK"), B_ENTER, NULL), /* 3 - OFFSET */ QUICK_CHECKBOX (42, FMDX, 8, FMDY, N_("&Stable Symlinks"), &ctx->stable_symlinks), /* 4 - OFFSET */ QUICK_CHECKBOX (31, FMDX, 7, FMDY, N_("Di&ve into subdir if exists"), &ctx->dive_into_subdirs), /* 5 - OFFSET */ QUICK_CHECKBOX (3, FMDX, 8, FMDY, N_("Preserve &attributes"), &ctx->op_preserve), /* 6 - OFFSET */ QUICK_CHECKBOX (3, FMDX, 7, FMDY, N_("Follow &links"), &ctx->follow_links), /* 7 - OFFSET */ QUICK_INPUT (3, FMDX, 6, FMDY, "", 58, 0, "input2", &dest_dir), /* 8 - OFFSET */ QUICK_LABEL (3, FMDX, 5, FMDY, N_("to:")), /* 9 - OFFSET */ QUICK_CHECKBOX (37, FMDX, 4, FMDY, N_("&Using shell patterns"), &source_easy_patterns), /* 10 - OFFSET */ QUICK_INPUT (3, FMDX, 3, FMDY, easy_patterns ? "*" : "^(.*)$", 58, 0, "input-def", &source_mask), /* 11 - OFFSET */ QUICK_LABEL (3, FMDX, 2, FMDY, fmd_buf), QUICK_END }; g_return_val_if_fail (ctx != NULL, NULL); #ifdef ENABLE_NLS /* buttons */ for (i = 0; i <= 2 - OFFSET; i++) fmd_widgets[i].u.button.text = _(fmd_widgets[i].u.button.text); /* checkboxes */ for (i = 3 - OFFSET; i <= 9 - OFFSET; i++) if (i != 7 - OFFSET) fmd_widgets[i].u.checkbox.text = _(fmd_widgets[i].u.checkbox.text); #endif /* !ENABLE_NLS */ fmd_xlen = max (FMDX, (size_t) COLS * 2 / 3); len = str_term_width1 (fmd_widgets[6 - OFFSET].u.checkbox.text) + str_term_width1 (fmd_widgets[4 - OFFSET].u.checkbox.text) + 15; fmd_xlen = max (fmd_xlen, len); len = str_term_width1 (fmd_widgets[5 - OFFSET].u.checkbox.text) + str_term_width1 (fmd_widgets[3 - OFFSET].u.checkbox.text) + 15; fmd_xlen = max (fmd_xlen, len); /* buttons */ b2_len = str_term_width1 (fmd_widgets[2 - OFFSET].u.button.text) + 6 + gap; /* OK */ #ifdef WITH_BACKGROUND b1_len = str_term_width1 (fmd_widgets[1].u.button.text) + 4 + gap; /* Background */ #endif b0_len = str_term_width1 (fmd_widgets[0].u.button.text) + 4; /* Cancel */ len = b0_len + b1_len + b2_len; fmd_xlen = min (max (fmd_xlen, len + 6), (size_t) COLS); if (only_one) { int flen; flen = str_term_width1 (format); i = fmd_xlen - flen - 4; /* FIXME */ g_snprintf (fmd_buf, sizeof (fmd_buf), format, str_trunc ((const char *) text, i)); } else { g_snprintf (fmd_buf, sizeof (fmd_buf), format, *(const int *) text); fmd_xlen = max (fmd_xlen, (size_t) str_term_width1 (fmd_buf) + 6); } for (i = sizeof (fmd_widgets) / sizeof (fmd_widgets[0]); i > 0;) fmd_widgets[--i].x_divisions = fmd_xlen; i = (fmd_xlen - len) / 2; /* OK button */ fmd_widgets[2 - OFFSET].relative_x = i; i += b2_len; #ifdef WITH_BACKGROUND /* Background button */ fmd_widgets[1].relative_x = i; i += b1_len; #endif /* Cancel button */ fmd_widgets[0].relative_x = i; #define chkbox_xpos(i) \ fmd_widgets [i].relative_x = fmd_xlen - str_term_width1 (fmd_widgets [i].u.checkbox.text) - 6 chkbox_xpos (3 - OFFSET); chkbox_xpos (4 - OFFSET); chkbox_xpos (9 - OFFSET); #undef chkbox_xpos /* inputs */ fmd_widgets[7 - OFFSET].u.input.len = fmd_widgets[10 - OFFSET].u.input.len = fmd_xlen - 6; /* unselect checkbox if target filesystem don't support attributes */ ctx->op_preserve = filegui__check_attrs_on_fs (def_text); /* filter out a possible password from def_text */ tmp = strip_password (g_strdup (def_text), 1); if (source_easy_patterns) def_text_secure = strutils_glob_escape (tmp); else def_text_secure = strutils_regex_escape (tmp); g_free (tmp); /* destination */ fmd_widgets[7 - OFFSET].u.input.text = def_text_secure; ctx->stable_symlinks = FALSE; *do_bg = FALSE; { struct stat buf; QuickDialog Quick_input = { fmd_xlen, FMDY, -1, -1, op_names[operation], "[Mask Copy/Rename]", fmd_widgets, NULL, TRUE }; ask_file_mask: val = quick_dialog_skip (&Quick_input, 4); if (val == B_CANCEL) { g_free (def_text_secure); return NULL; } if (ctx->follow_links) ctx->stat_func = mc_stat; else ctx->stat_func = mc_lstat; if (ctx->op_preserve) { ctx->preserve = TRUE; ctx->umask_kill = 0777777; ctx->preserve_uidgid = (geteuid () == 0); } else { int i2; ctx->preserve = ctx->preserve_uidgid = FALSE; i2 = umask (0); umask (i2); ctx->umask_kill = i2 ^ 0777777; } if ((dest_dir == NULL) || (*dest_dir == '\0')) { g_free (def_text_secure); g_free (source_mask); return dest_dir; } ctx->search_handle = mc_search_new (source_mask, -1); if (ctx->search_handle == NULL) { message (D_ERROR, MSG_ERROR, _("Invalid source pattern `%s'"), source_mask); g_free (dest_dir); g_free (source_mask); goto ask_file_mask; } g_free (def_text_secure); g_free (source_mask); ctx->search_handle->is_case_sensitive = TRUE; if (source_easy_patterns) ctx->search_handle->search_type = MC_SEARCH_T_GLOB; else ctx->search_handle->search_type = MC_SEARCH_T_REGEX; tmp = dest_dir; dest_dir = tilde_expand (tmp); g_free (tmp); ctx->dest_mask = strrchr (dest_dir, PATH_SEP); if (ctx->dest_mask == NULL) ctx->dest_mask = dest_dir; else ctx->dest_mask++; orig_mask = ctx->dest_mask; if (!*ctx->dest_mask || (!ctx->dive_into_subdirs && !is_wildcarded (ctx->dest_mask) && (!only_one || (!mc_stat (dest_dir, &buf) && S_ISDIR (buf.st_mode)))) || (ctx->dive_into_subdirs && ((!only_one && !is_wildcarded (ctx->dest_mask)) || (only_one && !mc_stat (dest_dir, &buf) && S_ISDIR (buf.st_mode))))) ctx->dest_mask = g_strdup ("\\0"); else { ctx->dest_mask = g_strdup (ctx->dest_mask); *orig_mask = '\0'; } if (!*dest_dir) { g_free (dest_dir); dest_dir = g_strdup ("./"); } if (val == B_USER) *do_bg = TRUE; } return dest_dir; }
/* * FIXME: probably it is better to replace this with quick dialog machinery, * but actually I'm not familiar with it and have not much time :( * alex */ static replace_action_t overwrite_query_dialog (FileOpContext * ctx, enum OperationMode mode) { #define ADD_RD_BUTTON(i) \ add_widget (ui->replace_dlg, \ button_new (rd_widgets [i].ypos, rd_widgets [i].xpos, rd_widgets [i].value, \ NORMAL_BUTTON, rd_widgets [i].text, 0)) #define ADD_RD_LABEL(i, p1, p2) \ g_snprintf (buffer, sizeof (buffer), rd_widgets [i].text, p1, p2); \ add_widget (ui->replace_dlg, label_new (rd_widgets [i].ypos, rd_widgets [i].xpos, buffer)) /* dialog sizes */ const int rd_ylen = 17; int rd_xlen = 60; struct { const char *text; int ypos, xpos; int value; /* 0 for labels */ } rd_widgets[] = { /* *INDENT-OFF* */ /* 0 */ { N_("Target file already exists!"), 3, 4, 0 }, /* 1 */ { "%s", 4, 4, 0 }, /* 2 */ /* cannot use PRIuMAX here; %llu is used instead */ { N_("Source date: %s, size %llu"), 6, 4, 0 }, /* 3 */ /* cannot use PRIuMAX here; %llu is used instead */ { N_("Target date: %s, size %llu"), 7, 4, 0 }, /* 4 */ { N_("&Abort"), 14, 25, REPLACE_ABORT }, /* 5 */ { N_("If &size differs"), 12, 28, REPLACE_SIZE }, /* 6 */ { N_("Non&e"), 11, 47, REPLACE_NEVER }, /* 7 */ { N_("&Update"), 11, 36, REPLACE_UPDATE }, /* 8 */ { N_("A&ll"), 11, 28, REPLACE_ALWAYS }, /* 9 */ { N_("Overwrite all targets?"), 11, 4, 0 }, /* 10 */ { N_("&Reget"), 10, 28, REPLACE_REGET }, /* 11 */ { N_("A&ppend"), 9, 45, REPLACE_APPEND }, /* 12 */ { N_("&No"), 9, 37, REPLACE_NO }, /* 13 */ { N_("&Yes"), 9, 28, REPLACE_YES }, /* 14 */ { N_("Overwrite this target?"), 9, 4, 0 } /* *INDENT-ON* */ }; const int num = sizeof (rd_widgets) / sizeof (rd_widgets[0]); int *widgets_len; FileOpContextUI *ui = ctx->ui; char buffer[BUF_SMALL]; const char *title; const char *stripped_name = strip_home_and_password (ui->replace_filename); int stripped_name_len; int result; widgets_len = g_new0 (int, num); if (mode == Foreground) title = _("File exists"); else title = _("Background process: File exists"); stripped_name_len = str_term_width1 (stripped_name); { int i, l1, l2, l, row; for (i = 0; i < num; i++) { #ifdef ENABLE_NLS if (i != 1) /* skip filename */ rd_widgets[i].text = _(rd_widgets[i].text); #endif /* ENABLE_NLS */ widgets_len[i] = str_term_width1 (rd_widgets[i].text); } /* * longest of "Overwrite..." labels * (assume "Target date..." are short enough) */ l1 = max (widgets_len[9], widgets_len[14]); /* longest of button rows */ i = num; for (row = l = l2 = 0; i--;) if (rd_widgets[i].value != 0) { if (row != rd_widgets[i].ypos) { row = rd_widgets[i].ypos; l2 = max (l2, l); l = 0; } l += widgets_len[i] + 4; } l2 = max (l2, l); /* last row */ rd_xlen = max (rd_xlen, l1 + l2 + 8); rd_xlen = max (rd_xlen, str_term_width1 (title) + 2); rd_xlen = max (rd_xlen, min (COLS, stripped_name_len + 8)); /* Now place widgets */ l1 += 5; /* start of first button in the row */ i = num; for (l = l1, row = 0; --i > 1;) if (rd_widgets[i].value != 0) { if (row != rd_widgets[i].ypos) { row = rd_widgets[i].ypos; l = l1; } rd_widgets[i].xpos = l; l += widgets_len[i] + 4; } /* Abort button is centered */ rd_widgets[4].xpos = (rd_xlen - widgets_len[4] - 3) / 2; } /* FIXME - missing help node */ ui->replace_dlg = create_dlg (TRUE, 0, 0, rd_ylen, rd_xlen, alarm_colors, NULL, "[Replace]", title, DLG_CENTER | DLG_REVERSE); /* prompt -- centered */ add_widget (ui->replace_dlg, label_new (rd_widgets[0].ypos, (rd_xlen - widgets_len[0]) / 2, rd_widgets[0].text)); /* file name -- centered */ stripped_name = str_trunc (stripped_name, rd_xlen - 8); stripped_name_len = str_term_width1 (stripped_name); add_widget (ui->replace_dlg, label_new (rd_widgets[1].ypos, (rd_xlen - stripped_name_len) / 2, stripped_name)); /* source date and size */ ADD_RD_LABEL (2, file_date (ui->s_stat->st_mtime), (unsigned long long) ui->s_stat->st_size); /* destination date and size */ ADD_RD_LABEL (3, file_date (ui->d_stat->st_mtime), (unsigned long long) ui->d_stat->st_size); ADD_RD_BUTTON (4); /* Abort */ ADD_RD_BUTTON (5); /* If size differs */ ADD_RD_BUTTON (6); /* None */ ADD_RD_BUTTON (7); /* Update */ ADD_RD_BUTTON (8); /* All" */ ADD_RD_LABEL (9, 0, 0); /* Overwrite all targets? */ /* "this target..." widgets */ if (!S_ISDIR (ui->d_stat->st_mode)) { if ((ctx->operation == OP_COPY) && (ui->d_stat->st_size != 0) && (ui->s_stat->st_size > ui->d_stat->st_size)) ADD_RD_BUTTON (10); /* Reget */ ADD_RD_BUTTON (11); /* Append */ } ADD_RD_BUTTON (12); /* No */ ADD_RD_BUTTON (13); /* Yes */ ADD_RD_LABEL (14, 0, 0); /* Overwrite this target? */ result = run_dlg (ui->replace_dlg); destroy_dlg (ui->replace_dlg); g_free (widgets_len); return (result == B_CANCEL) ? REPLACE_ABORT : (replace_action_t) result; #undef ADD_RD_LABEL #undef ADD_RD_BUTTON }
void chown_cmd (void) { char *fname; struct stat sf_stat; uid_t new_user; gid_t new_group; char buffer[BUF_TINY]; chown_i18n (); do { /* do while any files remaining */ vfs_path_t *vpath; WDialog *ch_dlg; ch_dlg = init_chown (); new_user = new_group = -1; if (current_panel->marked) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ vpath = vfs_path_from_str (fname); if (mc_stat (vpath, &sf_stat) != 0) { /* get status of file */ dlg_destroy (ch_dlg); vfs_path_free (vpath); break; } vfs_path_free (vpath); /* select in listboxes */ listbox_select_entry (l_user, listbox_search_text (l_user, get_owner (sf_stat.st_uid))); listbox_select_entry (l_group, listbox_search_text (l_group, get_group (sf_stat.st_gid))); chown_label (0, str_trunc (fname, GW - 4)); chown_label (1, str_trunc (get_owner (sf_stat.st_uid), GW - 4)); chown_label (2, str_trunc (get_group (sf_stat.st_gid), GW - 4)); size_trunc_len (buffer, GW - 4, sf_stat.st_size, 0, panels_options.kilobyte_si); chown_label (3, buffer); chown_label (4, string_perm (sf_stat.st_mode)); switch (dlg_run (ch_dlg)) { case B_CANCEL: end_chown = 1; break; case B_SETUSR: { struct passwd *user; char *text; listbox_get_current (l_user, &text, NULL); user = getpwnam (text); if (user) { new_user = user->pw_uid; apply_chowns (new_user, new_group); } break; } case B_SETGRP: { struct group *grp; char *text; listbox_get_current (l_group, &text, NULL); grp = getgrnam (text); if (grp) { new_group = grp->gr_gid; apply_chowns (new_user, new_group); } break; } case B_SETALL: case B_ENTER: { struct group *grp; struct passwd *user; char *text; listbox_get_current (l_group, &text, NULL); grp = getgrnam (text); if (grp) new_group = grp->gr_gid; listbox_get_current (l_user, &text, NULL); user = getpwnam (text); if (user) new_user = user->pw_uid; if (ch_dlg->ret_value == B_ENTER) { vfs_path_t *fname_vpath; fname_vpath = vfs_path_from_str (fname); need_update = 1; if (mc_chown (fname_vpath, new_user, new_group) == -1) message (D_ERROR, MSG_ERROR, _("Cannot chown \"%s\"\n%s"), fname, unix_error_string (errno)); vfs_path_free (fname_vpath); } else apply_chowns (new_user, new_group); break; } } /* switch */ if (current_panel->marked && ch_dlg->ret_value != B_CANCEL) { do_file_mark (current_panel, current_file, 0); need_update = 1; } dlg_destroy (ch_dlg); } while (current_panel->marked && !end_chown); chown_done (); }
void chmod_cmd (void) { char buffer[BUF_TINY]; char *fname; int i; struct stat sf_stat; Dlg_head *ch_dlg; do { /* do while any files remaining */ ch_dlg = init_chmod (); if (current_panel->marked) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ if (mc_stat (fname, &sf_stat) != 0) { /* get status of file */ destroy_dlg (ch_dlg); break; } c_stat = sf_stat.st_mode; mode_change = 0; /* clear changes flag */ /* set check buttons */ for (i = 0; i < PERMISSIONS; i++) { check_perm[i].check->state = (c_stat & check_perm[i].mode) ? 1 : 0; check_perm[i].selected = 0; } /* Set the labels */ c_fname = str_trunc (fname, 21); add_widget (ch_dlg, label_new (FY + 2, FX + 2, c_fname)); c_fown = str_trunc (get_owner (sf_stat.st_uid), 21); add_widget (ch_dlg, label_new (FY + 6, FX + 2, c_fown)); c_fgrp = str_trunc (get_group (sf_stat.st_gid), 21); add_widget (ch_dlg, label_new (FY + 8, FX + 2, c_fgrp)); g_snprintf (buffer, sizeof (buffer), "%o", (unsigned int) c_stat); statl = label_new (FY + 4, FX + 2, buffer); add_widget (ch_dlg, statl); run_dlg (ch_dlg); /* retrieve an action */ /* do action */ switch (ch_dlg->ret_value) { case B_ENTER: if (mode_change) if (mc_chmod (fname, c_stat) == -1) message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"), fname, unix_error_string (errno)); need_update = 1; break; case B_CANCEL: end_chmod = 1; break; case B_ALL: case B_MARKED: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected || ch_dlg->ret_value == B_ALL) { if (check_perm[i].check->state & C_BOOL) or_mask |= check_perm[i].mode; else and_mask &= ~check_perm[i].mode; } } apply_mask (&sf_stat); break; case B_SETMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected) or_mask |= check_perm[i].mode; } apply_mask (&sf_stat); break; case B_CLRMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected) and_mask &= ~check_perm[i].mode; } apply_mask (&sf_stat); break; } if (current_panel->marked && ch_dlg->ret_value != B_CANCEL) { do_file_mark (current_panel, c_file, 0); need_update = 1; } destroy_dlg (ch_dlg); } while (current_panel->marked && !end_chmod); chmod_done (); }
static void do_link (link_type_t link_type, const char *fname) { char *dest = NULL, *src = NULL; vfs_path_t *fname_vpath, *dest_vpath = NULL; fname_vpath = vfs_path_from_str (fname); if (link_type == LINK_HARDLINK) { src = g_strdup_printf (_("Link %s to:"), str_trunc (fname, 46)); dest = input_expand_dialog (_("Link"), src, MC_HISTORY_FM_LINK, "", INPUT_COMPLETE_FILENAMES); if (!dest || !*dest) goto cleanup; save_cwds_stat (); dest_vpath = vfs_path_from_str (dest); if (-1 == mc_link (fname_vpath, dest_vpath)) message (D_ERROR, MSG_ERROR, _("link: %s"), unix_error_string (errno)); } else { vfs_path_t *s, *d; /* suggest the full path for symlink, and either the full or relative path to the file it points to */ s = vfs_path_append_new (current_panel->cwd_vpath, fname, NULL); if (get_other_type () == view_listing) d = vfs_path_append_new (other_panel->cwd_vpath, fname, NULL); else d = vfs_path_from_str (fname); if (link_type == LINK_SYMLINK_RELATIVE) { char *s_str; s_str = diff_two_paths (other_panel->cwd_vpath, s); vfs_path_free (s); s = vfs_path_from_str_flags (s_str, VPF_NO_CANON); g_free (s_str); } symlink_dialog (s, d, &dest, &src); vfs_path_free (d); vfs_path_free (s); if (!dest || !*dest || !src || !*src) goto cleanup; save_cwds_stat (); dest_vpath = vfs_path_from_str_flags (dest, VPF_NO_CANON); s = vfs_path_from_str (src); if (mc_symlink (dest_vpath, s) == -1) message (D_ERROR, MSG_ERROR, _("symlink: %s"), unix_error_string (errno)); vfs_path_free (s); } update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); cleanup: vfs_path_free (fname_vpath); vfs_path_free (dest_vpath); g_free (src); g_free (dest); }
void createLetters() { var letterAscii ; // For storing ASCII value of each letter var letterY ; // For repositioning letters onscreen var letterZ ; var entHandle = 0 ; // For keeping track of who's first in line var stringCount = 0 ; // For keeping track of how many letters to eliminate str_cpy( sourceString,"dillinger" ) ; // Load sequence of letters into sourceString stringCount = str_len( sourceString ) ; // Store the length of the String in stringCount letterAscii = str_to_asc(sourceString); str_cpy( myFontString,sourceString ) ; str_trunc(myFontString, (str_len(myFontString) - 1)) ; // now myFontString == 1st Letter str_clip(sourceString,1); while ( stringCount != 0 ) // Continue until the string is empty { // Assign screen position of letters so they appear in same pattern as keyboard layout QWERTY... switch (letterAscii) { case 97: // a letterY = 270 ; letterZ = 230 ; break ; case 98: // b letterY = 0; letterZ = 160; break; case 99: // c letterY = 120; letterZ = 160; break; case 100: // d letterY = 150; letterZ = 230; break; case 101: // e letterY = 146; letterZ = 298; break; case 102: // f letterY = 92; letterZ = 230; break; case 103: // g letterY = -30; letterZ = 230; break; case 104: // h letterY = 30; letterZ = 230; break; case 105: // i letterY = -156; letterZ = 298; break; case 106: // j letterY = -90; letterZ = 230; break; case 107: // k letterY = -150; letterZ = 230; break; case 108: // l letterY = -210; letterZ = 230; break; case 109: // m letterY = -124; letterZ = 159; break; case 110: // n letterY = -56; letterZ = 160; break; case 111: // o letterY = -210; letterZ = 300; break; case 112: // p letterY = -266; letterZ = 300; break; case 113: // q letterY = 270; letterZ = 300; break; case 114: // r letterY = 84; letterZ = 300; break; case 115: // s letterY = 212; letterZ = 230; break; case 116: // t letterY = 28; letterZ = 298; break; case 117: // u letterY = -100; letterZ = 300; break; case 118: // v letterY = 60; letterZ = 160; break; case 119: // w letterY = 206; letterZ = 300; break; case 120: // x letterY = 180; letterZ = 160; break; case 121: // y letterY = -40; letterZ = 300; break; case 122: // z letterY = 242; letterZ = 160; break; } wait( 400 ) ; me = ent_create("../Letters+26.tga", vector(0,letterY,letterZ), letter) ; // create a new letter entity and start its function my.ascii = letterAscii; // stores the letter's ascii value my.previous = entHandle; // inherits the previous letter's handle my.eliminated = 0; my.ambient = 100 ; reset(my,INVISIBLE); entHandle = handle(me) ; // save the current letter's handle so it can be assigned to the next letter letterAscii = str_to_asc(sourceString); str_cpy( myFontString,sourceString ) ; str_trunc(myFontString, (str_len(myFontString) - 1)) ; // now myFontString == 1st Letter str_clip(sourceString,1); } }