int process_member(CIFBLK *cif, int noext, DSXTENT extent[], BYTE *ttr, unsigned long optflags, char* dsname, char* memname) { int rc; u_int trk; U16 len; U32 cyl; U8 head; U8 rec; BYTE *buf; U32 beg_cyl = 0; U8 beg_head = 0; U8 beg_rec = 0; U64 tot_len = 0; set_codepage(NULL); trk = (ttr[0] << 8) | ttr[1]; rec = ttr[2]; while (1) { rc = convert_tt(trk, noext, extent, cif->heads, &cyl, &head); if (rc < 0) return -1; rc = read_block(cif, cyl, head, rec, 0, 0, &buf, &len); if (rc < 0) return -1; if (rc > 0) /* end of track */ { trk++; rec = 1; continue; } if (len == 0) /* end of member */ break; if (optflags & OPT_MEMINFO_ONLY) { if (!beg_cyl) { beg_cyl = cyl; beg_head = head; beg_rec = rec; } tot_len += len; } else if (optflags & OPT_CARDS) { /* Formatted 72 or 80 column ASCII card images */ if ((rc = do_cat_cards(buf, len, optflags)) != 0) return -1; // (len not multiple of 80 bytes) } else if (optflags & OPT_ASCIIFY) { /* Unformatted ASCII text */ BYTE *p; for (p = buf; len--; p++) putchar(guest_to_host(*p)); } else { /* Output member in binary exactly as-is */ #if O_BINARY != 0 setmode(fileno(stdout),O_BINARY); #endif fwrite(buf, len, 1, stdout); } rec++; } if (optflags & OPT_MEMINFO_ONLY) // "%s/%s/%-8s %8s bytes from %4.4"PRIX32"%2.2"PRIX32"%2.2"PRIX32" to %4.4"PRIX32"%2.2"PRIX32"%2.2"PRIX32 FWRMSG( stdout, HHC02407, "I", volser, dsname, memname, fmt_memsize( tot_len ), (U32) beg_cyl, (U32) beg_head, (U32) beg_rec, (U32) cyl, (U32) head, (U32) rec ); return 0; }
void settings_apply(bool read_disk) { char buf[64]; #if CONFIG_CODEC == SWCODEC int i; #endif sound_settings_apply(); #ifdef HAVE_DISK_STORAGE audio_set_buffer_margin(global_settings.buffer_margin); #endif #ifdef HAVE_LCD_CONTRAST lcd_set_contrast(global_settings.contrast); #endif lcd_scroll_speed(global_settings.scroll_speed); #ifdef HAVE_REMOTE_LCD lcd_remote_set_contrast(global_settings.remote_contrast); lcd_remote_set_invert_display(global_settings.remote_invert); #ifdef HAVE_LCD_FLIP lcd_remote_set_flip(global_settings.remote_flip_display); #endif lcd_remote_scroll_speed(global_settings.remote_scroll_speed); lcd_remote_scroll_step(global_settings.remote_scroll_step); lcd_remote_scroll_delay(global_settings.remote_scroll_delay); lcd_remote_bidir_scroll(global_settings.remote_bidir_limit); #ifdef HAVE_REMOTE_LCD_TICKING lcd_remote_emireduce(global_settings.remote_reduce_ticking); #endif remote_backlight_set_timeout(global_settings.remote_backlight_timeout); #if CONFIG_CHARGING remote_backlight_set_timeout_plugged(global_settings.remote_backlight_timeout_plugged); #endif #ifdef HAS_REMOTE_BUTTON_HOLD remote_backlight_set_on_button_hold(global_settings.remote_backlight_on_button_hold); #endif #endif /* HAVE_REMOTE_LCD */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS backlight_set_brightness(global_settings.brightness); #endif #ifdef HAVE_BACKLIGHT backlight_set_timeout(global_settings.backlight_timeout); #if CONFIG_CHARGING backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); #endif #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING) \ || defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING) backlight_set_fade_in(global_settings.backlight_fade_in); backlight_set_fade_out(global_settings.backlight_fade_out); #endif #endif #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS buttonlight_set_brightness(global_settings.buttonlight_brightness); #endif #ifdef HAVE_BUTTON_LIGHT buttonlight_set_timeout(global_settings.buttonlight_timeout); #endif #ifdef HAVE_DISK_STORAGE storage_spindown(global_settings.disk_spindown); #endif #if (CONFIG_CODEC == MAS3507D) && !defined(SIMULATOR) dac_line_in(global_settings.line_in); #endif set_poweroff_timeout(global_settings.poweroff); set_battery_capacity(global_settings.battery_capacity); #if BATTERY_TYPES_COUNT > 1 set_battery_type(global_settings.battery_type); #endif #ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_INVERT lcd_set_invert_display(global_settings.invert); #endif #ifdef HAVE_LCD_FLIP lcd_set_flip(global_settings.flip_display); button_set_flip(global_settings.flip_display); #endif lcd_update(); /* refresh after flipping the screen */ settings_apply_pm_range(); peak_meter_init_times( global_settings.peak_meter_release, global_settings.peak_meter_hold, global_settings.peak_meter_clip_hold); #endif #ifdef HAVE_SPEAKER audiohw_enable_speaker(global_settings.speaker_enabled); #endif if (read_disk) { #ifdef HAVE_LCD_BITMAP /* fonts need to be loaded before the WPS */ if ( global_settings.font_file[0]) { snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", global_settings.font_file); if (font_load(NULL, buf) < 0) font_reset(NULL); } else font_reset(NULL); #ifdef HAVE_REMOTE_LCD if ( global_settings.remote_font_file[0]) { snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", global_settings.remote_font_file); if (font_load_remoteui(buf) < 0) font_load_remoteui(NULL); } else font_load_remoteui(NULL); #endif if ( global_settings.kbd_file[0]) { snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd", global_settings.kbd_file); load_kbd(buf); } else load_kbd(NULL); #endif if ( global_settings.lang_file[0]) { snprintf(buf, sizeof buf, LANG_DIR "/%s.lng", global_settings.lang_file); lang_core_load(buf); talk_init(); /* use voice of same language */ } /* reload wpses */ settings_apply_skins(); /* load the icon set */ icons_init(); #ifdef HAVE_LCD_COLOR if (global_settings.colors_file[0]) read_color_theme_file(); #endif } #ifdef HAVE_LCD_COLOR screens[SCREEN_MAIN].set_foreground(global_settings.fg_color); screens[SCREEN_MAIN].set_background(global_settings.bg_color); screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color); screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color); screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color); #endif #ifdef HAVE_LCD_BITMAP lcd_scroll_step(global_settings.scroll_step); gui_list_screen_scroll_step(global_settings.screen_scroll_step); gui_list_screen_scroll_out_of_view(global_settings.offset_out_of_view); #else lcd_jump_scroll(global_settings.jump_scroll); lcd_jump_scroll_delay(global_settings.jump_scroll_delay); #endif lcd_bidir_scroll(global_settings.bidir_limit); lcd_scroll_delay(global_settings.scroll_delay); set_codepage(global_settings.default_codepage); #if CONFIG_CODEC == SWCODEC #ifdef HAVE_CROSSFADE audio_set_crossfade(global_settings.crossfade); #endif dsp_set_replaygain(); dsp_set_crossfeed(global_settings.crossfeed); dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain); dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain, global_settings.crossfeed_hf_attenuation, global_settings.crossfeed_hf_cutoff); /* Configure software equalizer, hardware eq is handled in audio_init() */ dsp_set_eq(global_settings.eq_enabled); dsp_set_eq_precut(global_settings.eq_precut); for(i = 0; i < 5; i++) { dsp_set_eq_coefs(i); } dsp_dither_enable(global_settings.dithering_enabled); dsp_timestretch_enable(global_settings.timestretch_enabled); dsp_set_compressor(global_settings.compressor_threshold, global_settings.compressor_makeup_gain, global_settings.compressor_ratio, global_settings.compressor_knee, global_settings.compressor_release_time); #endif #ifdef HAVE_SPDIF_POWER spdif_power_enable(global_settings.spdif_enable); #endif #ifdef HAVE_BACKLIGHT set_backlight_filter_keypress(global_settings.bl_filter_first_keypress); #ifdef HAVE_REMOTE_LCD set_remote_backlight_filter_keypress(global_settings.remote_bl_filter_first_keypress); #endif #ifdef HAS_BUTTON_HOLD backlight_set_on_button_hold(global_settings.backlight_on_button_hold); #endif #ifdef HAVE_LCD_SLEEP_SETTING lcd_set_sleep_after_backlight_off(global_settings.lcd_sleep_after_backlight_off); #endif #endif /* HAVE_BACKLIGHT */ #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING touchpad_set_sensitivity(global_settings.touchpad_sensitivity); #endif #ifdef HAVE_USB_CHARGING_ENABLE usb_charging_enable(global_settings.usb_charging); #endif #ifdef HAVE_TOUCHSCREEN touchscreen_set_mode(global_settings.touch_mode); memcpy(&calibration_parameters, &global_settings.ts_calibration_data, sizeof(struct touchscreen_parameter)); #endif /* This should stay last */ #if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC enc_global_settings_apply(); #endif #ifdef HAVE_LCD_BITMAP /* already called with THEME_STATUSBAR in settings_apply_skins() */ viewportmanager_theme_changed(THEME_UI_VIEWPORT|THEME_LANGUAGE); #endif }
/*-------------------------------------------------------------------*/ DLL_EXPORT int impl(int argc, char *argv[]) { char *cfgfile; /* -> Configuration filename */ int c; /* Work area for getopt */ int arg_error = 0; /* 1=Invalid arguments */ char *msgbuf; /* */ int msgnum; /* */ int msgcnt; /* */ TID rctid; /* RC file thread identifier */ TID logcbtid; /* RC file thread identifier */ SET_THREAD_NAME("impl"); /* Initialize 'hostinfo' BEFORE display_version is called */ init_hostinfo( &hostinfo ); #ifdef _MSVC_ /* Initialize sockets package */ VERIFY( socket_init() == 0 ); #endif /* Ensure hdl_shut is called in case of shutdown hdl_shut will ensure entries are only called once */ atexit(hdl_shut); set_codepage(NULL); /* Clear the system configuration block */ memset (&sysblk, 0, sizeof(SYSBLK)); /* Save thread ID of main program */ sysblk.impltid = thread_id(); /* Save TOD of when we were first IMPL'ed */ time( &sysblk.impltime ); #ifdef OPTION_MSGHLD /* Set the default timeout value */ sysblk.keep_timeout_secs = 120; #endif /* Initialize thread creation attributes so all of hercules can use them at any time when they need to create_thread */ initialize_detach_attr (DETACHED); initialize_join_attr (JOINABLE); /* Copy length for regs */ sysblk.regs_copy_len = (int)((uintptr_t)&sysblk.dummyregs.regs_copy_end - (uintptr_t)&sysblk.dummyregs); /* Set the daemon_mode flag indicating whether we running in background/daemon mode or not (meaning both stdout/stderr are redirected to a non-tty device). Note that this flag needs to be set before logger_init gets called since the logger_logfile_write function relies on its setting. */ sysblk.daemon_mode = !isatty(STDERR_FILENO) && !isatty(STDOUT_FILENO); /* Initialize the logmsg pipe and associated logger thread. This causes all subsequent logmsg's to be redirected to the logger facility for handling by virtue of stdout/stderr being redirected to the logger facility. */ logger_init(); /* Now display the version information again after logger_init has been called so that either the panel display thread or the external gui can see the version which was previously possibly only displayed to the actual physical screen the first time we did it further above (depending on whether we're running in daemon_mode (external gui mode) or not). This it the call that the panel thread or the one the external gui actually "sees". The first call further above wasn't seen by either since it was issued before logger_init was called and thus got written directly to the physical screen whereas this one will be inter- cepted and handled by the logger facility thereby allowing the panel thread or external gui to "see" it and thus display it. */ display_version (stdout, "Hercules ", TRUE); #if defined(OPTION_DYNAMIC_LOAD) /* Initialize the hercules dynamic loader */ hdl_main(); #endif /* defined(OPTION_DYNAMIC_LOAD) */ #if defined(ENABLE_NLS) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, HERC_LOCALEDIR); textdomain(PACKAGE); #endif #ifdef EXTERNALGUI /* Set GUI flag if specified as final argument */ if (argc >= 1 && strncmp(argv[argc-1],"EXTERNALGUI",11) == 0) { #if defined(OPTION_DYNAMIC_LOAD) if (hdl_load("dyngui",HDL_LOAD_DEFAULT) != 0) { usleep(10000); /* (give logger thread time to issue preceding HHCHD007E message) */ logmsg(_("HHCIN008S DYNGUI.DLL load failed; Hercules terminated.\n")); delayed_exit(1); } #endif /* defined(OPTION_DYNAMIC_LOAD) */ argc--; } #endif /*EXTERNALGUI*/ #if !defined(WIN32) && !defined(HAVE_STRERROR_R) strerror_r_init(); #endif #if defined(OPTION_SCSI_TAPE) initialize_lock (&sysblk.stape_lock); initialize_condition (&sysblk.stape_getstat_cond); InitializeListHead (&sysblk.stape_mount_link); InitializeListHead (&sysblk.stape_status_link); #endif /* defined(OPTION_SCSI_TAPE) */ /* Get name of configuration file or default to hercules.cnf */ if(!(cfgfile = getenv("HERCULES_CNF"))) cfgfile = "hercules.cnf"; /* Process the command line options */ while ((c = getopt(argc, argv, "f:p:l:db:")) != EOF) { switch (c) { case 'f': cfgfile = optarg; break; #if defined(OPTION_DYNAMIC_LOAD) case 'p': if(optarg) hdl_setpath(strdup(optarg)); break; case 'l': { char *dllname, *strtok_str; for(dllname = strtok_r(optarg,", ",&strtok_str); dllname; dllname = strtok_r(NULL,", ",&strtok_str)) hdl_load(dllname, HDL_LOAD_DEFAULT); } break; #endif /* defined(OPTION_DYNAMIC_LOAD) */ case 'b': sysblk.logofile=optarg; break; case 'd': sysblk.daemon_mode = 1; break; default: arg_error = 1; } /* end switch(c) */ } /* end while */ if (optind < argc) arg_error = 1; /* Terminate if invalid arguments were detected */ if (arg_error) { logmsg("usage: %s [-f config-filename] [-d] [-b logo-filename]" #if defined(OPTION_DYNAMIC_LOAD) " [-p dyn-load-dir] [[-l dynmod-to-load]...]" #endif /* defined(OPTION_DYNAMIC_LOAD) */ " [> logfile]\n", argv[0]); delayed_exit(1); } /* Register the SIGINT handler */ if ( signal (SIGINT, sigint_handler) == SIG_ERR ) { logmsg(_("HHCIN001S Cannot register SIGINT handler: %s\n"), strerror(errno)); delayed_exit(1); } /* Register the SIGTERM handler */ if ( signal (SIGTERM, sigterm_handler) == SIG_ERR ) { logmsg(_("HHCIN009S Cannot register SIGTERM handler: %s\n"), strerror(errno)); delayed_exit(1); } #if defined( _MSVC_ ) /* Register the Window console ctrl handlers */ if (SetConsoleCtrlHandler(console_ctrl_handler, TRUE) == FALSE) { logmsg(_("HHCIN010S Cannot register ConsoleCtrl handler: %s\n"), strerror(errno)); delayed_exit(1); } #endif #if defined(HAVE_DECL_SIGPIPE) && HAVE_DECL_SIGPIPE /* Ignore the SIGPIPE signal, otherwise Hercules may terminate with Broken Pipe error if the printer driver writes to a closed pipe */ if ( signal (SIGPIPE, SIG_IGN) == SIG_ERR ) { logmsg(_("HHCIN002E Cannot suppress SIGPIPE signal: %s\n"), strerror(errno)); } #endif #if defined( OPTION_WAKEUP_SELECT_VIA_PIPE ) { int fds[2]; initialize_lock(&sysblk.cnslpipe_lock); initialize_lock(&sysblk.sockpipe_lock); sysblk.cnslpipe_flag=0; sysblk.sockpipe_flag=0; VERIFY( create_pipe(fds) >= 0 ); sysblk.cnslwpipe=fds[1]; sysblk.cnslrpipe=fds[0]; VERIFY( create_pipe(fds) >= 0 ); sysblk.sockwpipe=fds[1]; sysblk.sockrpipe=fds[0]; } #endif // defined( OPTION_WAKEUP_SELECT_VIA_PIPE ) #if !defined(NO_SIGABEND_HANDLER) { struct sigaction sa; sa.sa_sigaction = (void*)&sigabend_handler; #ifdef SA_NODEFER sa.sa_flags = SA_NODEFER; #else sa.sa_flags = 0; #endif if( sigaction(SIGILL, &sa, NULL) || sigaction(SIGFPE, &sa, NULL) || sigaction(SIGSEGV, &sa, NULL) || sigaction(SIGBUS, &sa, NULL) || sigaction(SIGUSR1, &sa, NULL) || sigaction(SIGUSR2, &sa, NULL) ) { logmsg(_("HHCIN003S Cannot register SIGILL/FPE/SEGV/BUS/USR " "handler: %s\n"), strerror(errno)); delayed_exit(1); } } #endif /*!defined(NO_SIGABEND_HANDLER)*/ /* Build system configuration */ build_config (cfgfile); /* System initialisation time */ sysblk.todstart = hw_clock() << 8; #ifdef OPTION_MIPS_COUNTING /* Initialize "maxrates" command reporting intervals */ curr_int_start_time = time( NULL ); prev_int_start_time = curr_int_start_time; #endif #if !defined(NO_SIGABEND_HANDLER) /* Start the watchdog */ if ( create_thread (&sysblk.wdtid, DETACHED, watchdog_thread, NULL, "watchdog_thread") ) { logmsg(_("HHCIN004S Cannot create watchdog thread: %s\n"), strerror(errno)); delayed_exit(1); } #endif /*!defined(NO_SIGABEND_HANDLER)*/ #ifdef OPTION_SHARED_DEVICES /* Start the shared server */ if (sysblk.shrdport) if ( create_thread (&sysblk.shrdtid, DETACHED, shared_server, NULL, "shared_server") ) { logmsg(_("HHCIN006S Cannot create shared_server thread: %s\n"), strerror(errno)); delayed_exit(1); } /* Retry pending connections */ { DEVBLK *dev; TID tid; for (dev = sysblk.firstdev; dev != NULL; dev = dev->nextdev) if (dev->connecting) if ( create_thread (&tid, DETACHED, *dev->hnd->init, dev, "device connecting thread") ) { logmsg(_("HHCIN007S Cannot create %4.4X connection thread: %s\n"), dev->devnum, strerror(errno)); delayed_exit(1); } } #endif /* Start up the RC file processing thread */ create_thread(&rctid,DETACHED, process_rc_file,NULL,"process_rc_file"); if(log_callback) { // 'herclin' called us. IT'S in charge. Create its requested // logmsg intercept callback function and return back to it. create_thread(&logcbtid,DETACHED, log_do_callback,NULL,"log_do_callback"); return(0); } //--------------------------------------------------------------- // The below functions will not return until Hercules is shutdown //--------------------------------------------------------------- /* Activate the control panel */ if(!sysblk.daemon_mode) panel_display (); else { #if defined(OPTION_DYNAMIC_LOAD) if(daemon_task) daemon_task (); else #endif /* defined(OPTION_DYNAMIC_LOAD) */ { /* Tell RC file and HAO threads they may now proceed */ sysblk.panel_init = 1; /* Retrieve messages from logger and write to stderr */ while (1) if((msgcnt = log_read(&msgbuf, &msgnum, LOG_BLOCK))) if(isatty(STDERR_FILENO)) fwrite(msgbuf,msgcnt,1,stderr); } } // ----------------------------------------------------- // *** Hercules has been shutdown (PAST tense) *** // ----------------------------------------------------- ASSERT( sysblk.shutdown ); // (why else would we be here?!) #ifdef _MSVC_ SetConsoleCtrlHandler(console_ctrl_handler, FALSE); socket_deinit(); #endif #ifdef DEBUG fprintf(stdout, _("IMPL EXIT\n")); #endif fprintf(stdout, _("HHCIN099I Hercules terminated\n")); fflush(stdout); usleep(10000); return 0; } /* end function main */
bool IE_Imp_MSWrite::read_txt (int from, int to) { static const char *currcp; int fcMac, pnChar, fcFirst, cfod, fc, fcLim; unsigned char page[0x80]; UT_String properties, tmp; int dataLen = static_cast<UT_sint32>(mData.getLength()); UT_DEBUGMSG((" TXT:\n")); UT_DEBUGMSG((" from = %d\n", from)); UT_DEBUGMSG((" to = %d\n", to)); fcMac = wri_struct_value(wri_file_header, "fcMac"); pnChar = (fcMac + 127) / 128; fcFirst = 0x80; while (true) { gsf_input_seek(mFile, pnChar++ * 0x80, G_SEEK_SET); gsf_input_read(mFile, 0x80, page); fc = READ_DWORD(page); cfod = page[0x7f]; UT_DEBUGMSG((" fcFirst = %d\n", fc)); UT_DEBUGMSG((" cfod = %d\n", cfod)); if (fc != fcFirst) UT_WARNINGMSG(("read_txt: fcFirst wrong.\n")); // read all FODs (format descriptors) for (int fod = 0; fod < cfod; fod++) { int bfprop, cch, ftc, hps, fBold, fItalic, fUline, hpsPos; UT_DEBUGMSG((" CHP-FOD #%02d:\n", fod + 1)); // read a FOD (format descriptor) fcLim = READ_DWORD(page + 4 + fod * 6); bfprop = READ_WORD(page + 8 + fod * 6); UT_DEBUGMSG((" fcLim = %d\n", fcLim)); UT_DEBUGMSG((bfprop == 0xffff ? " bfprop = 0x%04X\n" : " bfprop = %d\n", bfprop)); // default CHP values ftc = 0; hps = 24; fBold = fItalic = fUline = hpsPos = 0; // if the CHP FPROPs (formatting properties) differ from the defaults, get them if (bfprop != 0xffff && bfprop + (cch = page[bfprop + 4]) < 0x80) { UT_DEBUGMSG((" cch = %d\n", cch)); if (cch >= 2) ftc = page[bfprop + 6] >> 2; if (cch >= 5) ftc |= (page[bfprop + 9] & 3) << 6; if (cch >= 3) hps = page[bfprop + 7]; if (cch >= 2) fBold = page[bfprop + 6] & 1; if (cch >= 2) fItalic = page[bfprop + 6] & 2; if (cch >= 4) fUline = page[bfprop + 8] & 1; if (cch >= 6) hpsPos = page[bfprop + 10]; } UT_DEBUGMSG((" ftc = %d\n", ftc)); UT_DEBUGMSG((" hps = %d\n", hps)); UT_DEBUGMSG((" fBold = %d\n", fBold)); UT_DEBUGMSG((" fItalic = %d\n", fItalic)); UT_DEBUGMSG((" fUline = %d\n", fUline)); UT_DEBUGMSG((" hpsPos = %d\n", hpsPos)); if (ftc >= wri_fonts_count) { UT_WARNINGMSG(("read_txt: Wrong font code.\n")); ftc = wri_fonts_count - 1; } if (from < fcLim && to >= fcFirst) { UT_LocaleTransactor lt(LC_NUMERIC, "C"); UT_String_sprintf(properties, "font-weight:%s", fBold ? "bold" : "normal"); if (hps != 24) { UT_String_sprintf(tmp, "; font-size:%dpt", hps / 2); properties += tmp; } if (fItalic) properties += "; font-style:italic"; if (fUline) properties += "; text-decoration:underline"; if (hpsPos) { UT_String_sprintf(tmp, "; text-position:%s", hpsPos < 128 ? "superscript" : "subscript"); properties += tmp; } if (wri_fonts_count) { UT_String_sprintf(tmp, "; font-family:%s", wri_fonts[ftc].name); properties += tmp; } if (wri_fonts[ftc].codepage != currcp /*sic!*/) { set_codepage(wri_fonts[ftc].codepage); currcp = wri_fonts[ftc].codepage; } mText.clear(); UT_DEBUGMSG((" Text: ")); while (fcFirst <= from && from < fcLim && from <= to && from - 0x80 < dataLen) translate_char(*mData.getPointer(from++ - 0x80), mText); UT_DEBUGMSG(("\n")); // new attributes, only if there was text if (mText.size() > 0) { const gchar *attributes[5]; const UT_UCS4Char *text = mText.ucs4_str(), *p = text; size_t txtLen; UT_DEBUGMSG((" Conv: %s\n", mText.utf8_str())); attributes[0] = PT_PROPS_ATTRIBUTE_NAME; attributes[1] = properties.c_str(); attributes[2] = NULL; appendFmt(attributes); // check for page number (should only be in header or footer) while (*p && *p != (UT_UCS4Char) 0x01) p++; if (*p) { if (p - text) appendSpan(text, p - text); attributes[2] = PT_TYPE_ATTRIBUTE_NAME; attributes[3] = "page_number"; attributes[4] = NULL; appendObject(PTO_Field, attributes); txtLen = mText.size() - (p - text) - 1; p++; } else { txtLen = mText.size(); p = text; } if (txtLen) appendSpan(p, txtLen); } } fcFirst = fcLim; if (fcLim >= fcMac || fcFirst > to) { UT_DEBUGMSG((" CHP-FODs end, fcLim (%d) >= fcMac (%d) or fcFirst (%d) > to (%d)\n", fcLim, fcMac, fcFirst, to)); return true; } } }
/* || Standard main */ int main( int argc, char *argv[] ) { char *pgmname; /* prog name in host format */ char *pgm; /* less any extension (.ext) */ char msgbuf[512]; /* message build work area */ FILE *outf; int rc; int i; char pathname[MAX_PATH]; char *strtok_str = NULL; /* Set program name */ if ( argc > 0 ) { if ( strlen(argv[0]) == 0 ) { pgmname = strdup( UTILITY_NAME ); } else { char path[MAX_PATH]; #if defined( _MSVC_ ) GetModuleFileName( NULL, path, MAX_PATH ); #else strncpy( path, argv[0], sizeof( path ) ); #endif pgmname = strdup(basename(path)); #if !defined( _MSVC_ ) strncpy( path, argv[0], sizeof(path) ); #endif } } else { pgmname = strdup( UTILITY_NAME ); } pgm = strtok_r( strdup(pgmname), ".", &strtok_str); INITIALIZE_UTILITY( pgmname ); /* Display the program identification message */ MSGBUF( msgbuf, MSG_C( HHC02499, "I", pgm, "Extract Files from AWS, HET or FAKETAPE" ) ); display_version (stderr, msgbuf+10, FALSE); /* || Process option switches */ while( TRUE ) { rc = getopt( argc, argv, "abhnsu" ); if( rc == -1 ) { break; } switch( rc ) { case 'a': opts.flags |= O_ASCII; set_codepage(NULL); break; case 'h': usage( pgm ); exit( 1 ); break; case 'n': opts.flags |= O_NL; break; case 's': opts.flags |= O_STRIP; break; case 'u': opts.flags |= O_UNBLOCK; break; default: usage( pgm ); exit( 1 ); break; } } /* || Calc number of non-switch arguments */ argc -= optind; /* || We must have at least the first 3 parms */ if(argc < 3) { if ( argc > 1 ) WRMSG( HHC02446, "E" ); usage( pgm ); exit( 1 ); } hostpath( pathname, argv[ optind ], sizeof(pathname) ); opts.ifile = strdup( pathname ); if ( ( rc = (int)strlen( opts.ifile ) ) > 4 && ( rc = strcasecmp( &opts.ifile[rc-4], ".fkt" ) ) == 0 ) { opts.faketape = TRUE; } hostpath( pathname, argv[ optind + 1 ], sizeof(pathname) ); opts.ofile = strdup( pathname ); opts.fileno = atoi( argv[ optind + 2 ] ); if( opts.fileno == 0 || opts.fileno > 9999 ) { char msgbuf[20]; MSGBUF( msgbuf, "%d", opts.fileno ); WRMSG( HHC02205, "E", msgbuf, "; file number must be within the range of 1 to 9999" ); exit( 1 ); } /* || If NL tape, then we require the DCB attributes */ if( opts.flags & O_NL ) { if( argc != 6 ) { WRMSG( HHC02750, "E" ); exit( 1 ); } } /* || If specified, get the DCB attributes */ if( argc > 3 ) { /* || Must have only three */ if( argc != 6 ) { usage( pgm ); exit( 1 ); } /* || Lookup the specified RECFM in our table */ opts.recfm = 0; for( i = 0 ; i < (int)VALFMCNT ; i++ ) { if( strcasecmp( argv[ optind + 3 ], valfm[ i ].recfm ) == 0 ) { opts.recfm = valfm[ i ].fmt; break; } } /* || If we didn't find a match, show the user what the valid ones are */ if( opts.recfm == 0) { char msgbuf[512] = ""; char msgbuf2[64] = ""; char msgbuf3[16] = ""; char msgbuf4[128] = ""; /* || Dump out the valid RECFMs */ MSGBUF( msgbuf, MSG( HHC02751, "I" ) ); for( i = 0 ; i < (int)VALFMCNT ; i++ ) { MSGBUF( msgbuf3, " %-4.4s", valfm[ i ].recfm ); if( ( ( i + 1 ) % 3 ) == 0 ) { strcat( msgbuf2, msgbuf3 ); MSGBUF( msgbuf4, MSG( HHC02752, "I", msgbuf2 ) ); strcat( msgbuf, msgbuf4 ); msgbuf2[0] = 0; } else { strcat( msgbuf2, msgbuf3 ); } } printf( "%s", msgbuf ); exit( 1 ); } /* || Get the record length */ opts.lrecl = atoi( argv[ optind + 4 ] ); /* || Get and validate the blksize */ opts.blksize = atoi( argv[ optind + 5 ] ); if( opts.blksize == 0 ) { WRMSG( HHC02205, "E", "0", "; block size can't be zero" ); exit( 1 ); } } /* || Open the tape file */ if ( opts.faketape ) rc = fet_open( &opts.fetb, opts.ifile, FETOPEN_READONLY ); else rc = het_open( &opts.hetb, opts.ifile, HETOPEN_READONLY ); if( rc >= 0 ) { /* || Get memory for the tape buffer */ blkptr = malloc( HETMAX_BLOCKSIZE ); if( blkptr != NULL ) { /* || Open the output file */ outf = fopen( opts.ofile, "wb" ); if( outf != NULL ) { /* || Go extract the file from the tape */ rc = getfile( outf ); /* || Close the output file */ fclose( outf ); } /* || Free the buffer memory */ free( blkptr ); } } else { if ( opts.faketape ) WRMSG( HHC00075, "E", "fet_open()", fet_error( rc ) ); else WRMSG( HHC00075, "E", "het_open()", het_error( rc ) ); } /* || Close the tape file */ if ( opts.faketape ) fet_close( &opts.fetb ); else het_close( &opts.hetb ); return 0; }
void settings_apply(bool read_disk) { #ifdef HAVE_LCD_BITMAP int rc; #endif CHART(">set_codepage"); set_codepage(global_settings.default_codepage); CHART("<set_codepage"); sound_settings_apply(); #ifdef HAVE_DISK_STORAGE audio_set_buffer_margin(global_settings.buffer_margin); #endif #ifdef HAVE_LCD_CONTRAST lcd_set_contrast(global_settings.contrast); #endif lcd_scroll_speed(global_settings.scroll_speed); #ifdef HAVE_REMOTE_LCD lcd_remote_set_contrast(global_settings.remote_contrast); lcd_remote_set_invert_display(global_settings.remote_invert); #ifdef HAVE_LCD_FLIP lcd_remote_set_flip(global_settings.remote_flip_display); #endif lcd_remote_scroll_speed(global_settings.remote_scroll_speed); lcd_remote_scroll_step(global_settings.remote_scroll_step); lcd_remote_scroll_delay(global_settings.remote_scroll_delay); lcd_remote_bidir_scroll(global_settings.remote_bidir_limit); #ifdef HAVE_REMOTE_LCD_TICKING lcd_remote_emireduce(global_settings.remote_reduce_ticking); #endif remote_backlight_set_timeout(global_settings.remote_backlight_timeout); #if CONFIG_CHARGING remote_backlight_set_timeout_plugged(global_settings.remote_backlight_timeout_plugged); #endif #ifdef HAS_REMOTE_BUTTON_HOLD remote_backlight_set_on_button_hold(global_settings.remote_backlight_on_button_hold); #endif #endif /* HAVE_REMOTE_LCD */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS backlight_set_brightness(global_settings.brightness); #endif #ifdef HAVE_BACKLIGHT backlight_set_timeout(global_settings.backlight_timeout); #if CONFIG_CHARGING backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); #endif #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING) \ || defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING) backlight_set_fade_in(global_settings.backlight_fade_in); backlight_set_fade_out(global_settings.backlight_fade_out); #endif #endif #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS buttonlight_set_brightness(global_settings.buttonlight_brightness); #endif #ifdef HAVE_BUTTON_LIGHT buttonlight_set_timeout(global_settings.buttonlight_timeout); #endif #ifdef HAVE_DISK_STORAGE storage_spindown(global_settings.disk_spindown); #endif #if (CONFIG_CODEC == MAS3507D) && (CONFIG_PLATFORM & PLATFORM_NATIVE) dac_line_in(global_settings.line_in); #endif set_poweroff_timeout(global_settings.poweroff); if (global_settings.sleeptimer_on_startup) set_sleeptimer_duration(global_settings.sleeptimer_duration); set_keypress_restarts_sleep_timer( global_settings.keypress_restarts_sleeptimer); #if defined(BATTERY_CAPACITY_INC) && BATTERY_CAPACITY_INC > 0 /* only call if it's really exchangable */ set_battery_capacity(global_settings.battery_capacity); #endif #if BATTERY_TYPES_COUNT > 1 set_battery_type(global_settings.battery_type); #endif #ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_INVERT lcd_set_invert_display(global_settings.invert); #endif #ifdef HAVE_LCD_FLIP lcd_set_flip(global_settings.flip_display); button_set_flip(global_settings.flip_display); #endif lcd_update(); /* refresh after flipping the screen */ settings_apply_pm_range(); peak_meter_init_times( global_settings.peak_meter_release, global_settings.peak_meter_hold, global_settings.peak_meter_clip_hold); #endif #ifdef HAVE_SPEAKER audiohw_enable_speaker(global_settings.speaker_enabled); #endif if (read_disk) { char buf[MAX_PATH]; #ifdef HAVE_LCD_BITMAP /* fonts need to be loaded before the WPS */ if (global_settings.font_file[0] && global_settings.font_file[0] != '-') { int font_ui = screens[SCREEN_MAIN].getuifont(); const char* loaded_font = font_filename(font_ui); snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", global_settings.font_file); if (!loaded_font || strcmp(loaded_font, buf)) { CHART2(">font_load ", global_settings.font_file); if (font_ui >= 0) font_unload(font_ui); rc = font_load_ex(buf, 0, global_settings.glyphs_to_cache); CHART2("<font_load ", global_settings.font_file); screens[SCREEN_MAIN].setuifont(rc); screens[SCREEN_MAIN].setfont(rc); } } #ifdef HAVE_REMOTE_LCD if ( global_settings.remote_font_file[0] && global_settings.remote_font_file[0] != '-') { int font_ui = screens[SCREEN_REMOTE].getuifont(); const char* loaded_font = font_filename(font_ui); snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", global_settings.remote_font_file); if (!loaded_font || strcmp(loaded_font, buf)) { CHART2(">font_load_remoteui ", global_settings.remote_font_file); if (font_ui >= 0) font_unload(font_ui); rc = font_load(buf); CHART2("<font_load_remoteui ", global_settings.remote_font_file); screens[SCREEN_REMOTE].setuifont(rc); screens[SCREEN_REMOTE].setfont(rc); } } #endif if ( global_settings.kbd_file[0] && global_settings.kbd_file[0] != '-') { snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd", global_settings.kbd_file); CHART(">load_kbd"); load_kbd(buf); CHART("<load_kbd"); } else load_kbd(NULL); #endif /* HAVE_LCD_BITMAP */ if ( global_settings.lang_file[0]) { snprintf(buf, sizeof buf, LANG_DIR "/%s.lng", global_settings.lang_file); CHART(">lang_core_load"); lang_core_load(buf); CHART("<lang_core_load"); } CHART(">talk_init"); talk_init(); /* use voice of same language */ CHART("<talk_init"); /* load the icon set */ CHART(">icons_init"); icons_init(); CHART("<icons_init"); #ifdef HAVE_LCD_COLOR if (global_settings.colors_file[0] && global_settings.colors_file[0] != '-') { CHART(">read_color_theme_file"); read_color_theme_file(); CHART("<read_color_theme_file"); } #endif } #ifdef HAVE_LCD_COLOR screens[SCREEN_MAIN].set_foreground(global_settings.fg_color); screens[SCREEN_MAIN].set_background(global_settings.bg_color); #endif #ifdef HAVE_LCD_BITMAP lcd_scroll_step(global_settings.scroll_step); gui_list_screen_scroll_step(global_settings.screen_scroll_step); gui_list_screen_scroll_out_of_view(global_settings.offset_out_of_view); #endif lcd_bidir_scroll(global_settings.bidir_limit); lcd_scroll_delay(global_settings.scroll_delay); #ifdef HAVE_PLAY_FREQ settings_apply_play_freq(global_settings.play_frequency, false); #endif #if CONFIG_CODEC == SWCODEC #ifdef HAVE_CROSSFADE audio_set_crossfade(global_settings.crossfade); #endif replaygain_update(); dsp_set_crossfeed_type(global_settings.crossfeed); dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain); dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain, global_settings.crossfeed_hf_attenuation, global_settings.crossfeed_hf_cutoff); /* Configure software equalizer, hardware eq is handled in audio_init() */ dsp_eq_enable(global_settings.eq_enabled); dsp_set_eq_precut(global_settings.eq_precut); for(int i = 0; i < EQ_NUM_BANDS; i++) { dsp_set_eq_coefs(i, &global_settings.eq_band_settings[i]); } dsp_dither_enable(global_settings.dithering_enabled); #ifdef HAVE_PITCHCONTROL dsp_timestretch_enable(global_settings.timestretch_enabled); #endif dsp_set_compressor(&global_settings.compressor_settings); #endif #ifdef HAVE_SPDIF_POWER spdif_power_enable(global_settings.spdif_enable); #endif #ifdef HAVE_BACKLIGHT set_backlight_filter_keypress(global_settings.bl_filter_first_keypress); #ifdef HAVE_REMOTE_LCD set_remote_backlight_filter_keypress(global_settings.remote_bl_filter_first_keypress); #endif #ifdef HAS_BUTTON_HOLD backlight_set_on_button_hold(global_settings.backlight_on_button_hold); #endif #ifdef HAVE_LCD_SLEEP_SETTING lcd_set_sleep_after_backlight_off(global_settings.lcd_sleep_after_backlight_off); #endif #endif /* HAVE_BACKLIGHT */ #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING touchpad_set_sensitivity(global_settings.touchpad_sensitivity); #endif #ifdef HAVE_TOUCHPAD_DEADZONE touchpad_set_deadzone(global_settings.touchpad_deadzone); #endif #ifdef HAVE_USB_CHARGING_ENABLE usb_charging_enable(global_settings.usb_charging); #endif #ifdef HAVE_TOUCHSCREEN touchscreen_set_mode(global_settings.touch_mode); memcpy(&calibration_parameters, &global_settings.ts_calibration_data, sizeof(struct touchscreen_parameter)); #endif /* This should stay last */ #if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC enc_global_settings_apply(); #endif #ifdef HAVE_LCD_BITMAP /* already called with THEME_STATUSBAR in settings_apply_skins() */ CHART(">viewportmanager_theme_changed"); viewportmanager_theme_changed(THEME_UI_VIEWPORT|THEME_LANGUAGE|THEME_BUTTONBAR); CHART("<viewportmanager_theme_changed"); #endif }
/*-------------------------------------------------------------------*/ DLL_EXPORT int impl(int argc, char *argv[]) { char *cfgfile; /* -> Configuration filename */ char pathname[MAX_PATH]; /* work area for filenames */ #if defined ( OPTION_LOCK_CONFIG_FILE ) int fd_cfg = -1; /* fd for config file */ #if !defined ( _MSVC_ ) struct flock fl_cfg; /* file lock for conf file */ #endif #endif int c; /* Work area for getopt */ int arg_error = 0; /* 1=Invalid arguments */ char *msgbuf; /* */ int msgnum; /* */ int msgcnt; /* */ TID rctid; /* RC file thread identifier */ TID logcbtid; /* RC file thread identifier */ int rc; #if defined(EXTERNALGUI) int e_gui = FALSE; /* EXTERNALGUI parm */ #endif #if defined(OPTION_DYNAMIC_LOAD) #define MAX_DLL_TO_LOAD 50 char *dll_load[MAX_DLL_TO_LOAD]; /* Pointers to modnames */ int dll_count; /* index into array */ #endif /* Seed the pseudo-random number generator */ srand( time(NULL) ); /* Clear the system configuration block */ memset( &sysblk, 0, sizeof( SYSBLK ) ); VERIFY( MLOCK( &sysblk, sizeof( SYSBLK )) == 0); #if defined (_MSVC_) _setmaxstdio(2048); #endif /* Initialize EYE-CATCHERS for SYSBLK */ memset(&sysblk.blknam,SPACE,sizeof(sysblk.blknam)); memset(&sysblk.blkver,SPACE,sizeof(sysblk.blkver)); memset(&sysblk.blkend,SPACE,sizeof(sysblk.blkend)); sysblk.blkloc = swap_byte_U64((U64)((uintptr_t)&sysblk)); memcpy(sysblk.blknam,HDL_NAME_SYSBLK,strlen(HDL_NAME_SYSBLK)); memcpy(sysblk.blkver,HDL_VERS_SYSBLK,strlen(HDL_VERS_SYSBLK)); sysblk.blksiz = swap_byte_U32((U32)sizeof(SYSBLK)); { char buf[32]; MSGBUF( buf, "END%13.13s", HDL_NAME_SYSBLK ); memcpy(sysblk.blkend, buf, sizeof(sysblk.blkend)); } /* Initialize SETMODE and set user authority */ SETMODE(INIT); #if defined(OPTION_DYNAMIC_LOAD) for ( dll_count = 0; dll_count < MAX_DLL_TO_LOAD; dll_count++ ) dll_load[dll_count] = NULL; dll_count = -1; #endif SET_THREAD_NAME("impl"); /* Initialize 'hostinfo' BEFORE display_version is called */ init_hostinfo( &hostinfo ); #ifdef _MSVC_ /* Initialize sockets package */ VERIFY( socket_init() == 0 ); #endif /* Ensure hdl_shut is called in case of shutdown hdl_shut will ensure entries are only called once */ atexit(hdl_shut); if ( argc > 0 ) { int i,len; for (len = 0, i = 0; i < argc; i++ ) len += (int)strlen( (char *)argv[i] ) + 1; sysblk.hercules_cmdline = (char *)malloc( len ); strlcpy( sysblk.hercules_cmdline, argv[0], len ); for ( i = 1; i < argc; i++ ) { strlcat( sysblk.hercules_cmdline, " ", len ); strlcat( sysblk.hercules_cmdline, argv[i], len ); } } /* Set program name */ if ( argc > 0 ) { if ( strlen(argv[0]) == 0 ) { sysblk.hercules_pgmname = strdup("hercules"); sysblk.hercules_pgmpath = strdup(""); } else { char path[MAX_PATH]; #if defined( _MSVC_ ) GetModuleFileName( NULL, path, MAX_PATH ); #else strncpy(path,argv[0],sizeof(path)-1); #endif sysblk.hercules_pgmname = strdup(basename(path)); #if !defined( _MSVC_ ) strncpy(path,argv[0],sizeof(path)-1); #endif sysblk.hercules_pgmpath = strdup(dirname(path)); } } else { sysblk.hercules_pgmname = strdup("hercules"); sysblk.hercules_pgmpath = strdup(""); } #if defined( OPTION_CONFIG_SYMBOLS ) /* These were moved from console.c to make them available sooner */ set_symbol( "VERSION", VERSION); set_symbol( "BDATE", __DATE__ ); set_symbol( "BTIME", __TIME__ ); { char num_procs[64]; if ( hostinfo.num_packages != 0 && hostinfo.num_physical_cpu != 0 && hostinfo.num_logical_cpu != 0 ) { MSGBUF( num_procs, "LP=%d, Cores=%d, CPUs=%d", hostinfo.num_logical_cpu, hostinfo.num_physical_cpu, hostinfo.num_packages ); } else { if ( hostinfo.num_procs > 1 ) MSGBUF( num_procs, "MP=%d", hostinfo.num_procs ); else if ( hostinfo.num_procs == 1 ) strlcpy( num_procs, "UP", sizeof(num_procs) ); else strlcpy( num_procs, "", sizeof(num_procs) ); } set_symbol( "HOSTNAME", hostinfo.nodename ); set_symbol( "HOSTOS", hostinfo.sysname ); set_symbol( "HOSTOSREL", hostinfo.release ); set_symbol( "HOSTOSVER", hostinfo.version ); set_symbol( "HOSTARCH", hostinfo.machine ); set_symbol( "HOSTNUMCPUS", num_procs ); } set_symbol( "MODNAME", sysblk.hercules_pgmname ); set_symbol( "MODPATH", sysblk.hercules_pgmpath ); #endif // defined( OPTION_CONFIG_SYMBOLS ) sysblk.sysgroup = DEFAULT_SYSGROUP; sysblk.msglvl = DEFAULT_MLVL; /* Defaults to TERSE and DEVICES */ /* set default console port address */ sysblk.cnslport = strdup("3270"); /* set default tape autoinit value to OFF */ sysblk.noautoinit = TRUE; /* default for system dasd cache is on */ sysblk.dasdcache = TRUE; #if defined(OPTION_MSGCLR) || defined(OPTION_MSGHLD) /* set default error message display (emsg) */ sysblk.emsg = EMSG_ON; #endif #if defined( OPTION_SHUTDOWN_CONFIRMATION ) /* set default quit timeout value (also ssd) */ sysblk.quitmout = QUITTIME_PERIOD; #endif /* Default command separator to off (NULL) */ sysblk.cmdsep = NULL; #if defined(_FEATURE_SYSTEM_CONSOLE) /* set default for scpecho to TRUE */ sysblk.scpecho = TRUE; /* set fault for scpimply to FALSE */ sysblk.scpimply = FALSE; #endif /* set default system state to reset */ sysblk.sys_reset = TRUE; /* set default SHCMDOPT enabled */ sysblk.shcmdopt = SHCMDOPT_ENABLE + SHCMDOPT_DIAG8; /* Save process ID */ sysblk.hercules_pid = getpid(); /* Save thread ID of main program */ sysblk.impltid = thread_id(); /* Save TOD of when we were first IMPL'ed */ time( &sysblk.impltime ); /* Set to LPAR mode with LPAR 1, LPAR ID of 01, and CPUIDFMT 0 */ sysblk.lparmode = 1; /* LPARNUM 1 # LPAR ID 01 */ sysblk.lparnum = 1; /* ... */ sysblk.cpuidfmt = 0; /* CPUIDFMT 0 */ sysblk.operation_mode = om_mif; /* Default to MIF operaitons */ /* set default CPU identifier */ sysblk.cpumodel = 0x0586; sysblk.cpuversion = 0xFD; sysblk.cpuserial = 0x000001; sysblk.cpuid = createCpuId(sysblk.cpumodel, sysblk.cpuversion, sysblk.cpuserial, 0); /* set default Program Interrupt Trace to NONE */ sysblk.pgminttr = OS_NONE; sysblk.timerint = DEF_TOD_UPDATE_USECS; /* set default thread priorities */ sysblk.hercprio = DEFAULT_HERCPRIO; sysblk.todprio = DEFAULT_TOD_PRIO; sysblk.cpuprio = DEFAULT_CPU_PRIO; sysblk.devprio = DEFAULT_DEV_PRIO; sysblk.srvprio = DEFAULT_SRV_PRIO; /* Cap the default priorities at zero if setuid not available */ #if !defined( _MSVC_ ) #if !defined(NO_SETUID) if (sysblk.suid) #endif { if (sysblk.hercprio < 0) sysblk.hercprio = 0; if (sysblk.todprio < 0) sysblk.todprio = 0; if (sysblk.cpuprio < 0) sysblk.cpuprio = 0; if (sysblk.devprio < 0) sysblk.devprio = 0; if (sysblk.srvprio < 0) sysblk.srvprio = 0; } #endif /* set default console keep alive values */ sysblk.kaidle = KEEPALIVE_IDLE_TIME; sysblk.kaintv = KEEPALIVE_PROBE_INTERVAL; sysblk.kacnt = KEEPALIVE_PROBE_COUNT; #if defined(_FEATURE_ECPSVM) sysblk.ecpsvm.available = 0; sysblk.ecpsvm.level = 20; #endif #ifdef PANEL_REFRESH_RATE sysblk.panrate = PANEL_REFRESH_RATE_SLOW; #endif #if defined( OPTION_SHUTDOWN_CONFIRMATION ) /* Set the quitmout value */ sysblk.quitmout = QUITTIME_PERIOD; /* quit timeout value */ #endif #if defined(OPTION_SHARED_DEVICES) sysblk.shrdport = 0; #endif #ifdef OPTION_MSGHLD /* Set the default timeout value */ sysblk.keep_timeout_secs = 120; #endif #if defined(OPTION_CONFIG_SYMBOLS) && defined(OPTION_BUILTIN_SYMBOLS) /* setup defaults for BUILTIN symbols */ { char buf[8]; set_symbol("LPARNAME", str_lparname()); set_symbol("LPARNUM", "1"); set_symbol("CPUIDFMT", "0"); MSGBUF( buf, "%06X", sysblk.cpuserial ); set_symbol( "CPUSERIAL", buf ); MSGBUF( buf, "%04X", sysblk.cpumodel ); set_symbol( "CPUMODEL", buf ); } #endif /* defined(OPTION_CONFIG_SYMBOLS) && defined(OPTION_BUILTIN_SYMBOLS */ #if defined(_FEATURE_CMPSC_ENHANCEMENT_FACILITY) sysblk.zpbits = DEF_CMPSC_ZP_BITS; #endif /* Initialize locks, conditions, and attributes */ initialize_lock (&sysblk.config); initialize_lock (&sysblk.todlock); initialize_lock (&sysblk.mainlock); sysblk.mainowner = LOCK_OWNER_NONE; initialize_lock (&sysblk.intlock); initialize_lock (&sysblk.iointqlk); sysblk.intowner = LOCK_OWNER_NONE; initialize_lock (&sysblk.sigplock); initialize_lock (&sysblk.mntlock); initialize_lock (&sysblk.scrlock); initialize_lock (&sysblk.crwlock); initialize_lock (&sysblk.ioqlock); initialize_condition (&sysblk.ioqcond); #if defined(OPTION_CMDSER) initialize_lock (&sysblk.cmdlock); initialize_condition (&sysblk.cmdcond); #endif /*defined(OPTION_CMDSER)*/ #ifdef FEATURE_MESSAGE_SECURITY_ASSIST_EXTENSION_3 /* Initialize the wrapping key registers lock */ initialize_rwlock(&sysblk.wklock); #endif /* Initialize thread creation attributes so all of hercules can use them at any time when they need to create_thread */ initialize_detach_attr (DETACHED); initialize_join_attr (JOINABLE); initialize_condition (&sysblk.cpucond); { int i; for (i = 0; i < MAX_CPU_ENGINES; i++) initialize_lock (&sysblk.cpulock[i]); } initialize_condition (&sysblk.sync_cond); initialize_condition (&sysblk.sync_bc_cond); /* Copy length for regs */ sysblk.regs_copy_len = (int)((uintptr_t)&sysblk.dummyregs.regs_copy_end - (uintptr_t)&sysblk.dummyregs); /* Set the daemon_mode flag indicating whether we running in background/daemon mode or not (meaning both stdout/stderr are redirected to a non-tty device). Note that this flag needs to be set before logger_init gets called since the logger_logfile_write function relies on its setting. */ sysblk.daemon_mode = !isatty(STDERR_FILENO) && !isatty(STDOUT_FILENO); /* Initialize the logmsg pipe and associated logger thread. This causes all subsequent logmsg's to be redirected to the logger facility for handling by virtue of stdout/stderr being redirected to the logger facility. */ logger_init(); /* Setup the initial codepage */ set_codepage(NULL); /* Now display the version information again after logger_init has been called so that either the panel display thread or the external gui can see the version which was previously possibly only displayed to the actual physical screen the first time we did it further above (depending on whether we're running in daemon_mode (external gui mode) or not). This it the call that the panel thread or the one the external gui actually "sees". The first call further above wasn't seen by either since it was issued before logger_init was called and thus got written directly to the physical screen whereas this one will be inter- cepted and handled by the logger facility thereby allowing the panel thread or external gui to "see" it and thus display it. */ display_version (stdout, "Hercules", TRUE); #ifdef EXTERNALGUI if (argc >= 1 && strncmp(argv[argc-1],"EXTERNALGUI",11) == 0) { e_gui = TRUE; argc--; } #endif #if !defined(WIN32) && !defined(HAVE_STRERROR_R) strerror_r_init(); #endif #if defined(OPTION_SCSI_TAPE) initialize_lock ( &sysblk.stape_lock ); initialize_condition ( &sysblk.stape_getstat_cond ); InitializeListHead ( &sysblk.stape_mount_link ); InitializeListHead ( &sysblk.stape_status_link ); #endif /* defined(OPTION_SCSI_TAPE) */ /* Get name of configuration file or default to hercules.cnf */ if(!(cfgfile = getenv("HERCULES_CNF"))) cfgfile = "hercules.cnf"; /* Process the command line options */ { #define HERCULES_BASE_OPTS "hf:r:db:v" #define HERCULES_SYM_OPTS "" #define HERCULES_HDL_OPTS "" #if defined(OPTION_CONFIG_SYMBOLS) #undef HERCULES_SYM_OPTS #define HERCULES_SYM_OPTS "s:" #endif #if defined(OPTION_DYNAMIC_LOAD) #undef HERCULES_HDL_OPTS #define HERCULES_HDL_OPTS "p:l:" #endif #define HERCULES_OPTS_STRING HERCULES_BASE_OPTS HERCULES_SYM_OPTS HERCULES_HDL_OPTS #if defined(HAVE_GETOPT_LONG) static struct option longopts[] = { { "help", no_argument, NULL, 'h' }, { "config", required_argument, NULL, 'f' }, { "rcfile", required_argument, NULL, 'r' }, { "daemon", no_argument, NULL, 'd' }, { "herclogo", required_argument, NULL, 'b' }, { "verbose", no_argument, NULL, 'v' }, #if defined(OPTION_CONFIG_SYMBOLS) { "defsym", required_argument, NULL, 's' }, #endif #if defined(OPTION_DYNAMIC_LOAD) { "modpath", required_argument, NULL, 'p' }, { "ldmod", required_argument, NULL, 'l' }, #endif { NULL, 0, NULL, 0 } }; while ((c = getopt_long( argc, argv, HERCULES_OPTS_STRING, longopts, NULL )) != EOF) #else while ((c = getopt( argc, argv, HERCULES_OPTS_STRING )) != EOF) #endif { switch (c) { case 'h': arg_error = 1; break; case 'f': cfgfile = optarg; break; case 'r': rcname = optarg; break; #if defined(OPTION_CONFIG_SYMBOLS) case 's': { char *sym = NULL; char *value = NULL; char *strtok_str = NULL; if ( strlen( optarg ) >= 3 ) { sym = strtok_r( optarg, "=", &strtok_str); value = strtok_r( NULL, "=", &strtok_str); if ( sym != NULL && value != NULL ) { int j; for( j = 0; j < (int)strlen( sym ); j++ ) if ( islower( sym[j] ) ) { sym[j] = toupper( sym[j] ); } set_symbol(sym, value); } else WRMSG(HHC01419, "E" ); } else WRMSG(HHC01419, "E"); } break; #endif /* defined(OPTION_CONFIG_SYMBOLS) */ #if defined(OPTION_DYNAMIC_LOAD) case 'p': if(optarg) hdl_setpath(strdup(optarg), FALSE); break; case 'l': { char *dllname, *strtok_str = NULL; for(dllname = strtok_r(optarg,", ",&strtok_str); dllname; dllname = strtok_r(NULL,", ",&strtok_str)) { if (dll_count < MAX_DLL_TO_LOAD - 1) dll_load[++dll_count] = strdup(dllname); else { WRMSG(HHC01406, "W", MAX_DLL_TO_LOAD); break; } } } break; #endif /* defined(OPTION_DYNAMIC_LOAD) */ case 'b': sysblk.logofile = optarg; break; case 'v': sysblk.msglvl |= MLVL_VERBOSE; break; case 'd': sysblk.daemon_mode = 1; break; default: arg_error = 1; } /* end switch(c) */ } /* end while */ } /* end Process the command line options */ /* Treat filename None as special */ if(!strcasecmp(cfgfile,"None")) cfgfile = NULL; if (optind < argc) arg_error = 1; /* Terminate if invalid arguments were detected */ if (arg_error) { char pgm[MAX_PATH]; char* strtok_str = NULL; strncpy(pgm, sysblk.hercules_pgmname, sizeof(pgm)); /* Show them all of our command-line arguments... */ WRMSG (HHC01414, "S", ""); // (blank line) WRMSG (HHC01414, "S", ""); // (blank line) #if defined(OPTION_DYNAMIC_LOAD) // "Usage: %s [-f config-filename] [-d] [-b logo-filename] [-s sym=val]%s [> logfile]" WRMSG (HHC01407, "S", strtok_r(pgm,".",&strtok_str), " [-p dyn-load-dir] [[-l dynmod-to-load]...]"); #else WRMSG (HHC01407, "S", strtok_r(pgm,".", &strtok_str), ""); #endif /* defined(OPTION_DYNAMIC_LOAD) */ WRMSG (HHC01414, "S", ""); // (blank line) WRMSG (HHC01414, "S", ""); // (blank line) fflush(stderr); fflush(stdout); usleep(100000); return(1); } /* Initialize runtime opcode tables */ init_opcode_tables(); #if defined(OPTION_DYNAMIC_LOAD) /* Initialize the hercules dynamic loader */ hdl_main(); /* Load modules requested at startup */ if (dll_count >= 0) { int hl_err = FALSE; for ( dll_count = 0; dll_count < MAX_DLL_TO_LOAD; dll_count++ ) { if (dll_load[dll_count] != NULL) { if (hdl_load(dll_load[dll_count], HDL_LOAD_DEFAULT) != 0) { hl_err = TRUE; } free(dll_load[dll_count]); } else break; } if (hl_err) { usleep(10000); // give logger time to issue error message WRMSG(HHC01408, "S"); delayed_exit(-1); return(1); } } #endif /* defined(OPTION_DYNAMIC_LOAD) */ #ifdef EXTERNALGUI /* Set GUI flag if specified as final argument */ if (e_gui) { #if defined(OPTION_DYNAMIC_LOAD) if (hdl_load("dyngui",HDL_LOAD_DEFAULT) != 0) { usleep(10000); /* (give logger thread time to issue preceding HHC01516E message) */ WRMSG(HHC01409, "S"); delayed_exit(-1); return(1); } #endif /* defined(OPTION_DYNAMIC_LOAD) */ } #endif /*EXTERNALGUI*/ /* Register the SIGINT handler */ if ( signal (SIGINT, sigint_handler) == SIG_ERR ) { WRMSG(HHC01410, "S", "SIGINT", strerror(errno)); delayed_exit(-1); return(1); } /* Register the SIGTERM handler */ if ( signal (SIGTERM, sigterm_handler) == SIG_ERR ) { WRMSG(HHC01410, "S", "SIGTERM", strerror(errno)); delayed_exit(-1); return(1); } #if defined( _MSVC_ ) /* Register the Window console ctrl handlers */ if (!IsDebuggerPresent()) { if (!SetConsoleCtrlHandler( console_ctrl_handler, TRUE )) { WRMSG( HHC01410, "S", "Console-ctrl", strerror( errno )); delayed_exit(-1); return(1); } } #endif #if defined(HAVE_DECL_SIGPIPE) && HAVE_DECL_SIGPIPE /* Ignore the SIGPIPE signal, otherwise Hercules may terminate with Broken Pipe error if the printer driver writes to a closed pipe */ if ( signal (SIGPIPE, SIG_IGN) == SIG_ERR ) { WRMSG(HHC01411, "E", strerror(errno)); } #endif { int fds[2]; initialize_lock(&sysblk.cnslpipe_lock); initialize_lock(&sysblk.sockpipe_lock); sysblk.cnslpipe_flag=0; sysblk.sockpipe_flag=0; VERIFY( create_pipe(fds) >= 0 ); sysblk.cnslwpipe=fds[1]; sysblk.cnslrpipe=fds[0]; VERIFY( create_pipe(fds) >= 0 ); sysblk.sockwpipe=fds[1]; sysblk.sockrpipe=fds[0]; } #if !defined(NO_SIGABEND_HANDLER) { struct sigaction sa; sa.sa_sigaction = (void*)&sigabend_handler; #ifdef SA_NODEFER sa.sa_flags = SA_NODEFER; #else sa.sa_flags = 0; #endif if( sigaction(SIGILL, &sa, NULL) || sigaction(SIGFPE, &sa, NULL) || sigaction(SIGSEGV, &sa, NULL) || sigaction(SIGBUS, &sa, NULL) || sigaction(SIGUSR1, &sa, NULL) || sigaction(SIGUSR2, &sa, NULL) ) { WRMSG(HHC01410, "S", "SIGILL/FPE/SEGV/BUS/USR", strerror(errno)); delayed_exit(-1); return(1); } } #endif /*!defined(NO_SIGABEND_HANDLER)*/ if(cfgfile) { /* attempt to get lock on config file */ hostpath(pathname, cfgfile, sizeof(pathname)); #if defined( OPTION_LOCK_CONFIG_FILE ) /* Test that we can get a read the file */ if ( ( fd_cfg = HOPEN( pathname, O_RDONLY, S_IRUSR | S_IRGRP ) ) < 0 ) { if ( errno == EACCES ) { WRMSG( HHC01453, "S", cfgfile, strerror( errno ) ); delayed_exit(-1); return(1); } } else { if ( lseek(fd_cfg, 0L, 2) < 0 ) { if ( errno == EACCES ) { WRMSG( HHC01453, "S", cfgfile, strerror( errno ) ); delayed_exit(-1); return(1); } } close( fd_cfg ); } /* File was not lock, therefore we can proceed */ #endif // OPTION_LOCK_CONFIG_FILE } /* System initialisation time */ sysblk.todstart = hw_clock() << 8; #if !defined(NO_SIGABEND_HANDLER) /* Start the watchdog */ rc = create_thread (&sysblk.wdtid, DETACHED, watchdog_thread, NULL, "watchdog_thread"); if (rc) { WRMSG(HHC00102, "E", strerror(rc)); delayed_exit(-1); return(1); } #endif /*!defined(NO_SIGABEND_HANDLER)*/ if(log_callback) { // 'herclin' called us. IT'S in charge. Create its requested // logmsg intercept callback function and return back to it. rc = create_thread(&logcbtid,DETACHED, log_do_callback,NULL,"log_do_callback"); if (rc) WRMSG(HHC00102, "E", strerror(rc)); return(0); } hdl_adsc("release_config", release_config, NULL); /* Build system configuration */ if ( build_config (cfgfile) ) { delayed_exit(-1); return(1); } /* Start up the RC file processing thread */ rc = create_thread(&rctid,DETACHED, process_rc_file,NULL,"process_rc_file"); if (rc) WRMSG(HHC00102, "E", strerror(rc)); #if defined( OPTION_LOCK_CONFIG_FILE ) if(cfgfile) { if ( ( fd_cfg = HOPEN( pathname, O_RDONLY, S_IRUSR | S_IRGRP ) ) < 0 ) { WRMSG( HHC01432, "S", pathname, "open()", strerror( errno ) ); delayed_exit(-1); return(1); } else { #if defined( _MSVC_ ) if( ( rc = _locking( fd_cfg, _LK_NBRLCK, 1L ) ) < 0 ) { int rc = errno; WRMSG( HHC01454, "S", pathname, "_locking()", strerror( errno ) ); delayed_exit(-1); return(1); } #else fl_cfg.l_type = F_RDLCK; fl_cfg.l_whence = SEEK_SET; fl_cfg.l_start = 0; fl_cfg.l_len = 1; if ( fcntl(fd_cfg, F_SETLK, &fl_cfg) == -1 ) { if (errno == EACCES || errno == EAGAIN) { WRMSG( HHC01432, "S", pathname, "fcntl()", strerror( errno ) ); delayed_exit(-1); return(1); } } #endif } } #endif // OPTION_LOCK_CONFIG_FILE //--------------------------------------------------------------- // The below functions will not return until Hercules is shutdown //--------------------------------------------------------------- /* Activate the control panel */ if(!sysblk.daemon_mode) panel_display (); else { #if defined(OPTION_DYNAMIC_LOAD) if(daemon_task) daemon_task (); else #endif /* defined(OPTION_DYNAMIC_LOAD) */ { /* Tell RC file and HAO threads they may now proceed */ sysblk.panel_init = 1; /* Retrieve messages from logger and write to stderr */ while (1) if((msgcnt = log_read(&msgbuf, &msgnum, LOG_BLOCK))) if(isatty(STDERR_FILENO)) fwrite(msgbuf,msgcnt,1,stderr); } } // ----------------------------------------------------- // *** Hercules has been shutdown (PAST tense) *** // ----------------------------------------------------- #if defined( OPTION_LOCK_CONFIG_FILE ) if(cfgfile) close( fd_cfg ); // release config file lock #endif // OPTION_LOCK_CONFIG_FILE ASSERT( sysblk.shutdown ); // (why else would we be here?!) #ifdef _MSVC_ SetConsoleCtrlHandler(console_ctrl_handler, FALSE); socket_deinit(); #endif #if defined(OPTION_MSGCLR) || defined(OPTION_MSGHLD) if ( sysblk.emsg & EMSG_TEXT ) fprintf(stdout, HHC01412 ); else #endif fprintf(stdout, MSG(HHC01412, "I")); fflush(stdout); usleep(10000); return 0; } /* end function impl */
/* || Standard main */ int main( int argc, char *argv[] ) { char *pgm; /* less any extension (.ext) */ FILE *outf; int rc; int i; char pathname[MAX_PATH]; INITIALIZE_UTILITY( UTILITY_NAME, "Extract Files from AWS, HET or FAKETAPE", &pgm ); /* || Process option switches */ while( TRUE ) { rc = getopt( argc, argv, "abhnsu" ); if( rc == -1 ) { break; } switch( rc ) { case 'a': opts.flags |= O_ASCII; set_codepage(NULL); break; case 'h': usage( pgm ); exit( 1 ); UNREACHABLE_CODE(); case 'n': opts.flags |= O_NL; break; case 's': opts.flags |= O_STRIP; break; case 'u': opts.flags |= O_UNBLOCK; break; default: usage( pgm ); exit( 1 ); UNREACHABLE_CODE(); } } /* || Calc number of non-switch arguments */ argc -= optind; /* || We must have at least the first 3 parms */ if(argc < 3) { if ( argc > 1 ) // "Invalid number of arguments" FWRMSG( stderr, HHC02446, "E" ); usage( pgm ); exit( 1 ); } hostpath( pathname, argv[ optind ], sizeof(pathname) ); opts.ifile = strdup( pathname ); if ( ( rc = (int)strlen( opts.ifile ) ) > 4 && ( rc = strcasecmp( &opts.ifile[rc-4], ".fkt" ) ) == 0 ) { opts.faketape = TRUE; } hostpath( pathname, argv[ optind + 1 ], sizeof(pathname) ); opts.ofile = strdup( pathname ); opts.fileno = atoi( argv[ optind + 2 ] ); if( opts.fileno == 0 || opts.fileno > 9999 ) { char msgbuf[20]; MSGBUF( msgbuf, "%d", opts.fileno ); // "Invalid argument %s%s" FWRMSG( stderr, HHC02205, "S", msgbuf, "; file number must be within the range of 1 to 9999" ); exit( 1 ); } /* || If NL tape, then we require the DCB attributes */ if( opts.flags & O_NL ) { if( argc != 6 ) { // "DCB attributes required for NL tape" FWRMSG( stderr, HHC02750, "S" ); exit( 1 ); } } /* || If specified, get the DCB attributes */ if( argc > 3 ) { /* || Must have only three */ if( argc != 6 ) { usage( pgm ); exit( 1 ); } /* || Lookup the specified RECFM in our table */ opts.recfm = 0; for( i = 0 ; i < (int)VALFMCNT ; i++ ) { if( strcasecmp( argv[ optind + 3 ], valfm[ i ].recfm ) == 0 ) { opts.recfm = valfm[ i ].fmt; break; } } /* || If we didn't find a match, show the user what the valid ones are */ if( opts.recfm == 0) { char msgbuf[512] = ""; char msgbuf2[64] = ""; char msgbuf3[16] = ""; char msgbuf4[128] = ""; /* || Dump out the valid RECFMs */ // "Valid record formats are:" MSGBUF( msgbuf, MSG( HHC02751, "I" ) ); for( i = 0 ; i < (int)VALFMCNT ; i++ ) { MSGBUF( msgbuf3, " %-4.4s", valfm[ i ].recfm ); if( ( ( i + 1 ) % 3 ) == 0 ) { strlcat( msgbuf2, msgbuf3, sizeof(msgbuf2) ); // "%s" MSGBUF( msgbuf4, MSG( HHC02752, "I", msgbuf2 ) ); strlcat( msgbuf, msgbuf4, sizeof(msgbuf) ); msgbuf2[0] = 0; } else { strlcat( msgbuf2, msgbuf3, sizeof(msgbuf2) ); } } printf( "%s", msgbuf ); exit( 1 ); } /* || Get the record length */ opts.lrecl = atoi( argv[ optind + 4 ] ); /* || Get and validate the blksize */ opts.blksize = atoi( argv[ optind + 5 ] ); if( opts.blksize == 0 ) { // "Invalid argument %s%s" FWRMSG( stderr, HHC02205, "S", "0", "; block size can't be zero" ); exit( 1 ); } } /* || Open the tape file */ if ( opts.faketape ) rc = fet_open( &opts.fetb, opts.ifile, FETOPEN_READONLY ); else rc = het_open( &opts.hetb, opts.ifile, HETOPEN_READONLY ); if( rc >= 0 ) { /* || Get memory for the tape buffer */ blkptr = malloc( HETMAX_BLOCKSIZE ); if( blkptr != NULL ) { /* || Open the output file */ outf = fopen( opts.ofile, "wb" ); if( outf != NULL ) { /* || Go extract the file from the tape */ rc = getfile( outf ); /* || Close the output file */ fclose( outf ); } /* || Free the buffer memory */ free( blkptr ); } } else { // "Error in function %s: %s" if ( opts.faketape ) FWRMSG( stderr, HHC00075, "E", "fet_open()", fet_error( rc ) ); else FWRMSG( stderr, HHC00075, "E", "het_open()", het_error( rc ) ); } /* || Close the tape file */ if ( opts.faketape ) fet_close( &opts.fetb ); else het_close( &opts.hetb ); return 0; }
/* * The scanner * */ int mcy_lex(void) { static const WCHAR ustr_dot1[] = { '.', '\n', 0 }; static const WCHAR ustr_dot2[] = { '.', '\r', '\n', 0 }; static int isinit = 0; int ch; if(!isinit) { isinit++; set_codepage(WMC_DEFAULT_CODEPAGE); add_token(tok_keyword, ustr_codepages, tCODEPAGE, 0, NULL, 0); add_token(tok_keyword, ustr_facility, tFACILITY, 0, NULL, 1); add_token(tok_keyword, ustr_facilitynames, tFACNAMES, 0, NULL, 1); add_token(tok_keyword, ustr_language, tLANGUAGE, 0, NULL, 1); add_token(tok_keyword, ustr_languagenames, tLANNAMES, 0, NULL, 1); add_token(tok_keyword, ustr_messageid, tMSGID, 0, NULL, 1); add_token(tok_keyword, ustr_messageidtypedef, tTYPEDEF, 0, NULL, 1); add_token(tok_keyword, ustr_outputbase, tBASE, 0, NULL, 1); add_token(tok_keyword, ustr_severity, tSEVERITY, 0, NULL, 1); add_token(tok_keyword, ustr_severitynames, tSEVNAMES, 0, NULL, 1); add_token(tok_keyword, ustr_symbolicname, tSYMNAME, 0, NULL, 1); add_token(tok_severity, ustr_error, 0x03, 0, NULL, 0); add_token(tok_severity, ustr_warning, 0x02, 0, NULL, 0); add_token(tok_severity, ustr_informational, 0x01, 0, NULL, 0); add_token(tok_severity, ustr_success, 0x00, 0, NULL, 0); add_token(tok_facility, ustr_application, 0xFFF, 0, NULL, 0); add_token(tok_facility, ustr_system, 0x0FF, 0, NULL, 0); add_token(tok_language, ustr_english, 0x409, 437, ustr_msg00001, 0); } empty_unichar_stack(); while(1) { if(want_line) { while((ch = get_unichar()) != '\n') { if(ch == EOF) xyyerror("Unexpected EOF\n"); push_unichar(ch); } newline(); push_unichar(ch); push_unichar(0); if(!unistrcmp(ustr_dot1, get_unichar_stack()) || !unistrcmp(ustr_dot2, get_unichar_stack())) { want_line = 0; /* Reset the codepage to our default after each message */ set_codepage(WMC_DEFAULT_CODEPAGE); return tMSGEND; } mcy_lval.str = xunistrdup(get_unichar_stack()); return tLINE; } ch = get_unichar(); if(ch == EOF) return EOF; if(ch == '\n') { newline(); if(want_nl) { want_nl = 0; return tNL; } continue; } if(isisochar(ch)) { if(want_file) { int n = 0; while(n < 8 && isisochar(ch)) { int t = char_table[ch]; if((t & CH_PUNCT) || !(t & CH_SHORTNAME)) break; push_unichar(ch); n++; ch = get_unichar(); } unget_unichar(ch); push_unichar(0); want_file = 0; mcy_lval.str = xunistrdup(get_unichar_stack()); return tFILE; } if(char_table[ch] & CH_IDENT) { token_t *tok; while(isisochar(ch) && (char_table[ch] & (CH_IDENT|CH_NUMBER))) { push_unichar(ch); ch = get_unichar(); } unget_unichar(ch); push_unichar(0); if(!(tok = lookup_token(get_unichar_stack()))) { mcy_lval.str = xunistrdup(get_unichar_stack()); return tIDENT; } switch(tok->type) { case tok_keyword: return tok->token; case tok_language: codepage = tok->codepage; /* Fall through */ case tok_severity: case tok_facility: mcy_lval.tok = tok; return tTOKEN; default: internal_error(__FILE__, __LINE__, "Invalid token type encountered\n"); } } if(isspace(ch)) /* Ignore space */ continue; if(isdigit(ch)) return scan_number(ch); } switch(ch) { case ':': case '=': case '+': case '(': case ')': return ch; case ';': while(ch != '\n' && ch != EOF) { push_unichar(ch); ch = get_unichar(); } newline(); push_unichar(ch); /* Include the newline */ push_unichar(0); mcy_lval.str = xunistrdup(get_unichar_stack()); return tCOMMENT; default: xyyerror("Invalid character '%c' (0x%04x)\n", isisochar(ch) && isprint(ch) ? ch : '.', ch); } } }