static void write_quoted(const TCHAR *Value, INI_FILETYPE *fp) { TCHAR s[3]; int idx; if (check_enquote(Value) == QUOTE_NONE) { ini_write(Value, fp); } else { ini_write("\"", fp); for (idx = 0; Value[idx] != '\0'; idx++) { if (Value[idx] == '"') { s[0] = '\\'; s[1] = Value[idx]; s[2] = '\0'; } else { s[0] = Value[idx]; s[1] = '\0'; } /* if */ ini_write(s, fp); } /* for */ ini_write("\"", fp); } /* if */ }
/** * 書き出し */ void initsave(void) { TCHAR szPath[MAX_PATH]; initgetfile(szPath, _countof(szPath)); ini_write(szPath, s_szIniTitle, s_IniItems, _countof(s_IniItems)); }
void initsave(void) { char path[MAX_PATH]; milstr_ncpy(path, file_getcd(inifile), sizeof(path)); ini_write(path, ini_title, iniitem, INIITEMS); }
void initsave(void) { TCHAR path[MAX_PATH]; milstr_ncpy(path, file_getcd(inifile), NELEMENTS(path)); ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); }
static int cache_flush(TCHAR *buffer, int *size, INI_FILETYPE *rfp, INI_FILETYPE *wfp, INI_FILEPOS *mark) { int terminator_len = (int)_tcslen(INI_LINETERM); int pos = 0; (void)ini_seek(rfp, mark); assert(buffer != NULL); buffer[0] = '\0'; assert(size != NULL); assert(*size <= INI_BUFFERSIZE); while (pos < *size) { (void)ini_read(buffer + pos, INI_BUFFERSIZE - pos, rfp); while (pos < *size && buffer[pos] != '\0') pos++; /* cannot use _tcslen() because buffer may not be zero-terminated */ } /* while */ if (buffer[0] != '\0') { assert(pos > 0 && pos <= INI_BUFFERSIZE); if (pos == INI_BUFFERSIZE) pos--; buffer[pos] = '\0'; /* force zero-termination (may be left unterminated in the above while loop) */ (void)ini_write(buffer, wfp); } ini_tell(rfp, mark); /* update mark */ *size = 0; /* return whether the buffer ended with a line termination */ return (pos > terminator_len) && (_tcscmp(buffer + pos - terminator_len, INI_LINETERM) == 0); }
void initsave(void) { OEMCHAR path[MAX_PATH]; initgetfile(path, NELEMENTS(path)); ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); }
void skbdwin_writeini(void) { OEMCHAR path[MAX_PATH]; initgetfile(path, NELEMENTS(path)); ini_write(path, skbdapp, skbdini, NELEMENTS(skbdini)); }
void mdbgwin_writeini(void) { OEMCHAR path[MAX_PATH]; initgetfile(path, NELEMENTS(path)); ini_write(path, mdbgapp, mdbgini, NELEMENTS(mdbgini)); }
void kdispwin_writeini(void) { OEMCHAR path[MAX_PATH]; initgetfile(path, NELEMENTS(path)); ini_write(path, kdispapp, kdispini, NELEMENTS(kdispini)); }
void initsave(void) { char path[MAX_PATH]; file_cpyname(path, file_getcd(inifile), NELEMENTS(path)); ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); }
void initsave(void) { char path[MAX_PATH]; file_cpyname(path, file_getcd(inifile), sizeof(path)); ini_write(path, ini_title, iniitem, INIITEMS, TRUE); }
void skbdwin_writeini(void) { char path[MAX_PATH]; file_cpyname(path, modulefile, sizeof(path)); ini_write(path, ini_title, iniitem, INIITEMS, FALSE); }
/** * 解放 */ void CTraceWnd::Deinitialize() { if (m_tfh != NULL) { textfile_close(m_tfh); m_tfh = NULL; } DestroyWindow(); ini_write(file_getcd(np2trace), inititle, initbl, NELEMENTS(initbl)); }
void trace_term(void) { if (tracewin.fh != FILEH_INVALID) { trfh_close(); } if (tracewin.hwnd) { DestroyWindow(tracewin.hwnd); tracewin.hwnd = NULL; ini_write(file_getcd(np2trace), inititle, initbl, 4); } }
void trace_term(void) { if (tracewin.tf != NULL) { textfile_close(tracewin.tf); tracewin.tf = NULL; } if (tracewin.hwnd) { DestroyWindow(tracewin.hwnd); tracewin.hwnd = NULL; ini_write(file_getcd(np2trace), inititle, initbl, NELEMENTS(initbl)); } }
static void writekey(TCHAR *LocalBuffer, const TCHAR *Key, const TCHAR *Value, INI_FILETYPE *fp) { TCHAR *p; enum quote_option option = check_enquote(Value); save_strncpy(LocalBuffer, Key, INI_BUFFERSIZE - 3, QUOTE_NONE); /* -1 for '=', -2 for '\r\n' */ p = _tcsrchr(LocalBuffer, '\0'); assert(p != NULL); *p++ = '='; save_strncpy(p, Value, INI_BUFFERSIZE - (p - LocalBuffer) - 2, option); /* -2 for '\r\n' */ p = _tcsrchr(LocalBuffer, '\0'); assert(p != NULL); _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ (void)ini_write(LocalBuffer, fp); }
static void writesection(TCHAR *LocalBuffer, const TCHAR *Section, INI_FILETYPE *fp) { TCHAR *p; if (Section != NULL && _tcslen(Section) > 0) { LocalBuffer[0] = '['; save_strncpy(LocalBuffer + 1, Section, INI_BUFFERSIZE - 4, QUOTE_NONE); /* -1 for '[', -1 for ']', -2 for '\r\n' */ p = _tcsrchr(LocalBuffer, '\0'); assert(p != NULL); *p++ = ']'; _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ (void)ini_write(LocalBuffer, fp); } /* if */ }
static void writekey(TCHAR *LocalBuffer, const TCHAR *Key, const TCHAR *Value, INI_FILETYPE *fp) { TCHAR *p; save_strncpy(LocalBuffer, Key, INI_BUFFERSIZE - 3); /* -1 for '=', -2 for '\r\n' */ p = _tcsrchr(LocalBuffer, '\0'); assert(p != NULL); *p++ = '='; save_strncpy(p, Value, INI_BUFFERSIZE - (p - LocalBuffer) - 2); /* -2 for '\r\n' */ p = _tcsrchr(LocalBuffer, '\0'); assert(p != NULL); _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ ini_write(LocalBuffer, fp); }
int main(void) { struct ini * ini = ini_new(); assert(ini != NULL); FILE * fid = fopen("testfile", "r"); assert(fid != NULL); int res = ini_read(ini, fid); fclose(fid); assert(res == 0); ini_set(ini, "aa", "pswd", "1234"); ini_write(ini, stdout); ini_del(ini); return 0; }
static int cache_flush(TCHAR *buffer, int *size, INI_FILETYPE *rfp, INI_FILETYPE *wfp, INI_FILEPOS *mark) { int pos = 0; (void)ini_seek(rfp, mark); assert(buffer != NULL); buffer[0] = '\0'; assert(size != NULL); while (pos < *size) { (void)ini_read(buffer + pos, INI_BUFFERSIZE - pos, rfp); pos += _tcslen(buffer + pos); assert(pos <= *size); } /* while */ if (buffer[0] != '\0') (void)ini_write(buffer, wfp); (void)ini_tell(rfp, mark); /* update mark */ *size = 0; /* return whether the buffer ended with a line termination */ return (_tcscmp(buffer + pos - _tcslen(INI_LINETERM), INI_LINETERM) == 0); }
/** ini_puts() * \param Section the name of the section to write the string in * \param Key the name of the entry to write, or NULL to erase all keys in the section * \param Value a pointer to the buffer the string, or NULL to erase the key * \param Filename the name and full path of the .ini file to write to * * \return 1 if successful, otherwise 0 */ int ini_puts(const TCHAR *Section, const TCHAR *Key, const TCHAR *Value, const TCHAR *Filename) { INI_FILETYPE rfp; INI_FILETYPE wfp; INI_FILEPOS mark; TCHAR *sp, *ep; TCHAR LocalBuffer[INI_BUFFERSIZE]; int len, match, flag, cachelen; assert(Filename != NULL); if (!ini_openread(Filename, &rfp)) { /* If the .ini file doesn't exist, make a new file */ if (Key != NULL && Value != NULL) { if (!ini_openwrite(Filename, &wfp)) return 0; writesection(LocalBuffer, Section, &wfp); writekey(LocalBuffer, Key, Value, &wfp); (void)ini_close(&wfp); } /* if */ return 1; } /* if */ /* If parameters Key and Value are valid (so this is not an "erase" request) * and the setting already exists and it already has the correct value, do * nothing. This early bail-out avoids rewriting the INI file for no reason. */ if (Key != NULL && Value != NULL) { (void)ini_tell(&rfp, &mark); match = getkeystring(&rfp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer)); if (match && _tcscmp(LocalBuffer,Value) == 0) { (void)ini_close(&rfp); return 1; } /* if */ /* key not found, or different value -> proceed (but rewind the input file first) */ (void)ini_seek(&rfp, &mark); } /* if */ /* Get a temporary file name to copy to. Use the existing name, but with * the last character set to a '~'. */ ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); if (!ini_openwrite(LocalBuffer, &wfp)) { (void)ini_close(&rfp); return 0; } /* if */ (void)ini_tell(&rfp, &mark); cachelen = 0; /* Move through the file one line at a time until a section is * matched or until EOF. Copy to temp file as it is read. */ len = (Section != NULL) ? _tcslen(Section) : 0; if (len > 0) { do { if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { /* Failed to find section, so add one to the end */ flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); if (Key!=NULL && Value!=NULL) { if (!flag) (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ writesection(LocalBuffer, Section, &wfp); writekey(LocalBuffer, Key, Value, &wfp); } /* if */ return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ } /* if */ /* Copy the line from source to dest, but not if this is the section that * we are looking for and this section must be removed */ sp = skipleading(LocalBuffer); ep = _tcschr(sp, ']'); match = (*sp == '[' && ep != NULL && (int)(ep-sp-1) == len && _tcsnicmp(sp + 1,Section,len) == 0); if (!match || Key != NULL) { if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); } /* if */ } /* if */ } while (!match); } /* if */ cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); /* when deleting a section, the section head that was just found has not been * copied to the output file, but because this line was not "accumulated" in * the cache, the position in the input file was reset to the point just * before the section; this must now be skipped (again) */ if (Key == NULL) { (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); (void)ini_tell(&rfp, &mark); } /* if */ /* Now that the section has been found, find the entry. Stop searching * upon leaving the section's area. Copy the file as it is read * and create an entry if one is not found. */ len = (Key!=NULL) ? _tcslen(Key) : 0; for( ;; ) { if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { /* EOF without an entry so make one */ flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); if (Key!=NULL && Value!=NULL) { if (!flag) (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ writekey(LocalBuffer, Key, Value, &wfp); } /* if */ return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ } /* if */ sp = skipleading(LocalBuffer); ep = _tcschr(sp, '='); /* Parse out the equal sign */ if (ep == NULL) ep = _tcschr(sp, ':'); match = (ep != NULL && (int)(skiptrailing(ep,sp)-sp) == len && _tcsnicmp(sp,Key,len) == 0); if ((Key != NULL && match) || *sp == '[') break; /* found the key, or found a new section */ /* copy other keys in the section */ if (Key == NULL) { (void)ini_tell(&rfp, &mark); /* we are deleting the entire section, so update the read position */ } else { if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); } /* if */ } /* if */ } /* for */ /* the key was found, or we just dropped on the next section (meaning that it * wasn't found); in both cases we need to write the key, but in the latter * case, we also need to write the line starting the new section after writing * the key */ flag = (*sp == '['); cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); if (Key != NULL && Value != NULL) writekey(LocalBuffer, Key, Value, &wfp); /* cache_flush() reset the "read pointer" to the start of the line with the * previous key or the new section; read it again (because writekey() destroyed * the buffer) */ (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); if (flag) { /* the new section heading needs to be copied to the output file */ cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); } else { /* forget the old key line */ (void)ini_tell(&rfp, &mark); } /* if */ /* Copy the rest of the INI file */ while (ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); } /* if */ } /* while */ cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ }
MRESULT IntrospectBase::DlgProc(ULONG msg, MPARAM mp1, MPARAM mp2) { switch (msg) {case WM_INITDLG: { MRESULT ret = DialogBase::DlgProc(msg, mp1, mp2); do_warpsans(GetHwnd()); // Populate MRU list ComboBox cb(GetCtrl(CB_SERVER)); if (Configuration.SinkServer) cb.InsertItem(Configuration.SinkServer); char key[] = "Server1"; do { xstring url; ini_query(key, url); if (!url) break; cb.InsertItem(url); } while (++key[sizeof key -2] <= '9'); return ret; } case WM_COMMAND: DEBUGLOG(("IntrospectBase::DlgProc:WM_COMMAND(%i,%i, %p)\n", SHORT1FROMMP(mp1), SHORT2FROMMP(mp1), mp2)); switch (SHORT1FROMMP(mp1)) {case PB_UPDATE: PostMsg(UM_CONNECT, 0,0); return 0; case DID_OK: { ComboBox cb(GetCtrl(CB_SERVER)); const xstring& server = cb.Text(); // update MRU list if (server.length()) { char key[] = "Server1"; int i = 0; int len = 0; xstring url; do { if (len >= 0) {skip: url.reset(); len = (SHORT)SHORT1FROMMR(WinSendMsg(cb.Hwnd, LM_QUERYITEMTEXTLENGTH, MPFROMSHORT(i), 0)); if (len >= 0) { WinSendMsg(cb.Hwnd, LM_QUERYITEMTEXT, MPFROM2SHORT(i, len+1), MPFROMP(url.allocate(len))); DEBUGLOG(("IntrospectBase::DlgProc: save MRU %i: (%i) %s\n", i, len, url.cdata())); ++i; if (url == server) goto skip; } } ini_write(key, url); } while (++key[sizeof key -2] <= '9'); } Configuration.Save(); } break; } break; case WM_CONTROL: switch (SHORT1FROMMP(mp1)) {case CB_SERVER: switch (SHORT2FROMMP(mp1)) {case CBN_ENTER: PostMsg(UM_CONNECT, 0,0); break; } break; case CB_SINKSRC: switch (SHORT2FROMMP(mp1)) {case CBN_ENTER: PostMsg(UM_UPDATE_PORT, 0,0); break; } } break; case UM_CONNECT: { DEBUGLOG(("IntrospectBase::DlgProc:UM_CONNECT\n")); // destroy any old connection Cleanup(); const xstring& server = WinQueryDlgItemXText(GetHwnd(), CB_SERVER); if (!server.length()) { WinSetDlgItemText(GetHwnd(), ST_STATUS, "enter server name above"); return 0; } // open new connection try { Context.Connect("PM123", server); } catch (const PAException& ex) { WinSetDlgItemText(GetHwnd(), ST_STATUS, ex.GetMessage()); } return 0; } case UM_STATE_CHANGE: { pa_context_state_t state = (pa_context_state_t)LONGFROMMP(mp1); DEBUGLOG(("IntrospectBase::DlgProc:UM_STATE_CHANGE %u\n", state)); const char* text = ""; switch (state) {case PA_CONTEXT_CONNECTING: text = "Connecting ..."; break; case PA_CONTEXT_AUTHORIZING: text = "Authorizing ..."; break; case PA_CONTEXT_SETTING_NAME: text = "Set name ..."; break; case PA_CONTEXT_READY: text = "Connected"; PostMsg(UM_DISCOVER_SERVER, 0,0); break; case PA_CONTEXT_FAILED: WinSetDlgItemText(GetHwnd(), ST_STATUS, PAConnectException(Context.GetContext()).GetMessage()); return 0; case PA_CONTEXT_TERMINATED: text = "Closed"; break; case PA_CONTEXT_UNCONNECTED:; } WinSetDlgItemText(GetHwnd(), ST_STATUS, text); return 0; } } return DialogBase::DlgProc(msg, mp1, mp2); }
void ini_write_float(STRING *filename, char* section, STRING *entry, float value) { ini_write(filename, section, entry, str_for_float(NULL, value)); }
void ini_write_var(STRING *filename, char* section, STRING *entry, var value) { ini_write(filename, section, entry, str_for_num(NULL, value)); }
/** ini_puts() * \param Section the name of the section to write the string in * \param Key the name of the entry to write, or NULL to erase all keys in the section * \param Value a pointer to the buffer the string, or NULL to erase the key * \param Filename the name and full path of the .ini file to write to * * \return 1 if successful, otherwise 0 */ int ini_puts(const TCHAR *Section, const TCHAR *Key, const TCHAR *Value, const TCHAR *Filename) { INI_FILETYPE rfp; INI_FILETYPE wfp; TCHAR *sp, *ep; TCHAR LocalBuffer[INI_BUFFERSIZE]; int len, match, count; assert(Filename!=NULL); if (!ini_openread(Filename, &rfp)) { /* If the .ini file doesn't exist, make a new file */ if (Key!=NULL && Value!=NULL) { if (!ini_openwrite(Filename, &wfp)) return 0; writesection(LocalBuffer, Section, &wfp); writekey(LocalBuffer, Key, Value, &wfp); ini_close(&wfp); } /* if */ return 1; } /* if */ /* If parameters Key and Value are valid (so this is not an "erase" request) * and the setting already exists and it already has the correct value, do * nothing. This early bail-out avoids rewriting the INI file for no reason. */ if (Key!=NULL && Value!=NULL) { match = getkeystring(&rfp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer)); if (match && _tcscmp(LocalBuffer,Value)==0) { ini_close(&rfp); return 1; } /* if */ /* key not found, or different value -> proceed (but rewind the input file first) */ ini_rewind(&rfp); } /* if */ /* Get a temporary file name to copy to. Use the existing name, but with * the last character set to a '~'. */ ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); if (!ini_openwrite(LocalBuffer, &wfp)) { ini_close(&rfp); return 0; } /* if */ /* Move through the file one line at a time until a section is * matched or until EOF. Copy to temp file as it is read. */ count = 0; len = (Section != NULL) ? _tcslen(Section) : 0; if (len > 0) { do { if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { /* Failed to find section, so add one to the end */ if (Key!=NULL && Value!=NULL) { ini_write(INI_LINETERM, &wfp); /* force a new line (there may not have been one) behind the last line of the INI file */ writesection(LocalBuffer, Section, &wfp); writekey(LocalBuffer, Key, Value, &wfp); } /* if */ /* Clean up and rename */ ini_close(&rfp); ini_close(&wfp); ini_remove(Filename); ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); ini_rename(LocalBuffer, Filename); return 1; } /* if */ /* Copy the line from source to dest, but not if this is the section that * we are looking for and this section must be removed */ sp = skipleading(LocalBuffer); ep = _tcschr(sp, ']'); match = (*sp == '[' && ep != NULL && (int)(ep-sp-1) == len && _tcsnicmp(sp + 1,Section,len) == 0); if (!match || Key!=NULL) { /* Remove blank lines, but insert a blank line (possibly one that was * removed on the previous iteration) before a new section. This creates * "neat" INI files. */ if (_tcslen(sp) > 0) { if (*sp == '[' && count > 0) ini_write(INI_LINETERM, &wfp); ini_write(sp, &wfp); count++; } /* if */ } /* if */ } while (!match); } /* if */ /* Now that the section has been found, find the entry. Stop searching * upon leaving the section's area. Copy the file as it is read * and create an entry if one is not found. */ len = (Key!=NULL) ? _tcslen(Key) : 0; for( ;; ) { if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { /* EOF without an entry so make one */ if (Key!=NULL && Value!=NULL) { ini_write(INI_LINETERM, &wfp); /* force a new line (there may not have been one) behind the last line of the INI file */ writekey(LocalBuffer, Key, Value, &wfp); } /* if */ /* Clean up and rename */ ini_close(&rfp); ini_close(&wfp); ini_remove(Filename); ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); ini_rename(LocalBuffer, Filename); return 1; } /* if */ sp = skipleading(LocalBuffer); ep = _tcschr(sp, '='); /* Parse out the equal sign */ if (ep == NULL) ep = _tcschr(sp, ':'); match = (ep != NULL && (int)(ep-sp) == len && _tcsnicmp(sp,Key,len) == 0); if ((Key!=NULL && match) || *sp == '[') break; /* found the key, or found a new section */ /* in the section that we re-write, do not copy empty lines */ if (Key!=NULL && _tcslen(sp) > 0) ini_write(sp, &wfp); } /* for */ if (*sp == '[') { /* found start of new section, the key was not in the specified * section, so we add it just before the new section */ if (Key!=NULL && Value!=NULL) { /* We cannot use "writekey()" here, because we need to preserve the * contents of LocalBuffer. */ ini_write(Key, &wfp); ini_write("=", &wfp); ini_write(Value, &wfp); ini_write(INI_LINETERM INI_LINETERM, &wfp); /* put a blank line between the current and the next section */ } /* if */ /* write the new section header that we read previously */ ini_write(sp, &wfp); } else { /* We found the key; ignore the line just read (with the key and * the current value) and write the key with the new value. */ if (Key!=NULL && Value!=NULL) writekey(LocalBuffer, Key, Value, &wfp); } /* if */ /* Copy the rest of the INI file (removing empty lines, except before a section) */ while (ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { sp = skipleading(LocalBuffer); if (_tcslen(sp) > 0) { if (*sp == '[') ini_write(INI_LINETERM, &wfp); ini_write(sp, &wfp); } /* if */ } /* while */ /* Clean up and rename */ ini_close(&rfp); ini_close(&wfp); ini_remove(Filename); ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); ini_rename(LocalBuffer, Filename); return 1; }
int sarm_set_msg (simarm_t *sim, const char *msg, const char *val) { /* a hack, for debugging only */ if (sim == NULL) { sim = par_sim; } if (msg == NULL) { msg = ""; } if (val == NULL) { val = ""; } if (msg_is_prefix ("term", msg)) { return (1); } if (msg_is_message ("emu.stop", msg)) { sim->brk = PCE_BRK_STOP; return (0); } else if (strcmp (msg, "emu.exit") == 0) { sim->brk = PCE_BRK_ABORT; return (0); } pce_log (MSG_DEB, "msg (\"%s\", \"%s\")\n", msg, val); if (msg_is_message ("disk.commit", msg)) { if (strcmp (val, "") == 0) { if (dsks_commit (sim->dsks)) { pce_log (MSG_ERR, "commit failed for at least one disk\n"); return (1); } } else { unsigned d; d = strtoul (val, NULL, 0); if (dsks_set_msg (sim->dsks, d, "commit", NULL)) { pce_log (MSG_ERR, "commit failed (%s)\n", val); return (1); } } return (0); } else if (msg_is_message ("emu.config.save", msg)) { if (ini_write (val, sim->cfg)) { return (1); } return (0); } pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val); return (1); }