Posted on: 2025-10-16
A while back a friend told me that the "Save As" function in some software she was using should actually be called "Save Ass". She made some editing mistakes and due to saving it as a different file, she was able to go back to the original non-broken version, saving her days of work. Bad version control aside, I came up with a story about how it actually was meant to be called "Save Ass" a long time ago and how it changed. For this blogpost I've modified this story a bit to make it a bit more realistic .. Anyway, here goes:
Once upon a time, a developer came up with the user interface we now call "menu". Being a new idea, and him just having implemented it the first time ever, using it in actual programs was very difficult. For example to get a menu you might expect from a text editor, you had to use a syntax, similar to this
const char *s_file = "File";
const char *s_new = "New";
const char *s_open = "Open";
const char *s_save = "Save";
const char *s_saveass = "Save Ass";
// etc.
MENU(mnu_file, s_file);
MENUITEM(mnu_file, mnu_new, s_new);
MENUITEM(mnu_file, mnu_open, s_open);
MENUITEM(mnu_file, mnu_save, s_save);
MENUITEM(mnu_file, mnu_saveass, s_saveass);
// etc.Note that you had to use global variables for all the strings. You couldn't just write MENU(mnu_file, "File"); This was because the MENU macros were accessing the string multiple times and without optimization (which did exist yet), the string would be included multiple times, using far too much memory and cause other issues.
The developer spent many months developing the application. Everything went smooth:
He was almost done, and then this error came up:
ERROR 10023: Symbol table full during compilation. Too many global variables.That was bad. The developer looked everywhere, all the variables were really needed. He got rid of a few, but the error came up again and again. At some point he looked at the menu, and thought: "There are so many variables here. Maybe we can do this differently after all?". Then he remembered that Strings in C are just Arrays. The null-character \0 terminates the string. Theoretically, all those strings could be combined into a single one, and then indexed. This would immediately save him dozens of variables. So he got to work putting all the strings together and counting the indexes with his fingers. Ever character counts, the null-terminator too. So "File" starts at the beginning, "New" starts 5 characters in, "Save" is 9 characters in, and so on:
const char *s_menu = 
    "File\0"
    "New\0"
    "Save\0"
    "Save Ass"
    "Open\0";
MENU(mnu_file, s_menu);
MENUITEM(mnu_file, mnu_new, s_menu + 5);
MENUITEM(mnu_file, mnu_open, s_menu + 22);
MENUITEM(mnu_file, mnu_save, s_menu + 9);
MENUITEM(mnu_file, mnu_saveass, s_menu + 14);He put them in separate lines to make it easier to read, but C combines them into a single one, like "File\0New\0Save\0".... This counting was cumbersome, but it worked. His big presentation was already the next day and he was burning the midnight oil to get everything working. In a very tired state he finished the project and got it to build. He copied everything to a floppy disk and finally earned himself three hours of well deserved sleep.
The next day everyone was awaiting the big presentation. Fueled by multiple cups of Espresso, he copied the application over from his floppy disk to the presentation computer, started it up... And froze. I should say he froze, not the application. The application worked perfectly fine, but the main menu looked like this:
What happened? He had forgotten the null-terminator. You can see it in the code above. One small typo, big effect. The developer started panicking. The presentation would be in 10 minutes! He couldn't show this to his bosses, potential clients and investors. But there was no C compiler on the presentation computer. His mind was racing: "Maybe I can quickly run up to my office? That would take 5 minutes. Boot the computer, hand-count all the new indices , recompile, copy ... 5 more minutes. Run back ... No there's simply no time for that!". The presentation could not be delayed either. So MacGyver-style, he looked around the PC, if there were any tools lying around, which he could somehow use to quickly fix this. And he got lucky. He found a HEX-Editor which would allow him to alter the compiled program directly. But with this tool you can't insert new characters, you can only edit existing ones. He had to make the menu item one character shorter to fit in the missing \0. He briefly thought about removing the space, and converting it so SaveAss\0, but that looked ugly. In the end, he chose so sacrifice the second "s" in "Ass" instead, as this also made sense. 
He saved, hoped he didn't mess anything up, held his breath while loading the program, and ..
Phew. The hard work paid off. The presentation went flawlessly, bosses were happy and he got a big promotion.
So this is the story of why today we call it "Save As". And just because it's totally made up, it doesn't mean that it couldn't be true anyway :D