/* * Start of actual drawing functions */ static void i810_accel_setup(struct display *p) { p->next_line = p->line_length ? p->line_length : get_line_length(i810_orient->vxres_var, p->var.bits_per_pixel); p->next_plane = 0; memmove((u8 *)i810_accel->fontcache_start_virtual, p->fontdata, 4096); }
static void vfb_encode_fix(struct fb_fix_screeninfo *fix, struct fb_var_screeninfo *var) { memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, vfb_name); fix->smem_start = videomemory; fix->smem_len = videomemorysize; fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; switch (var->bits_per_pixel) { case 1: fix->visual = FB_VISUAL_MONO01; break; case 2: case 4: case 8: fix->visual = FB_VISUAL_PSEUDOCOLOR; break; case 16: case 24: case 32: fix->visual = FB_VISUAL_TRUECOLOR; break; } fix->ywrapstep = 1; fix->xpanstep = 1; fix->ypanstep = 1; fix->line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); }
/* This routine actually sets the video mode. It's in here where we * the hardware state info->par and fix which can be affected by the * change in par. For this driver it doesn't do much. */ static int st7565p_set_par(struct fb_info *info) { info->fix.line_length = get_line_length(info->var.xres_virtual, info->var.bits_per_pixel); return 0; }
/** * add the sdp component from a request or a reply, respectively an offer or an answer * @param msg - the SIP message * @param sdp_type - 0 for SDP offer and 1 for SDP answer * @param sip_uri - the SIP uri of the one that sent the SDP body * @param sdp_media_comps - the built structure * @returns 1 if ok, 0 if an error occured */ int append_sip_sdp_comp(struct sip_msg * msg, int sdp_type, str sip_uri, str user_sip_uri, sdp_media_component_list_t * sdp_media_comps){ sdp_media_component_t * sdp_media_elem = NULL; str sdp_body = {0,0}; str mline_s = {0,0}, next_mline_s= {0,0}; char * end, *media_info_end; str copy_sdp_body = {0,0}; LOG(L_DBG, "checking if the message has sdp body\n"); /*if the SIP message contains SDP body*/ if(extract_sdp_body(msg, ©_sdp_body)==-1) { return 1; } str_dup(sdp_body, copy_sdp_body, pkg); end = sdp_body.s + sdp_body.len; mline_s.s = find_sdp_line(sdp_body.s,end,'m'); for(;mline_s.s;mline_s.s = next_mline_s.s){ mline_s.len = get_line_length(mline_s.s, end); next_mline_s.s = find_next_sdp_line(mline_s.s,end,'m',NULL); mem_new(sdp_media_elem, sizeof(sdp_media_component_t), pkg); str_dup_ptr_ptr(sdp_media_elem->sdp_media_name, &mline_s, pkg); media_info_end = end; mem_new(sdp_media_elem->sdp_type, sizeof(int32_t), pkg); *(sdp_media_elem->sdp_type) = sdp_type; if(!get_media_description_list(mline_s.s+mline_s.len, end, &(sdp_media_elem->sdp_media_descriptions))) goto error; /*if(str_equal(user_sip_uri, sip_uri)) add_an_charging_id(sip_uri, sdp_media_elem);*/ WL_APPEND(sdp_media_comps, sdp_media_elem); } str_free(sdp_body,pkg); return 1; out_of_memory: LOG(L_ERR, "append_sip_sdp_comp: out of pkg memory\n"); error: WL_FREE(sdp_media_elem, sdp_media_component_list_t, pkg); return 0; }
char *get_next_line(const int fd) { static t_char *begin; static t_char *end; char *line; int size; if (begin == NULL || (size = get_line_length(begin)) <= 0) fill_list(fd, &begin, &end); size = get_line_length(begin); if (size == 0 && begin == NULL) { if (begin != NULL) { free(begin->to_free); free(begin); } return (NULL); } if (size < 0) size = -size; line = list_to_string(&begin, &end, size); return (line); }
/* print all lines to the window. */ void fill_window(WINDOW *win, const char *text) { int x, y; int total_lines = get_line_no(text); int i; getmaxyx(win, y, x); /* do not go over end of line */ total_lines = min(total_lines, y); for (i = 0; i < total_lines; i++) { char tmp[x+10]; const char *line = get_line(text, i); int len = get_line_length(line); strncpy(tmp, line, min(len, x)); tmp[len] = '\0'; mvwprintw(win, i, 0, "%s", tmp); } }
static int milkymistfb_set_par(struct fb_info *info) { struct milkymistfb *milkymistfb = info->par; unsigned int hsync_start, hsync_end, hscan; unsigned int vsync_start, vsync_end, vscan; unsigned int burst_count; info->fix.line_length = get_line_length(info->var.xres_virtual, info->var.bits_per_pixel); hsync_start = info->var.xres + info->var.right_margin; hsync_end = hsync_start + info->var.hsync_len; hscan = hsync_end + info->var.left_margin; vsync_start = info->var.yres + info->var.lower_margin; vsync_end = vsync_start + info->var.vsync_len; vscan = vsync_end + info->var.upper_margin; burst_count = (info->var.xres * info->var.yres * 16) / (64*4); iowrite32be(VGA_RESET, CSR_VGA_RESET); iowrite32be(milkymistfb->vidmem_phys, CSR_VGA_BASEADDRESS); iowrite32be(info->var.xres, CSR_VGA_HRES); iowrite32be(hsync_start, CSR_VGA_HSYNC_START); iowrite32be(hsync_end, CSR_VGA_HSYNC_END); iowrite32be(hscan, CSR_VGA_HSCAN); iowrite32be(info->var.yres, CSR_VGA_VRES); iowrite32be(vsync_start, CSR_VGA_VSYNC_START); iowrite32be(vsync_end, CSR_VGA_VSYNC_END); iowrite32be(vscan, CSR_VGA_VSCAN); iowrite32be(burst_count, CSR_VGA_BURST_COUNT); if (info->var.pixclock >= 39000) /* 25 MHz */ iowrite32be(0, CSR_VGA_CLKSEL); else if (info->var.pixclock >= 19000) /* 50 MHz */ iowrite32be(1, CSR_VGA_CLKSEL); else /* 65 MHz */ iowrite32be(2, CSR_VGA_CLKSEL); iowrite32be(0, CSR_VGA_RESET); return 0; }
stack_t * get_tracks(char * page) { stack_t * result = NULL; while (page[0] != '\0') { if (is_track(page)) { int length = get_line_length(page); s_push(&result, extract_next_substring(page, length)); page += length; } else { page++; } } return result; }
int get_all_media_lines(char * start, char * end, char line_name, str_list_t * sdp_media_descriptions){ str sdp_par = {0,0}; str_list_slot_t * str_slot = NULL; while((sdp_par.s = find_next_sdp_line(start, end,line_name,NULL))){ sdp_par.len = get_line_length(sdp_par.s, end); mem_new(str_slot, sizeof(str_list_slot_t), pkg); str_dup(str_slot->data,sdp_par,pkg); WL_APPEND(sdp_media_descriptions,str_slot); str_slot=0; start = sdp_par.s + sdp_par.len; } return 1; out_of_memory: LOG(L_ERR, "ERR:"M_NAME":get_media_description_list: out of pkg memory\n"); if(str_slot) WL_FREE(str_slot, str_list_t,pkg); return 0; }
int main() { const int MAX_LINE_LENGTH = 1000; int max_length = 0; char current_line[MAX_LINE_LENGTH]; char longest_line[MAX_LINE_LENGTH]; int current_length; while ((current_length = get_line_length(current_line, MAX_LINE_LENGTH)) > 0) { if (current_length > max_length) { max_length = current_length; copy(longest_line, current_line); } } if (max_length > 0) { chomp(longest_line); printf("Longest line (%d chars): '%s'\n", max_length - 1, longest_line); } else puts("No lines found!"); return 0; }
bool is_track(char * line) { size_t length = get_line_length(line); char * bookmark = line; if (is_upper_case_letter(line[0])) bookmark += 2; else return false; int first_part_count = 0; int second_part_count = 0; int third_part_count = 0; while(bookmark < line + length && is_code(bookmark)) { bookmark += 6; first_part_count++; } while(bookmark != NULL && bookmark < line + length && is_fraction(bookmark)) { bookmark += 6; second_part_count++; } while(bookmark != NULL && bookmark < line + length && is_code(bookmark)) { bookmark += 6; third_part_count++; } return (first_part_count && second_part_count == 4 && third_part_count); }
static int milkymistfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { u_long line_length; if (var->bits_per_pixel != 16) return -EINVAL; if (!var->xres) var->xres = 1; if (!var->yres) var->yres = 1; if (var->xres > var->xres_virtual) var->xres_virtual = var->xres; if (var->yres > var->yres_virtual) var->yres_virtual = var->yres; line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); if (line_length * var->yres_virtual > videomemorysize) return -ENOMEM; var->red.offset = 11; var->red.length = 5; var->green.offset = 5; var->green.length = 6; var->blue.offset = 0; var->blue.length = 5; var->transp.offset = 0; var->transp.length = 0; var->red.msb_right = 0; var->green.msb_right = 0; var->blue.msb_right = 0; var->transp.msb_right = 0; return 0; }
static int vfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { int err, activate = var->activate; int oldxres, oldyres, oldvxres, oldvyres, oldbpp; u_long line_length; struct display *display; if (con >= 0) display = &fb_display[con]; else display = &disp; /* used during initialization */ /* * FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal! * as FB_VMODE_SMOOTH_XPAN is only used internally */ if (var->vmode & FB_VMODE_CONUPDATE) { var->vmode |= FB_VMODE_YWRAP; var->xoffset = display->var.xoffset; var->yoffset = display->var.yoffset; } /* * Some very basic checks */ if (!var->xres) var->xres = 1; if (!var->yres) var->yres = 1; if (var->xres > var->xres_virtual) var->xres_virtual = var->xres; if (var->yres > var->yres_virtual) var->yres_virtual = var->yres; if (var->bits_per_pixel <= 1) var->bits_per_pixel = 1; else if (var->bits_per_pixel <= 8) var->bits_per_pixel = 8; else if (var->bits_per_pixel <= 16) var->bits_per_pixel = 16; #if 0 /* fbcon doesn't support this (yet) */ else if (var->bits_per_pixel <= 24) var->bits_per_pixel = 24; else if (var->bits_per_pixel <= 32) var->bits_per_pixel = 32; #endif else return -EINVAL; /* * Memory limit */ line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); if (line_length*var->yres_virtual > videomemorysize) return -ENOMEM; set_color_bitfields(var); if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = display->var.xres; oldyres = display->var.yres; oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || oldbpp != var->bits_per_pixel) { struct fb_fix_screeninfo fix; vfb_encode_fix(&fix, var); display->screen_base = (char *)videomemory; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; display->ypanstep = fix.ypanstep; display->ywrapstep = fix.ywrapstep; display->line_length = fix.line_length; display->can_soft_blank = 1; display->inverse = 0; switch (var->bits_per_pixel) { #ifdef FBCON_HAS_MFB case 1: display->dispsw = &fbcon_mfb; break; #endif #ifdef FBCON_HAS_CFB2 case 2: display->dispsw = &fbcon_cfb2; break; #endif #ifdef FBCON_HAS_CFB4 case 4: display->dispsw = &fbcon_cfb4; break; #endif #ifdef FBCON_HAS_CFB8 case 8: display->dispsw = &fbcon_cfb8; break; #endif #ifdef FBCON_HAS_CFB16 case 16: display->dispsw = &fbcon_cfb16; display->dispsw_data = fbcon_cmap.cfb16; break; #endif #ifdef FBCON_HAS_CFB24 case 24: display->dispsw = &fbcon_cfb24; display->dispsw_data = fbcon_cmap.cfb24; break; #endif #ifdef FBCON_HAS_CFB32 case 32: display->dispsw = &fbcon_cfb32; display->dispsw_data = fbcon_cmap.cfb32; break; #endif default: display->dispsw = &fbcon_dummy; break; } if (fb_info.changevar) (*fb_info.changevar)(con); } if (oldbpp != var->bits_per_pixel) { if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) return err; do_install_cmap(con, info); } } return 0; }
static int unifb_set_par(struct fb_info *info) { int hTotal, vTotal, hSyncStart, hSyncEnd, vSyncStart, vSyncEnd; int format; #ifdef CONFIG_PUV3_PM struct clk *clk_vga; u32 pixclk = 0; int i; for (i = 0; i <= 10; i++) { if (info->var.xres == unifb_modes[i].xres && info->var.yres == unifb_modes[i].yres && info->var.upper_margin == unifb_modes[i].upper_margin && info->var.lower_margin == unifb_modes[i].lower_margin && info->var.left_margin == unifb_modes[i].left_margin && info->var.right_margin == unifb_modes[i].right_margin && info->var.hsync_len == unifb_modes[i].hsync_len && info->var.vsync_len == unifb_modes[i].vsync_len) { pixclk = unifb_modes[i].pixclock; break; } } /* */ clk_vga = clk_get(info->device, "VGA_CLK"); if (clk_vga == ERR_PTR(-ENOENT)) return -ENOENT; if (pixclk != 0) { if (clk_set_rate(clk_vga, pixclk)) { /* */ info->fix = unifb_fix; info->var = unifb_default; if (clk_set_rate(clk_vga, unifb_default.pixclock)) return -EINVAL; } } #endif info->fix.line_length = get_line_length(info->var.xres_virtual, info->var.bits_per_pixel); hSyncStart = info->var.xres + info->var.right_margin; hSyncEnd = hSyncStart + info->var.hsync_len; hTotal = hSyncEnd + info->var.left_margin; vSyncStart = info->var.yres + info->var.lower_margin; vSyncEnd = vSyncStart + info->var.vsync_len; vTotal = vSyncEnd + info->var.upper_margin; switch (info->var.bits_per_pixel) { case 8: format = UDE_CFG_DST8; break; case 16: format = UDE_CFG_DST16; break; case 24: format = UDE_CFG_DST24; break; case 32: format = UDE_CFG_DST32; break; default: return -EINVAL; } writel(info->fix.smem_start, UDE_FSA); writel(info->var.yres, UDE_LS); writel(get_line_length(info->var.xres, info->var.bits_per_pixel) >> 3, UDE_PS); /* */ writel((hTotal << 16) | (info->var.xres), UDE_HAT); writel(((hTotal - 1) << 16) | (info->var.xres - 1), UDE_HBT); writel(((hSyncEnd - 1) << 16) | (hSyncStart - 1), UDE_HST); writel((vTotal << 16) | (info->var.yres), UDE_VAT); writel(((vTotal - 1) << 16) | (info->var.yres - 1), UDE_VBT); writel(((vSyncEnd - 1) << 16) | (vSyncStart - 1), UDE_VST); writel(UDE_CFG_GDEN_ENABLE | UDE_CFG_TIMEUP_ENABLE | format | 0xC0000001, UDE_CFG); return 0; }
static int unifb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { u_long line_length; /* */ if (var->vmode & FB_VMODE_CONUPDATE) { var->vmode |= FB_VMODE_YWRAP; var->xoffset = info->var.xoffset; var->yoffset = info->var.yoffset; } /* */ if (!var->xres) var->xres = 1; if (!var->yres) var->yres = 1; if (var->xres > var->xres_virtual) var->xres_virtual = var->xres; if (var->yres > var->yres_virtual) var->yres_virtual = var->yres; if (var->bits_per_pixel <= 1) var->bits_per_pixel = 1; else if (var->bits_per_pixel <= 8) var->bits_per_pixel = 8; else if (var->bits_per_pixel <= 16) var->bits_per_pixel = 16; else if (var->bits_per_pixel <= 24) var->bits_per_pixel = 24; else if (var->bits_per_pixel <= 32) var->bits_per_pixel = 32; else return -EINVAL; if (var->xres_virtual < var->xoffset + var->xres) var->xres_virtual = var->xoffset + var->xres; if (var->yres_virtual < var->yoffset + var->yres) var->yres_virtual = var->yoffset + var->yres; /* */ line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); if (line_length * var->yres_virtual > UNIFB_MEMSIZE) return -ENOMEM; /* */ switch (var->bits_per_pixel) { case 1: case 8: var->red.offset = 0; var->red.length = 8; var->green.offset = 0; var->green.length = 8; var->blue.offset = 0; var->blue.length = 8; var->transp.offset = 0; var->transp.length = 0; break; case 16: /* */ if (var->transp.length) { var->red.offset = 0; var->red.length = 5; var->green.offset = 5; var->green.length = 5; var->blue.offset = 10; var->blue.length = 5; var->transp.offset = 15; var->transp.length = 1; } else { /* */ var->red.offset = 11; var->red.length = 5; var->green.offset = 5; var->green.length = 6; var->blue.offset = 0; var->blue.length = 5; var->transp.offset = 0; var->transp.length = 0; } break; case 24: /* */ var->red.offset = 0; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 16; var->blue.length = 8; var->transp.offset = 0; var->transp.length = 0; break; case 32: /* */ var->red.offset = 16; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 0; var->blue.length = 8; var->transp.offset = 24; var->transp.length = 8; break; } var->red.msb_right = 0; var->green.msb_right = 0; var->blue.msb_right = 0; var->transp.msb_right = 0; return 0; }
/* layman's scrollable window... */ void show_scroll_win(WINDOW *main_window, const char *title, const char *text) { int res; int total_lines = get_line_no(text); int x, y; int start_x = 0, start_y = 0; int text_lines = 0, text_cols = 0; int total_cols = 0; int win_cols = 0; int win_lines = 0; int i = 0; WINDOW *win; WINDOW *pad; PANEL *panel; /* find the widest line of msg: */ total_lines = get_line_no(text); for (i = 0; i < total_lines; i++) { const char *line = get_line(text, i); int len = get_line_length(line); total_cols = max(total_cols, len+2); } /* create the pad */ pad = newpad(total_lines+10, total_cols+10); wattrset(pad, attributes[SCROLLWIN_TEXT]); fill_window(pad, text); win_lines = min(total_lines+4, LINES-2); win_cols = min(total_cols+2, COLS-2); text_lines = max(win_lines-4, 0); text_cols = max(win_cols-2, 0); /* place window in middle of screen */ y = (LINES-win_lines)/2; x = (COLS-win_cols)/2; win = newwin(win_lines, win_cols, y, x); keypad(win, TRUE); /* show the help in the help window, and show the help panel */ wattrset(win, attributes[SCROLLWIN_BOX]); box(win, 0, 0); wattrset(win, attributes[SCROLLWIN_HEADING]); mvwprintw(win, 0, 3, " %s ", title); panel = new_panel(win); /* handle scrolling */ do { copywin(pad, win, start_y, start_x, 2, 2, text_lines, text_cols, 0); print_in_middle(win, text_lines+2, 0, text_cols, "<OK>", attributes[DIALOG_MENU_FORE]); wrefresh(win); res = wgetch(win); switch (res) { case KEY_NPAGE: case ' ': start_y += text_lines-2; break; case KEY_PPAGE: start_y -= text_lines+2; break; case KEY_HOME: start_y = 0; break; case KEY_END: start_y = total_lines-text_lines; break; case KEY_DOWN: case 'j': start_y++; break; case KEY_UP: case 'k': start_y--; break; case KEY_LEFT: case 'h': start_x--; break; case KEY_RIGHT: case 'l': start_x++; break; } if (res == 10 || res == 27 || res == 'q' || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { break; } if (start_y < 0) start_y = 0; if (start_y >= total_lines-text_lines) start_y = total_lines-text_lines; if (start_x < 0) start_x = 0; if (start_x >= total_cols-text_cols) start_x = total_cols-text_cols; } while (res); del_panel(panel); delwin(win); refresh_all_windows(main_window); }
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...) { va_list ap; char *btn; int btns_width = 0; int msg_lines = 0; int msg_width = 0; int total_width; int win_rows = 0; WINDOW *win; WINDOW *msg_win; WINDOW *menu_win; MENU *menu; ITEM *btns[btn_num+1]; int i, x, y; int res = -1; va_start(ap, btn_num); for (i = 0; i < btn_num; i++) { btn = va_arg(ap, char *); btns[i] = new_item(btn, ""); btns_width += strlen(btn)+1; } va_end(ap); btns[btn_num] = NULL; /* find the widest line of msg: */ msg_lines = get_line_no(msg); for (i = 0; i < msg_lines; i++) { const char *line = get_line(msg, i); int len = get_line_length(line); if (msg_width < len) msg_width = len; } total_width = max(msg_width, btns_width); /* place dialog in middle of screen */ y = (LINES-(msg_lines+4))/2; x = (COLS-(total_width+4))/2; /* create the windows */ if (btn_num > 0) win_rows = msg_lines+4; else win_rows = msg_lines+2; win = newwin(win_rows, total_width+4, y, x); keypad(win, TRUE); menu_win = derwin(win, 1, btns_width, win_rows-2, 1+(total_width+2-btns_width)/2); menu = new_menu(btns); msg_win = derwin(win, win_rows-2, msg_width, 1, 1+(total_width+2-msg_width)/2); set_menu_fore(menu, attributes[DIALOG_MENU_FORE]); set_menu_back(menu, attributes[DIALOG_MENU_BACK]); wattrset(win, attributes[DIALOG_BOX]); box(win, 0, 0); /* print message */ wattrset(msg_win, attributes[DIALOG_TEXT]); fill_window(msg_win, msg); set_menu_win(menu, win); set_menu_sub(menu, menu_win); set_menu_format(menu, 1, btn_num); menu_opts_off(menu, O_SHOWDESC); menu_opts_off(menu, O_SHOWMATCH); menu_opts_on(menu, O_ONEVALUE); menu_opts_on(menu, O_NONCYCLIC); set_menu_mark(menu, ""); post_menu(menu); touchwin(win); refresh_all_windows(main_window); while ((res = wgetch(win))) { switch (res) { case KEY_LEFT: menu_driver(menu, REQ_LEFT_ITEM); break; case KEY_RIGHT: menu_driver(menu, REQ_RIGHT_ITEM); break; case 10: /* ENTER */ case 27: /* ESCAPE */ case ' ': case KEY_F(F_BACK): case KEY_F(F_EXIT): break; } touchwin(win); refresh_all_windows(main_window); if (res == 10 || res == ' ') { res = item_index(current_item(menu)); break; } else if (res == 27 || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { res = KEY_EXIT; break; } } unpost_menu(menu); free_menu(menu); for (i = 0; i < btn_num; i++) free_item(btns[i]); delwin(win); return res; }
void search_buf(const char *buf, const off_t buf_len, const char *dir_full_path) { int binary = -1; /* 1 = yes, 0 = no, -1 = don't know */ off_t buf_offset = 0; if (opts.search_stream) { binary = 0; } else if (!opts.search_binary_files) { binary = is_binary((void*) buf, buf_len); if (binary) { log_debug("File %s is binary. Skipping...", dir_full_path); return; } } int matches_len = 0; match *matches; off_t matches_size; off_t matches_spare; if (opts.invert_match) { /* If we are going to invert the set of matches at the end, we will need * one extra match struct, even if there are no matches at all. So make * sure we have a nonempty array; and make sure we always have spare * capacity for one extra. */ matches_size = 100; matches = ag_malloc(matches_size * sizeof(match)); matches_spare = 1; } else { matches_size = 0; matches = NULL; matches_spare = 0; } if (opts.query_len == 1 && opts.query[0] == '.') { matches_size = 1; matches = ag_malloc(matches_size * sizeof(match)); matches[0].start = 0; matches[0].end = buf_len; matches_len = 1; } else if (opts.literal) { const char *match_ptr = buf; strncmp_fp ag_strnstr_fp = get_strstr(opts); while (buf_offset < buf_len) { match_ptr = ag_strnstr_fp(match_ptr, opts.query, buf_len - buf_offset, opts.query_len, skip_lookup); if (match_ptr == NULL) { break; } if (!opts.print_long_lines) { off_t line_length = get_line_length(buf, buf_len, match_ptr - buf, opts.query_len + match_ptr - buf); if (line_length >= opts.long_line_length) { log_debug("Too long line: %d > %d.\n", line_length, opts.long_line_length); const char *end = match_ptr + opts.query_len; buf_offset = end - buf; match_ptr += opts.query_len; continue; } } if (opts.word_regexp) { const char *start = match_ptr; const char *end = match_ptr + opts.query_len; /* Check whether both start and end of the match lie on a word * boundary */ if ((start == buf || is_wordchar(*(start - 1)) != opts.literal_starts_wordchar) && (end == buf + buf_len || is_wordchar(*end) != opts.literal_ends_wordchar)) { /* It's a match */ } else { /* It's not a match */ match_ptr += opts.query_len; buf_offset = end - buf; continue; } } if ((off_t)matches_len + matches_spare >= matches_size) { matches_size = matches ? matches_size * 2 : 100; log_debug("Too many matches in %s. Reallocating matches to %zu.", dir_full_path, matches_size); matches = ag_realloc(matches, matches_size * sizeof(match)); } matches[matches_len].start = match_ptr - buf; matches[matches_len].end = matches[matches_len].start + opts.query_len; buf_offset = matches[matches_len].end; log_debug("Match found. File %s, offset %i bytes.", dir_full_path, matches[matches_len].start); matches_len++; match_ptr += opts.query_len; if (matches_len >= opts.max_matches_per_file) { log_err("Too many matches in %s. Skipping the rest of this file.", dir_full_path); break; } } } else { int rc; int offset_vector[3]; while (buf_offset < buf_len && (rc = pcre_exec(opts.re, opts.re_extra, buf, buf_len, buf_offset, 0, offset_vector, 3)) >= 0) { log_debug("Regex match found. File %s, offset %i bytes.", dir_full_path, offset_vector[0]); buf_offset = offset_vector[1]; if (!opts.print_long_lines) { off_t line_length = get_line_length(buf, buf_len, offset_vector[0], offset_vector[1]); if (line_length >= opts.long_line_length) { log_debug("Too long line: %d > %d.\n", line_length, opts.long_line_length); continue; } } /* TODO: copy-pasted from above. FIXME */ if ((off_t)matches_len + matches_spare >= matches_size) { matches_size = matches ? matches_size * 2 : 100; log_debug("Too many matches in %s. Reallocating matches to %zu.", dir_full_path, matches_size); matches = ag_realloc(matches, matches_size * sizeof(match)); } matches[matches_len].start = offset_vector[0]; matches[matches_len].end = offset_vector[1]; matches_len++; if (matches_len >= opts.max_matches_per_file) { log_err("Too many matches in %s. Skipping the rest of this file.", dir_full_path); break; } } } if (opts.invert_match) { matches_len = invert_matches(matches, matches_len, buf_len); } if (opts.stats) { pthread_mutex_lock(&stats_mtx); stats.total_bytes += buf_len; stats.total_files++; stats.total_matches += matches_len; pthread_mutex_unlock(&stats_mtx); } if (matches_len > 0) { if (binary == -1 && !opts.print_filename_only) { binary = is_binary((void*) buf, buf_len); } pthread_mutex_lock(&print_mtx); if (opts.print_filename_only) { print_path(dir_full_path, '\n'); } else if (binary) { print_binary_file_matches(dir_full_path); } else { print_file_matches(dir_full_path, buf, buf_len, matches, matches_len); } pthread_mutex_unlock(&print_mtx); } else { log_debug("No match in %s", dir_full_path); } if (matches_size > 0) { free(matches); } }
int dialog_inputbox(WINDOW *main_window, const char *title, const char *prompt, const char *init, char **resultp, int *result_len) { int prompt_lines = 0; int prompt_width = 0; WINDOW *win; WINDOW *prompt_win; WINDOW *form_win; PANEL *panel; int i, x, y, lines, columns, win_lines, win_cols; int res = -1; int cursor_position = strlen(init); int cursor_form_win; char *result = *resultp; getmaxyx(stdscr, lines, columns); if (strlen(init)+1 > *result_len) { *result_len = strlen(init)+1; *resultp = result = realloc(result, *result_len); } /* find the widest line of msg: */ prompt_lines = get_line_no(prompt); for (i = 0; i < prompt_lines; i++) { const char *line = get_line(prompt, i); int len = get_line_length(line); prompt_width = max(prompt_width, len); } if (title) prompt_width = max(prompt_width, strlen(title)); win_lines = min(prompt_lines+6, lines-2); win_cols = min(prompt_width+7, columns-2); prompt_lines = max(win_lines-6, 0); prompt_width = max(win_cols-7, 0); /* place dialog in middle of screen */ y = (lines-win_lines)/2; x = (columns-win_cols)/2; strncpy(result, init, *result_len); /* create the windows */ win = newwin(win_lines, win_cols, y, x); prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2); form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); keypad(form_win, TRUE); (void) wattrset(form_win, attributes[INPUT_FIELD]); (void) wattrset(win, attributes[INPUT_BOX]); box(win, 0, 0); (void) wattrset(win, attributes[INPUT_HEADING]); if (title) mvwprintw(win, 0, 3, "%s", title); /* print message */ (void) wattrset(prompt_win, attributes[INPUT_TEXT]); fill_window(prompt_win, prompt); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); cursor_form_win = min(cursor_position, prompt_width-1); mvwprintw(form_win, 0, 0, "%s", result + cursor_position-cursor_form_win); /* create panels */ panel = new_panel(win); /* show the cursor */ curs_set(1); touchwin(win); refresh_all_windows(main_window); while ((res = wgetch(form_win))) { int len = strlen(result); switch (res) { case 10: /* ENTER */ case 27: /* ESCAPE */ case KEY_F(F_HELP): case KEY_F(F_EXIT): case KEY_F(F_BACK): break; case 127: case KEY_BACKSPACE: if (cursor_position > 0) { memmove(&result[cursor_position-1], &result[cursor_position], len-cursor_position+1); cursor_position--; cursor_form_win--; len--; } break; case KEY_DC: if (cursor_position >= 0 && cursor_position < len) { memmove(&result[cursor_position], &result[cursor_position+1], len-cursor_position+1); len--; } break; case KEY_UP: case KEY_RIGHT: if (cursor_position < len) { cursor_position++; cursor_form_win++; } break; case KEY_DOWN: case KEY_LEFT: if (cursor_position > 0) { cursor_position--; cursor_form_win--; } break; case KEY_HOME: cursor_position = 0; cursor_form_win = 0; break; case KEY_END: cursor_position = len; cursor_form_win = min(cursor_position, prompt_width-1); break; default: if ((isgraph(res) || isspace(res))) { /* one for new char, one for '\0' */ if (len+2 > *result_len) { *result_len = len+2; *resultp = result = realloc(result, *result_len); } /* insert the char at the proper position */ memmove(&result[cursor_position+1], &result[cursor_position], len-cursor_position+1); result[cursor_position] = res; cursor_position++; cursor_form_win++; len++; } else { mvprintw(0, 0, "unknown key: %d\n", res); } break; } if (cursor_form_win < 0) cursor_form_win = 0; else if (cursor_form_win > prompt_width-1) cursor_form_win = prompt_width-1; wmove(form_win, 0, 0); wclrtoeol(form_win); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); mvwprintw(form_win, 0, 0, "%s", result + cursor_position-cursor_form_win); wmove(form_win, 0, cursor_form_win); touchwin(win); refresh_all_windows(main_window); if (res == 10) { res = 0; break; } else if (res == 27 || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { res = KEY_EXIT; break; } else if (res == KEY_F(F_HELP)) { res = 1; break; } } /* hide the cursor */ curs_set(0); del_panel(panel); delwin(prompt_win); delwin(form_win); delwin(win); return res; }
/* print out any matches found */ static void display (MYDBM_FILE dbf, struct mandata *info, const char *page) { struct mandata *newinfo; char *string, *whatis, *string_conv; const char *page_name; char *key; int line_len, rest; newinfo = resolve_pointers (dbf, info, page); whatis = get_whatis (newinfo, page); if (newinfo == NULL) newinfo = info; dbprintf (newinfo); if (newinfo->name) page_name = newinfo->name; else page_name = page; key = xasprintf ("%s (%s)", page_name, newinfo->ext); if (hashtable_lookup_structure (display_seen, key, strlen (key))) goto out; hashtable_install (display_seen, key, strlen (key), NULL); line_len = get_line_length (); if (!long_output && strlen (page_name) > (size_t) (line_len / 2)) string = xasprintf ("%.*s...", line_len / 2 - 3, page_name); else string = xstrdup (page_name); string = appendstr (string, " (", newinfo->ext, ")", NULL); if (!STREQ (newinfo->pointer, "-") && !STREQ (newinfo->pointer, page)) string = appendstr (string, " [", newinfo->pointer, "]", NULL); if (strlen (string) < (size_t) 20) { int i; string = xrealloc (string, 21); for (i = strlen (string); i < 20; ++i) string[i] = ' '; string[i] = '\0'; } string = appendstr (string, " - ", NULL); rest = line_len - strlen (string); if (!long_output && strlen (whatis) > (size_t) rest) { whatis[rest - 3] = '\0'; string = appendstr (string, whatis, "...\n", NULL); } else string = appendstr (string, whatis, "\n", NULL); string_conv = simple_convert (conv_to_locale, string); fputs (string_conv, stdout); free (string_conv); free (string); out: free (key); free (whatis); if (newinfo != info) free_mandata_struct (newinfo); }
int dialog_inputbox(WINDOW *main_window, const char *title, const char *prompt, const char *init, char *result, int result_len) { int prompt_lines = 0; int prompt_width = 0; WINDOW *win; WINDOW *prompt_win; WINDOW *form_win; PANEL *panel; int i, x, y; int res = -1; int cursor_position = strlen(init); /* find the widest line of msg: */ prompt_lines = get_line_no(prompt); for (i = 0; i < prompt_lines; i++) { const char *line = get_line(prompt, i); int len = get_line_length(line); prompt_width = max(prompt_width, len); } if (title) prompt_width = max(prompt_width, strlen(title)); /* place dialog in middle of screen */ y = (LINES-(prompt_lines+4))/2; x = (COLS-(prompt_width+4))/2; strncpy(result, init, result_len); /* create the windows */ win = newwin(prompt_lines+6, prompt_width+7, y, x); prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2); form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); keypad(form_win, TRUE); wattrset(form_win, attributes[INPUT_FIELD]); wattrset(win, attributes[INPUT_BOX]); box(win, 0, 0); wattrset(win, attributes[INPUT_HEADING]); if (title) mvwprintw(win, 0, 3, "%s", title); /* print message */ wattrset(prompt_win, attributes[INPUT_TEXT]); fill_window(prompt_win, prompt); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); mvwprintw(form_win, 0, 0, "%s", result); /* create panels */ panel = new_panel(win); /* show the cursor */ curs_set(1); touchwin(win); refresh_all_windows(main_window); while ((res = wgetch(form_win))) { int len = strlen(result); switch (res) { case 10: /* ENTER */ case 27: /* ESCAPE */ case KEY_F(F_HELP): case KEY_F(F_EXIT): case KEY_F(F_BACK): break; case 127: case KEY_BACKSPACE: if (cursor_position > 0) { memmove(&result[cursor_position-1], &result[cursor_position], len-cursor_position+1); cursor_position--; } break; case KEY_DC: if (cursor_position >= 0 && cursor_position < len) { memmove(&result[cursor_position], &result[cursor_position+1], len-cursor_position+1); } break; case KEY_UP: case KEY_RIGHT: if (cursor_position < len && cursor_position < min(result_len, prompt_width)) cursor_position++; break; case KEY_DOWN: case KEY_LEFT: if (cursor_position > 0) cursor_position--; break; default: if ((isgraph(res) || isspace(res)) && len-2 < result_len) { /* insert the char at the proper position */ memmove(&result[cursor_position+1], &result[cursor_position], len+1); result[cursor_position] = res; cursor_position++; } else { mvprintw(0, 0, "unknow key: %d\n", res); } break; } wmove(form_win, 0, 0); wclrtoeol(form_win); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); mvwprintw(form_win, 0, 0, "%s", result); wmove(form_win, 0, cursor_position); touchwin(win); refresh_all_windows(main_window); if (res == 10) { res = 0; break; } else if (res == 27 || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { res = KEY_EXIT; break; } else if (res == KEY_F(F_HELP)) { res = 1; break; } } /* hide the cursor */ curs_set(0); del_panel(panel); delwin(prompt_win); delwin(form_win); delwin(win); return res; }
int dialog_inputbox(WINDOW *main_window, const char *title, const char *prompt, const char *init, char **resultp, int *result_len) { int prompt_lines = 0; int prompt_width = 0; WINDOW *win; WINDOW *prompt_win; WINDOW *form_win; PANEL *panel; int i, x, y; int res = -1; int cursor_position = strlen(init); int cursor_form_win; char *result = *resultp; if (strlen(init)+1 > *result_len) { *result_len = strlen(init)+1; *resultp = result = realloc(result, *result_len); } prompt_lines = get_line_no(prompt); for (i = 0; i < prompt_lines; i++) { const char *line = get_line(prompt, i); int len = get_line_length(line); prompt_width = max(prompt_width, len); } if (title) prompt_width = max(prompt_width, strlen(title)); y = (LINES-(prompt_lines+4))/2; x = (COLS-(prompt_width+4))/2; strncpy(result, init, *result_len); win = newwin(prompt_lines+6, prompt_width+7, y, x); prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2); form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); keypad(form_win, TRUE); (void) wattrset(form_win, attributes[INPUT_FIELD]); (void) wattrset(win, attributes[INPUT_BOX]); box(win, 0, 0); (void) wattrset(win, attributes[INPUT_HEADING]); if (title) mvwprintw(win, 0, 3, "%s", title); (void) wattrset(prompt_win, attributes[INPUT_TEXT]); fill_window(prompt_win, prompt); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); cursor_form_win = min(cursor_position, prompt_width-1); mvwprintw(form_win, 0, 0, "%s", result + cursor_position-cursor_form_win); panel = new_panel(win); curs_set(1); touchwin(win); refresh_all_windows(main_window); while ((res = wgetch(form_win))) { int len = strlen(result); switch (res) { case 10: case 27: case KEY_F(F_HELP): case KEY_F(F_EXIT): case KEY_F(F_BACK): break; case 127: case KEY_BACKSPACE: if (cursor_position > 0) { memmove(&result[cursor_position-1], &result[cursor_position], len-cursor_position+1); cursor_position--; cursor_form_win--; len--; } break; case KEY_DC: if (cursor_position >= 0 && cursor_position < len) { memmove(&result[cursor_position], &result[cursor_position+1], len-cursor_position+1); len--; } break; case KEY_UP: case KEY_RIGHT: if (cursor_position < len) { cursor_position++; cursor_form_win++; } break; case KEY_DOWN: case KEY_LEFT: if (cursor_position > 0) { cursor_position--; cursor_form_win--; } break; case KEY_HOME: cursor_position = 0; cursor_form_win = 0; break; case KEY_END: cursor_position = len; cursor_form_win = min(cursor_position, prompt_width-1); break; default: if ((isgraph(res) || isspace(res))) { if (len+2 > *result_len) { *result_len = len+2; *resultp = result = realloc(result, *result_len); } memmove(&result[cursor_position+1], &result[cursor_position], len-cursor_position+1); result[cursor_position] = res; cursor_position++; cursor_form_win++; len++; } else { mvprintw(0, 0, "unknown key: %d\n", res); } break; } if (cursor_form_win < 0) cursor_form_win = 0; else if (cursor_form_win > prompt_width-1) cursor_form_win = prompt_width-1; wmove(form_win, 0, 0); wclrtoeol(form_win); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); mvwprintw(form_win, 0, 0, "%s", result + cursor_position-cursor_form_win); wmove(form_win, 0, cursor_form_win); touchwin(win); refresh_all_windows(main_window); if (res == 10) { res = 0; break; } else if (res == 27 || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { res = KEY_EXIT; break; } else if (res == KEY_F(F_HELP)) { res = 1; break; } } curs_set(0); del_panel(panel); delwin(prompt_win); delwin(form_win); delwin(win); return res; }
static int mc68x328fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { u_long line_length; /* * FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal! * as FB_VMODE_SMOOTH_XPAN is only used internally */ if (var->vmode & FB_VMODE_CONUPDATE) { var->vmode |= FB_VMODE_YWRAP; var->xoffset = info->var.xoffset; var->yoffset = info->var.yoffset; } /* * Some very basic checks */ if (!var->xres) var->xres = 1; if (!var->yres) var->yres = 1; if (var->xres > var->xres_virtual) var->xres_virtual = var->xres; if (var->yres > var->yres_virtual) var->yres_virtual = var->yres; if (var->bits_per_pixel <= 1) var->bits_per_pixel = 1; else if (var->bits_per_pixel <= 8) var->bits_per_pixel = 8; else if (var->bits_per_pixel <= 16) var->bits_per_pixel = 16; else if (var->bits_per_pixel <= 24) var->bits_per_pixel = 24; else if (var->bits_per_pixel <= 32) var->bits_per_pixel = 32; else return -EINVAL; if (var->xres_virtual < var->xoffset + var->xres) var->xres_virtual = var->xoffset + var->xres; if (var->yres_virtual < var->yoffset + var->yres) var->yres_virtual = var->yoffset + var->yres; /* * Memory limit */ line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); if (line_length * var->yres_virtual > videomemorysize) return -ENOMEM; /* * Now that we checked it we alter var. The reason being is that the video * mode passed in might not work but slight changes to it might make it * work. This way we let the user know what is acceptable. */ switch (var->bits_per_pixel) { case 1: var->red.offset = 0; var->red.length = 1; var->green.offset = 0; var->green.length = 1; var->blue.offset = 0; var->blue.length = 1; var->transp.offset = 0; var->transp.length = 0; break; case 8: var->red.offset = 0; var->red.length = 8; var->green.offset = 0; var->green.length = 8; var->blue.offset = 0; var->blue.length = 8; var->transp.offset = 0; var->transp.length = 0; break; case 16: /* RGBA 5551 */ if (var->transp.length) { var->red.offset = 0; var->red.length = 5; var->green.offset = 5; var->green.length = 5; var->blue.offset = 10; var->blue.length = 5; var->transp.offset = 15; var->transp.length = 1; } else { /* RGB 565 */ var->red.offset = 0; var->red.length = 5; var->green.offset = 5; var->green.length = 6; var->blue.offset = 11; var->blue.length = 5; var->transp.offset = 0; var->transp.length = 0; } break; case 24: /* RGB 888 */ var->red.offset = 0; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 16; var->blue.length = 8; var->transp.offset = 0; var->transp.length = 0; break; case 32: /* RGBA 8888 */ var->red.offset = 0; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 16; var->blue.length = 8; var->transp.offset = 24; var->transp.length = 8; break; } var->red.msb_right = 0; var->green.msb_right = 0; var->blue.msb_right = 0; var->transp.msb_right = 0; return 0; }
int main (int argc, char **argv) { int status = 0; char *nextarg; char *tmp; char *section = 0; #ifdef __CYGWIN__ extern int optind; #endif #if 0 { /* There are no known cases of buffer overflow caused by excessively long environment variables. In case you find one, the simplistic way to fix is to enable this stopgap. */ char *s; #define CHECK(p,l) s=getenv(p); if(s && strlen(s)>(l)) { fprintf(stderr, "ERROR: Environment variable %s too long!\n", p); exit(1); } CHECK("LANG", 32); CHECK("LANGUAGE", 128); CHECK("LC_MESSAGES", 128); CHECK("MANPAGER", 128); CHECK("MANPL", 128); CHECK("MANROFFSEQ", 128); CHECK("MANSECT", 128); CHECK("MAN_HP_DIREXT", 128); CHECK("PAGER", 128); CHECK("SYSTEM", 64); CHECK("BROWSER", 64); CHECK("HTMLPAGER", 64); /* COLUMNS, LC_ALL, LC_CTYPE, MANPATH, MANWIDTH, MAN_IRIX_CATNAMES, MAN_ICONV_PATH, MAN_ICONV_OPT, MAN_ICONV_INPUT_CHARSET, MAN_ICONV_OUTPUT_CHARSET, NLSPATH, PATH */ } #endif #ifndef __FreeBSD__ /* Slaven Rezif: FreeBSD-2.2-SNAP does not recognize LC_MESSAGES. */ setlocale(LC_CTYPE, ""); /* used anywhere? maybe only isdigit()? */ setlocale(LC_MESSAGES, ""); #endif /* No doubt we'll need some generic language code here later. For the moment only Japanese support. */ setlang(); /* Handle /usr/man/man1.Z/name.1 nonsense from HP */ dohp = getenv("MAN_HP_DIREXT"); /* .Z */ /* Handle ls.z (instead of ls.1.z) cat page naming from IRIX */ if (getenv("MAN_IRIX_CATNAMES")) do_irix = 1; /* Handle lack of ':' in NTFS file names */ #if defined(_WIN32) || defined(__CYGWIN__) do_win32 = 1; #endif progname = mkprogname (argv[0]); get_permissions (); get_line_length(); /* * read command line options and man.conf */ man_getopt (argc, argv); /* * manpath or man --path or man -w will only print the manpath */ if (!strcmp (progname, "manpath") || (optind == argc && print_where)) { init_manpath(); prmanpath(); exit(0); } if (optind == argc) gripe(NO_NAME_NO_SECTION); section_list = get_section_list (); while (optind < argc) { nextarg = argv[optind++]; /* is_section correctly accepts 3Xt as section, but also 9wm, so we should not believe is_section() for the last arg. */ tmp = is_section (nextarg); if (tmp && optind < argc) { section = tmp; if (debug) gripe (SECTION, section); continue; } if (global_apropos) status = !do_global_apropos (nextarg, section); else if (apropos) status = !do_apropos (nextarg); else if (whatis) status = !do_whatis (nextarg); else { status = man (nextarg, section); if (status == 0) { if (section) gripe (NO_SUCH_ENTRY_IN_SECTION, nextarg, section); else gripe (NO_SUCH_ENTRY, nextarg); } } } return status ? EXIT_SUCCESS : EXIT_FAILURE; }