static void get_realnames(char *aliasname, char *firstname, char *lastname, char *comment, char *buffer) { /* FOO - this is not handling enter_string() aborts properly */ sprintf(buffer, catgets(elm_msg_cat, AliasesSet, AliasesEnterLastName, "Enter last name for %s: "), aliasname); PutLine(LINES-2, 0, buffer); enter_string(lastname, SLEN, -1, -1, ESTR_REPLACE); sprintf(buffer, catgets(elm_msg_cat, AliasesSet, AliasesEnterFirstName, "Enter first name for %s: "), aliasname); PutLine(LINES-2, 0, buffer); enter_string(firstname, SLEN, -1, -1, ESTR_REPLACE); if (strlen(lastname) == 0) { if (strlen(firstname) == 0) { strcpy(lastname, aliasname); } else { strcpy(lastname, firstname); *firstname = '\0'; } } sprintf(buffer, catgets(elm_msg_cat, AliasesSet, AliasesEnterComment, "Enter optional comment for %s: "), aliasname); PutLine(LINES-2, 0, buffer); enter_string(comment, SLEN, -1, -1, ESTR_REPLACE); }
int main(void) { char c; char str[20]; enter_string(str); printf("The delete chr is: "); scanf("%c", &c); delete_string(str, c); print_string(str); return 0; }
void main(){ extern enter_string(char str[80]); extern delete_string(char str[],char ch); extern print_string(char str[]); char c; char str[80]; printf("do %d\n",enter_string(str)); scanf("%c",&c); delete_string(str,c); print_string(str); }
int main() {extern void enter_string(char str[]); extern void delete_string(char str[],char ch); extern void print_string(char str[]); // 以上3行声明在本函数中将要调用的已在其他文件中定义的3个函数 char c,str[80]; enter_string(str); // 调用在其他文件中定义的enter_string函数 scanf("%c",&c); delete_string(str,c); // 调用在其他文件中定义的delete_string函数 print_string(str); // 调用在其他文件中定义的print_string函数 return 0; }
int main() { extern void enter_string(char str[]); extern void delete_string(char str[],char ch); extern void printf_string(char str[]); char c,str[80]; enter_string(str); scanf("%c",&c); delete_string(str,c); printf_string(str); return 0; }
void prepare () { reserved_c (); symtree.dbsBalance (); indx = -1; if (!include_strings) { string = ""; enter_string (); } string = NULL; TFloat [TFloat.alloc ()] = 0.0; // often have division by zero if all values zeroed TsInt8 [TsInt8.alloc ()] = include_values ? 0 : 1; intern_sym = c_symbol ("_@@@_", 5); }
static void get_with_expansion(const char *prompt, char *buffer, char *expanded_buffer, const char *sourcebuf) { char savecopy[SLEN]; /** This is used to prompt for a new value of the specified field. If expanded_buffer == NULL then we won't bother trying to expand this puppy out! (sourcebuf could be an initial addition) **/ PutLine(-1, -1, prompt); if (sourcebuf != NULL) { while (!whitespace(*sourcebuf) && *sourcebuf != '\0') sourcebuf++; if (*sourcebuf != '\0') { while (whitespace(*sourcebuf)) sourcebuf++; if (strlen(sourcebuf) > 0) { strcat(buffer, " "); strcat(buffer, sourcebuf); } } } (void) strfcpy(savecopy, buffer, sizeof(savecopy)); if (enter_string(buffer, SLEN, -1, -1, ESTR_UPDATE) < 0) { /* undo */ (void) strcpy(buffer, savecopy); PutLine(-1, -1, prompt); PutLine(-1, -1, buffer); NewLine(); return; } if(expanded_buffer != NULL) { build_address(strip_commas(buffer), expanded_buffer); if(*expanded_buffer != '\0') { if (*prompt != '\n') NewLine(); PutLine(-1, -1, prompt); PutLine(-1, -1, expanded_buffer); } } NewLine(); return; }
// displays the highscore dialog void display_highscore(GAME *game, char *buf, int length) { int lines = 6; // allocate enougth memory char *content = calloc(lines * CONTENT_WIDTH, sizeof(char)); // generate the window contents snprintf(content , CONTENT_WIDTH, "snake length : %i", game->snake.length); snprintf(content + CONTENT_WIDTH , CONTENT_WIDTH, "points : %i", game->highscore); snprintf(content + CONTENT_WIDTH * 2, CONTENT_WIDTH, "time : %lis", game->ended - game->started - game->paused); snprintf(content + CONTENT_WIDTH * 3, CONTENT_WIDTH, "highscore : %i", calculate_score(game->highscore, game->ended - game->started - game->paused)); snprintf(content + CONTENT_WIDTH * 4, CONTENT_WIDTH, "----------------------------------------"); snprintf(content + CONTENT_WIDTH * 5, CONTENT_WIDTH, "enter your name to be added to the highscore"); snprintf(content + CONTENT_WIDTH * 5, CONTENT_WIDTH, "Name: "); // show the dialog enter_string("GAME OVER", content, lines, 8, 7, buf, length); // free the memory free(content); }
void enter_token () { int i; if (CTok.type == IDENT_DUMMY) i = c_symbol (CTok.p, CTok.len); else if (CTok.type == STRING) { string_constant (CTok.p, CTok.len); return; } else if (CTok.type == CONSTANT || CTok.type == CCONSTANT) i = (include_values) ? enter_integer () : INT8BASE; else if (CTok.type == FCONSTANT) i = (include_values) ? enter_float () : FLOATBASE; else i = CTok.type; if (string) { _enter_token ((include_strings) ? enter_string () : STRINGBASE); string = NULL; } _enter_token (i); }
void make_norm () { if (string) _enter_token (enter_string ()); used_builtins (); // C_Ntok = tmpCODE.nr (); CODE = new int [C_Ntok + 3]; tmpCODE.copy (&CODE); CODE [C_Ntok] = FORCEERROR; CODE [C_Ntok + 1] = ';'; CODE [C_Ntok + 2] = FORCEERROR; tmpCODE.destroy (); // C_Syms = new char* [C_Nsyms = symtree.nnodes - nreserved]; symtree.deltree (symtoarray); Filez.freeze (); C_Files = Filez.x; C_Nfiles = Filez.nr; C_Nlines = Linez.nr (); Linez.copy (&C_Lines); Linez.destroy (); C_Strings = new char* [C_Nstrings = strtree.nnodes]; strtree.deltree (strtoarray); // TFloat.copy (&C_Floats); TFloat.destroy (); TsInt8.copy (&C_Chars); TsInt8.destroy (); TsInt16.copy (&C_Shortints); TsInt16.destroy (); TsInt32.copy (&C_Ints); TsInt32.destroy (); TuInt32.copy (&C_Unsigned); TuInt32.destroy (); }
void alias(void) { /* * Work with alias commands... */ char name[NLEN], *address, buffer[SLEN]; char *commap; static int newaliases = 0; int ch, i; int nutitle = 0; int too_long; /* * We're going to try to match the way elm does it at * he main menu. I probably won't be able to use any * main menu routines, but I will "borrow" from them. RLH */ alias_main_state(); /* Save globals for return to main menu */ open_alias_files(FALSE); /* First, read the alias files. RLH */ alias_screen(newaliases); while (1) { redraw = 0; nucurr = 0; nufoot = 0; prompt(nls_Prompt); CleartoEOLN(); ch = GetKey(0); MoveCursor(LINES-3,strlen(nls_Prompt)); CleartoEOS(); dprint(3, (debugfile, "\n-- Alias command: %c\n\n", ch)); switch (ch) { case '?': redraw += alias_help(); break; #ifdef ALLOW_SUBSHELL case '!' : WriteChar('!'); alias_main_state(); /** reload index screen vars **/ redraw += subshell(); alias_main_state(); /** reload alias screen vars **/ break; #endif /* ALLOW_SUBSHELL */ case '$': PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesResync, "Resynchronize aliases...")); /* * Process deletions and then see if we need to * re-run the "newalias" routine. */ if (resync_aliases(newaliases)) { install_aliases(); newaliases = 0; redraw++; } break; case 'a': PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesAddCurrent, "Add address from current message...")); clear_error(); if (add_current_alias()) { newaliases++; nutitle++; } break; case 'c': if (curr_alias > 0) { PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesReplaceCurrent, "Replace current alias in database...")); clear_error(); if (add_alias(TRUE, curr_alias-1)) { newaliases++; nutitle++; } } else { show_error(catgets(elm_msg_cat, AliasesSet, AliasesNoneToReplace, "Warning: no aliases to replace!")); } break; case 'e': PutLine(LINES-3, strlen(nls_Prompt), catgets(elm_msg_cat, AliasesSet, AliasesEdit, "Edit %s..."), ALIAS_TEXT); /* * Process aliases.text for deletions, etc. You * have to do this *before* checking current because * all aliases could be marked for deletion. */ (void) resync_aliases(newaliases); if (edit_aliases_text()) { newaliases = 0; } redraw++; break; case 'm': if (curr_alias > 0) { PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesMail, "Mail...")); redraw += a_sendmsg(); } else { show_error(catgets(elm_msg_cat, AliasesSet, AliasesNoneToMail, "Warning: no aliases to send mail to!")); } break; case 'n': PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesAddNew, "Add a new alias to database...")); clear_error(); if (add_alias(FALSE, -1)) { newaliases++; nutitle++; } break; case 'q': case 'Q': case 'i': case 'I': case 'r': case 'R': PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesAddReturn, "Return to main menu...")); /* * leaving the alias system. Must check for * pending deletes, etc. prompt is set to FALSE * on uppercase letters so that deletions are * NOT queried. */ if (delete_aliases(newaliases, islower(ch))) { install_aliases(); newaliases = 0; } clear_error(); alias_main_state(); /* Done with aliases. */ return; case RETURN: case LINE_FEED: case ' ': case 'v': if (newaliases) { /* Need this ?? */ show_error(catgets(elm_msg_cat, AliasesSet, AliasesNotInstalled, "Warning: new aliases not installed yet!")); } if (curr_alias > 0) { if (aliases[curr_alias-1]->type & GROUP) { PutLine(LINES-1, 0, catgets(elm_msg_cat, AliasesSet, AliasesGroupAlias, "Group alias: %-60.60s"), aliases[curr_alias-1]->address); } else { PutLine(LINES-1, 0, catgets(elm_msg_cat, AliasesSet, AliasesAliasedAddress, "Aliased address: %-60.60s"), aliases[curr_alias-1]->address); } } else { show_error(catgets(elm_msg_cat, AliasesSet, AliasesNoneToView, "Warning: no aliases to view!")); } break; case 'x': case 'X': PutLine(-1, -1, catgets(elm_msg_cat, AliasesSet, AliasesAddReturn, "Return to main menu...")); exit_alias(); clear_error(); alias_main_state(); /* Done with aliases. */ return; case 'f': case 'F': if (curr_alias > 0) { clear_error(); strcpy(name, aliases[curr_alias-1]->alias); if (ch == 'F') { strcpy(buffer, catgets(elm_msg_cat, AliasesSet, AliasesFullyExpanded, "Fully expand alias: ")); PutLine(LINES-2, 0, buffer); if (enter_string(name, sizeof(name), -1, -1, ESTR_REPLACE) < 0 || name[0] == '\0') break; } too_long = FALSE; address = get_alias_address(name, TRUE, &too_long); if (address != NULL) { while (TRUE) { ClearScreen(); PutLine(2,0, catgets(elm_msg_cat, AliasesSet, AliasesAliasedFull, "Aliased address for:\t%s\n\r"), name); i = 4; while (i < LINES-2) { if ((commap = strchr(address, (int)',')) == NULL) { PutLine(i, 4, address); break; } *commap = '\0'; PutLine(i++, 4, address); address = commap+2; } PutLine(LINES-1, 0, catgets(elm_msg_cat, AliasesSet, AliasesPressReturn, "Press <return> to continue.")); (void) ReadCh(); if (commap == NULL) { redraw++; break; } } } else if (! too_long) { show_error(catgets(elm_msg_cat, AliasesSet, AliasesNotFound, "Not found.")); } } else { show_error(catgets(elm_msg_cat, AliasesSet, AliasesNoneToView, "Warning: no aliases to view!")); } break; case KEY_REDRAW: redraw = 1; break; /* * None of the menu specific commands were chosen, therefore * it must be a "motion" command (or an error). */ default : motion(ch); } if (redraw) { /* Redraw screen if necessary */ alias_screen(newaliases); nutitle = 0; } if (nutitle) { /* Redraw title if necessary */ alias_title(newaliases); nutitle = 0; } check_range(); if (nucurr == NEW_PAGE) show_headers(); else if (nucurr == SAME_PAGE) show_current(); else if (nufoot) { if (mini_menu) { MoveCursor(LINES-7, 0); CleartoEOS(); show_alias_menu(); } else { MoveCursor(LINES-4, 0); CleartoEOS(); } show_last_error(); /* for those operations that have to * clear the footer except for a message. */ } } /* BIG while loop... */ }
static int add_alias(int replace, int to_replace) { /* * Add an alias to the user alias text file. If there * are aliases tagged, the user is asked if he wants to * create a group alias from the tagged files. * * Return zero if alias not added in actuality. * * If replace == FALSE, then we will ask for the new * aliasname. * * If replace == TRUE, then we are replacing the alias * denoted by to_replace. * * Note that even if replace == FALSE, if the user types * in the name of a current alias then we can still do * a replacement. */ int i, ans; int tagged = 0; int leftoff = 0; char aliasname[SLEN], firstname[SLEN], lastname[SLEN]; char address1[LONG_STRING], buffer[SLEN]; char comment[LONG_STRING]; char *ch_ptr; /* * See if there are any tagged aliases. */ for (i=0; i < num_aliases; i++) { if (ison(aliases[i]->status, TAGGED)) { if (tagged == 0) leftoff = i; tagged++; } } if (tagged == 1) { /* * There is only on alias tagged. Ask the question * but the default response is NO. */ PutLine(LINES-2,0, catgets(elm_msg_cat, AliasesSet, AliasesOneTagged, "There is 1 alias tagged...")); CleartoEOLN(); ans = enter_yn(catgets(elm_msg_cat, AliasesSet, AliasesCreateGroup, "Create group alias?"), FALSE, LINES-3, FALSE); } else if (tagged > 1) { /* * If multiple tagged aliases then we assume the user * wants to create a group alias. The default response * is YES. */ PutLine(LINES-2,0, catgets(elm_msg_cat, AliasesSet, AliasesManyTagged, "There are %d aliases tagged..."), tagged); CleartoEOLN(); ans = enter_yn(catgets(elm_msg_cat, AliasesSet, AliasesCreateGroup, "Create group alias?"), TRUE, LINES-3, FALSE); } else { /* * Nothing tagged ... thus nothing to make a group of. */ ans = FALSE; } /* * If requested above, create the group alias address. */ if (ans) { strcpy(address1, aliases[leftoff]->alias); for (i=leftoff+1; i < num_aliases; i++) { if (ison(aliases[i]->status, TAGGED)) { strcat(address1, ","); strcat(address1, aliases[i]->alias); } } } else { tagged = 0; } /* * Only ask for an aliasname if we are NOT replacing the * current alias. */ if (replace) { strcpy(aliasname, aliases[to_replace]->alias); /* * First, see if what we are replacing is a SYSTEM * alias. If so, we need to ask a question. */ if(aliases[to_replace]->type & SYSTEM) { dprint(3, (debugfile, "Aliasname [%s] is SYSTEM in add_alias\n", aliasname)); /* * If they don't want to superceed the SYSTEM alias then * just return. */ if( ! superceed_system(to_replace)) { ClearLine(LINES-2); return(0); } } } else { strcpy(buffer, catgets(elm_msg_cat, AliasesSet, AliasesEnterAliasName, "Enter alias name: ")); PutLine(LINES-2,0, buffer); CleartoEOLN(); *aliasname = '\0'; if ((replace = get_aliasname(aliasname, buffer, &to_replace)) < 0) { dprint(3, (debugfile, "Aliasname [%s] was rejected in add_alias\n", aliasname)); ClearLine(LINES-2); return(0); } } /* * If we are replacing an existing alias, we will assume that * they might want to be just editing most of what is already * there. So we copy some defaults from the existing alias. */ if (replace) { strcpy(lastname, aliases[to_replace]->last_name); strcpy(firstname, aliases[to_replace]->name); ch_ptr = strstr(firstname, lastname); *(ch_ptr-1) = '\0'; strcpy(comment, aliases[to_replace]->comment); } else { *lastname = '\0'; *firstname = '\0'; *comment = '\0'; } get_realnames(aliasname, firstname, lastname, comment, buffer); /* * Since there are no tagged aliases, we must ask for an * address. If we are replacing, a default address is * presented. */ if (tagged == 0) { sprintf(buffer, catgets(elm_msg_cat, AliasesSet, AliasesEnterAddress, "Enter address for %s: "), aliasname); PutLine(LINES-2, 0, buffer); if (replace) strcpy(address1, aliases[to_replace]->address); else *address1 = '\0'; if (enter_string(address1, sizeof(address1), -1, -1, ESTR_REPLACE) < 0 || address1[0] == '\0') { Raw(ON); show_error(catgets(elm_msg_cat, AliasesSet, AliasesNoAddressSpec, "No address specified!")); return(0); } Raw(ON); despace_address(address1); clear_error(); /* Just in case */ } if(ask_accept(aliasname, firstname, lastname, comment, address1, buffer, replace, to_replace)) { /* * We can only clear the tags after we know that the * alias was added. This allows the user to back out * and rethink without losing the tags. */ if (tagged > 0) { for (i=leftoff; i < num_aliases; i++) { if (ison(aliases[i]->status, TAGGED)) { clearit(aliases[i]->status, TAGGED); show_msg_tag(i); } } } return(1); } else { return(0); } }
static int get_aliasname(char *aliasname, char *buffer, int *duplicate) { /* * Have the user enter an aliasname, check to see if it * is legal, then check for duplicates. If a duplicate * is found offer to replace existing alias. * * Return values: * * -1 Either the aliasname was zero length, had bad * characters and was a duplicate which the user * chose not to replace. * * 0 A new alias was entered successfully. * * 1 The entered alias was an existing USER alias * that the user has chosen to replace. In this * case the alias to replace is passed back in * in the variable 'duplicate'. */ int loc; do { if (enter_string(aliasname, SLEN, LINES-2, strlen(buffer), ESTR_REPLACE) < 0 || aliasname[0] == '\0') return(-1); } while (check_alias(aliasname) == -1); clear_error(); /* Just in case */ /* * Check to see if there is already a USER alias by this name. */ if ((loc = find_alias(aliasname, USER)) >= 0) { dprint(3, (debugfile, "Attempt to add a duplicate alias [%s] in get_aliasname\n", aliases[loc]->alias)); if (aliases[loc]->type & GROUP ) PutLine(LINES-2,0, catgets(elm_msg_cat, AliasesSet, AliasesAlreadyGroup, "Already a group with name %s."), aliases[loc]->alias); else PutLine(LINES-2,0, catgets(elm_msg_cat, AliasesSet, AliasesAlreadyAlias, "Already an alias for %s."), aliases[loc]->alias); CleartoEOLN(); /* * If they don't want to replace the alias by that name * then just return. */ if (!enter_yn(catgets(elm_msg_cat, AliasesSet, AliasesReplaceExisting, "Replace existing alias?"), FALSE, LINES-3, FALSE)) return(-1); *duplicate = loc; return(1); } /* * If they have elected to replace an existing alias then * we assume that they would also elect to superceed a * system alias by that name (since they have already * done so). So we don't even bother to check or ask. * * Of course we do check if there was no USER alias match. */ if ((loc = find_alias(aliasname, SYSTEM)) >= 0) { dprint(3, (debugfile, "Attempt to add a duplicate system alias [%s] in get_aliasname\n", aliases[loc]->address)); if( ! superceed_system(loc)) return(-1); } return(0); }
int main(int argc, char *argv[]) { int result = ACTION_NONE; int leave = 0; char *editor_file = 0; char path[512]; SDL_Surface *loading; #ifdef __unix__ gid_t realgid; hi_dir_chart_file = fopen(HI_DIR "/" CHART_FILE_NAME, "r+"); /* This is where we drop our setuid/setgid privileges. */ realgid = getgid(); if (setresgid(-1, realgid, realgid) != 0) { perror("Could not drop setgid privileges. Aborting."); exit(1); } #endif /* i18n */ #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif #ifdef _WIN32 /* Get Windows to open files in binary mode instead of default text mode */ _fmode = _O_BINARY; #endif /* lbreakout info */ printf( "LBreakout2 %s\nCopyright 2001-2010 Michael Speck\nPublished under GNU GPL\n---\n", VERSION ); printf( "Looking up data in: %s\n", SRC_DIR ); printf( "Looking up highscores in: %s\n", HI_DIR ); printf( "Looking up custom levels in: %s/%s/lbreakout2-levels\n", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME ); #ifndef AUDIO_ENABLED printf( "Compiled without sound and music\n" ); #endif set_random_seed(); /* set random seed */ config_load(); stk_init( SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK ); if ( config.fullscreen ) stk_display_open( SDL_SWSURFACE | SDL_FULLSCREEN, 640, 480, 16 ); else stk_display_open( SDL_SWSURFACE, 640, 480, 16 ); stk_audio_open( 0,0,0,config.audio_buffer_size ); SDL_WM_SetCaption( "LBreakout2", 0 ); SDL_SetEventFilter( event_filter ); stk_audio_enable_sound( config.sound ); stk_audio_set_sound_volume( config.volume * 16 ); /* load a little loading pic */ stk_surface_set_path( SRC_DIR "/gfx" ); loading = stk_surface_load( SDL_SWSURFACE, "loading.png" ); stk_surface_blit( loading, 0,0,-1,-1, stk_display, (stk_display->w-loading->w)/2, (stk_display->h-loading->h)/2 ); stk_display_update( STK_UPDATE_ALL ); /* load the GUI graphics from SRC_DIR/gui_theme */ stk_surface_set_path( SRC_DIR ); stk_audio_set_path( SRC_DIR ); gui_init( "gui_theme" ); stk_surface_set_path( SRC_DIR "/gfx" ); stk_audio_set_path( SRC_DIR "/sounds" ); /* load resources */ /* for simplicity all functions are kept but anything * that is now themeable is loaded in * theme_load instead of the original function * (deleting resources works analouge) */ theme_get_list(); if ( config.theme_count != theme_count ) { if ( config.theme_id >= theme_count ) config.theme_id = 0; config.theme_count = theme_count; } theme_load( theme_names[config.theme_id] ); /* old functions still with initialzations of * lists or variables */ client_game_create(); hint_load_res(); chart_load(); manager_create(); client_create(); exp_load(); editor_create(); help_create(); /* run game */ manager_fade( STK_FADE_IN ); while( !leave && !stk_quit_request ) { result = manager_run(); switch( result ) { case ACTION_QUIT: leave = 1; break; case ACTION_RESUME_0: manager_fade( STK_FADE_OUT ); if ( client_game_resume_local( 0 ) ) client_game_run(); client_game_finalize(); manager_fade( STK_FADE_IN ); break; case ACTION_PLAY_LBR: manager_fade( STK_FADE_OUT ); gameSeed = rand(); /* set random seed for next FREAKOUT/BonusLevels */ if ( client_game_init_local( "LBreakout2" ) ) client_game_run(); client_game_finalize(); manager_fade( STK_FADE_IN ); break; case ACTION_PLAY_CUSTOM: manager_fade( STK_FADE_OUT ); gameSeed = rand(); /* set random seed for next FREAKOUT/BonusLevels */ if (gameSeed==0) gameSeed=1; /* not allowed because.... A HACK!!! 0 means to have no bonus levels to save a parameter */ if ( client_game_init_local( levelset_names_local[config.levelset_id_local] ) ) client_game_run(); client_game_finalize(); manager_fade( STK_FADE_IN ); break; case ACTION_EDIT: /* new set? */ if ( strequal( NEW_SET, edit_set ) ) { editor_file = calloc( 16, sizeof( char ) ); snprintf( path, sizeof(path)-1, "%s/%s/lbreakout2-levels", getenv( "HOME" )? getenv("HOME"):".", CONFIG_DIR_NAME ); if ( !enter_string( font, _("Set Name:"), editor_file, 12 ) || !file_check( path, editor_file, "w" ) ) { free( editor_file ); break; } else manager_update_set_list(); } else editor_file = strdup( edit_set ); if ( editor_init( editor_file ) ) { manager_fade( STK_FADE_OUT ); editor_run(); editor_clear(); manager_fade( STK_FADE_IN ); } free( editor_file ); editor_file = 0; break; case ACTION_QUICK_HELP: help_run(); break; case ACTION_CLIENT: manager_fade( STK_FADE_OUT ); client_run(); manager_fade( STK_FADE_IN ); break; default: break; } } manager_fade( STK_FADE_OUT ); /* delete stuff */ help_delete(); manager_delete(); chart_save(); chart_delete(); editor_delete(); exp_delete(); client_game_delete(); hint_delete_res(); theme_delete(); theme_delete_list(); stk_surface_free( &loading ); config_save(); if (hi_dir_chart_file) fclose(hi_dir_chart_file); return EXIT_SUCCESS; }
/* * The editor used by edit_message() when "builtin" or "none" are selected. * Return 0 if successful, -1 on error. */ static int builtin_editor(const char *filename, SEND_HEADER *shdr) { char linebuf[SLEN]; /* line input buffer */ char wrapbuf[SLEN]; /* wrapped line overflow buffer */ char tmpbuf[SLEN]; /* scratch buffer */ FILE *fp; /* output stream to "filename" */ int rc; /* return code from this procedure */ int is_wrapped; /* wrapped line flag */ int err; /* temp holder for errno */ SIGHAND_TYPE (*oldint)(); /* previous value of SIGINT */ SIGHAND_TYPE (*oldquit)(); /* previous value of SIGQUIT */ SIGHAND_TYPE builtin_interrupt_handler(); /* the built-in editor is not re-entrant! */ assert(!builtin_active); /* initialize return code to failure */ rc = -1; if ((fp = fopen(filename, "r+")) == NULL) { err = errno; sprintf(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmCouldntOpenAppend, "Couldn't open %s for update [%s]."), filename, strerror(err)); PutLine(-1, -1, tmpbuf); dprint(1, (debugfile, "Error encountered trying to open file %s;\n", filename)); dprint(1, (debugfile, "** %s **\n", strerror(err))); return rc; } /* skip past any existing text */ fseek(fp, 0, SEEK_END); /* prompt user, depending upon whether file already has text */ if (fsize(fp) > 0L) strcpy(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmContinueEntering, "\n\rContinue entering message.")); else strcpy(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmEnterMessage, "\n\rEnter message.")); strcat(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmTypeElmCommands, " Type Elm commands on lines by themselves.\n\r")); sprintf(tmpbuf+strlen(tmpbuf), catgets(elm_msg_cat, ElmSet, ElmCommandsInclude, "Commands include: ^D or '.' to end, %cp to list, %c? for help.\n\r\n\r"), escape_char, escape_char); CleartoEOS(); PutLine(-1, -1, tmpbuf); builtin_active = TRUE; builtin_interrupt_count = 0; oldint = signal(SIGINT, builtin_interrupt_handler); oldquit = signal(SIGQUIT, builtin_interrupt_handler); /* return location for interrupts */ while (SETJMP(builtin_jmpbuf) != 0) { if (builtin_interrupt_count == 1) { PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmEditmsgOneMoreCancel, "(Interrupt. One more to cancel this letter.)\n\r")); } else { PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmEditmsgCancelled, "(Interrupt. Letter canceled.)\n\r")); goto done; } } for (;;) { /* re-open file if it was closed out on a call to an external editor */ if (fp == NULL) { if ((fp = fopen(filename, "a+")) == NULL) { err = errno; sprintf(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmCouldntOpenAppend, "Couldn't open %s for update [%s]."), filename, strerror(err)); PutLine(-1, -1, tmpbuf); dprint(1, (debugfile, "Error encountered trying to open file %s;\n", filename)); dprint(1, (debugfile, "** %s **\n", strerror(err))); goto done; } PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmPostEdContinue, "(Continue entering message. Type ^D or '.' on a line by itself to end.)\n\r")); } linebuf[0] = '\0'; wrapbuf[0] = '\0'; is_wrapped = 0; more_wrap: if (wrapped_enter(linebuf, wrapbuf, -1, -1, fp, &is_wrapped) != 0) break; if (is_wrapped) { fprintf(fp, "%s\n", linebuf); NewLine(); (void) strcpy(linebuf, wrapbuf); wrapbuf[0] = '\0'; goto more_wrap; } /* reset consecutive interrupt counter */ builtin_interrupt_count = 0; /* a lone "." signals end of text */ if (strcmp(linebuf, ".") == 0) break; /* process line of text */ if (linebuf[0] != escape_char) { fprintf(fp, "%s\n", linebuf); NewLine(); continue; } /* command character was escaped */ if (linebuf[1] == escape_char) { fprintf(fp, "%s\n", linebuf+1); continue; } switch (tolower(linebuf[1])) { case '?': tilde_help(); break; case 't': get_with_expansion("\n\rTo: ", shdr->to, shdr->expanded_to, linebuf); break; case 'b': get_with_expansion("\n\rBcc: ", shdr->bcc, shdr->expanded_bcc, linebuf); break; case 'c': get_with_expansion("\n\rCc: ", shdr->cc, shdr->expanded_cc, linebuf); break; case 's': get_with_expansion("\n\rSubject: ", shdr->subject, (char *)NULL, linebuf); break; case 'h': get_with_expansion("\n\rTo: ", shdr->to, shdr->expanded_to, (char *)NULL); get_with_expansion("Cc: ", shdr->cc, shdr->expanded_cc, (char *)NULL); get_with_expansion("Bcc: ", shdr->bcc, shdr->expanded_bcc, (char *)NULL); get_with_expansion("Subject: ", shdr->subject, (char *)NULL, (char *)NULL); break; case 'r': read_in_file(fp, linebuf+2, 1); break; case 'e': if (e_editor[0] == '\0') { PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmDontKnowEmacs, "\n\r(Don't know where Emacs would be. Continue.)\n\r")); break; } NewLine(); fclose(fp); fp = NULL; (void) edit_message(filename, shdr, e_editor); break; case 'v': NewLine(); fclose(fp); fp = NULL; (void) edit_message(filename, shdr, v_editor); break; case 'o': PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmEnterNameEditor, "\n\rPlease enter the name of the editor: ")); if (enter_string(tmpbuf, sizeof(tmpbuf), -1, -1, ESTR_ENTER) < 0 || tmpbuf[0] == '\0') { PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmSimpleContinue, "(Continue.)\n\r")); break; } NewLine(); fclose(fp); fp = NULL; (void) edit_message(filename, shdr, tmpbuf); break; case '<': NewLine(); if (strlen(linebuf) < 3) { PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmUseSpecificCommand, "(You need to use a specific command here. Continue.)\n\r")); break; } sprintf(tmpbuf, "%s%s.%d", temp_dir, temp_edit, getpid()); sprintf(linebuf+strlen(linebuf), " >%s 2>&1", tmpbuf); (void) system_call(linebuf+2, SY_COOKED|SY_ENAB_SIGINT|SY_DUMPSTATE); read_in_file(fp, tmpbuf, 0); (void) unlink(tmpbuf); break; case '!': NewLine(); (void) system_call( (strlen(linebuf) < 3 ? (char *)NULL : linebuf+2), SY_COOKED|SY_USER_SHELL|SY_ENAB_SIGINT|SY_DUMPSTATE); PutLine(LINES, 0, catgets(elm_msg_cat, ElmSet, ElmSimpleContinue, "(Continue.)\n\r")); break; case 'm': /* same as 'f' but with leading prefix added */ case 'f': /* this can be directly translated into a 'readmsg' call with the same params! */ NewLine(); read_in_messages(fp, linebuf+1); break; case 'p': /* print out message so far */ print_message_so_far(fp, shdr); break; default: sprintf(tmpbuf, catgets(elm_msg_cat, ElmSet, ElmDontKnowChar, "\n\r(Don't know what %c%c is. Try %c? for help.)\n\r"), escape_char, linebuf[1], escape_char); PutLine(-1, -1, tmpbuf); break; } } PutLine(-1, -1, catgets(elm_msg_cat, ElmSet, ElmEndOfMessage, "\n\r<end-of-message>\n\r\n\r\n\r\n\r")); rc = 0; done: (void) signal(SIGINT, oldint); (void) signal(SIGQUIT, oldquit); if (fp != NULL) fclose(fp); builtin_active = FALSE; return rc; }
/* FOO - should this routine use the file browser? */ int name_copy_file(char *fn) { /* * Prompt user for name of file for saving copy of outbound msg to. * Update "fn" with user's response. * Return TRUE if we need a redraw (i.e. help displayed). */ int redraw, i; char buffer[SLEN], origbuffer[SLEN], *ncf_prompt; redraw = FALSE; ncf_prompt = catgets(elm_msg_cat, ElmSet, ElmSaveCopyInPrompt, "Save copy in (use '?' for help/to list folders): "); /* convert the save cookie to readable explanation */ (void) strcpy(origbuffer, cf_english(fn)); for (;;) { /* load in the default value */ strcpy(buffer, origbuffer); /* prompt for save file name */ MoveCursor(LINES-2, 0); CleartoEOS(); PutLine(LINES-2, 0, ncf_prompt); if (enter_string(buffer, sizeof(buffer), -1, -1, ESTR_REPLACE) < 0) { /* aborted - restore value */ (void) strcpy(buffer, origbuffer); break; } /* break out if if we got an answer */ if (strcmp(buffer, "?") != 0) break; /* user asked for help */ redraw = TRUE; Raw(OFF | NO_TITE); ClearScreen(); printf(catgets(elm_msg_cat, ElmSet, ElmListFoldersHelp, "Enter: <nothing> to not save a copy of the message,\n\ \r '<' to save in your \"sent\" folder (%s),\n\ \r '=' to save by name (the folder name depends on whom the\n\ \r message is to, in the end),\n\ \r '=?' to save by name if the folder already exists,\n\ \r and if not, to your \"sent\" folder,\n\ \r or a filename (a leading '=' denotes your folder directory).\n\ \r\n\ \r"), sent_mail); printf(catgets(elm_msg_cat, ElmSet, ElmContentsOfYourFolderDir, "\n\rContents of your folder directory:\n\r\n\r")); sprintf(buffer, "cd %s;ls -C", folders); (void) system_call(buffer, 0); for (i = 0 ; i < 4 ; ++i) printf("\n\r"); Raw(ON | NO_TITE); } /* snarf any entry made by the user */ if (!streq(origbuffer, buffer)) strcpy(fn, buffer); /* display English expansion of new user input a while */ PutLine(LINES-2, strlen(ncf_prompt), cf_english(fn)); MoveCursor(LINES-1, 0); FlushOutput(); if (sleepmsg > 0) sleep((sleepmsg + 1) / 2); MoveCursor(LINES-2, 0); CleartoEOS(); return redraw; }