Whee. Here 'tis. brkup. the utility to break up with your significant other. Now you can break up without the high cost of commercial break-up-letter generators, like the MS break-up-letter Wizard!

You can break up with anyone you like now. And it's totally free! All you have to do is copy-paste the code below into brkup.c and compile it with gcc -Wall -o brkup brkup.c! (GNU C library not included)


/* brkup - Break up with your significant other on stdout.
   Copyright (C) 2000 Cris van Pelt
   
   Distributed under the terms of the GPL. 
   See below for some #define's you'll have to ... well... define.
*/

/*
  TODO: SGML output.
*/

/*
  Example usage: 
    $ ./brkup -O1 -o "Gatesy" -P1 -p "Clinny" -r "two Bills is too much"
  This will let Gatesy dump Clinny, because two Bills is too much.

  Example for mass-dumpage:
    $ while true; do; ./brkup -O1 -o "Gatesy" -P1 -p `tail -1 -`; done
  Enter each name on the command-line, followed by RETURN, followed by
  ^D (CTRL-D, the EOF character). This will make it easy for Gatesy to
  dump Clinny, Joy, etc.
*/

/*
  Inspired by Noether. What he has to say about brkup:
  break up from the console! 
  combine with xargs and pipe to break up with multiple partners at once! 
  SGML output for easy conversion to your favourite format! 
  brkup is GPLed so you can break-up and support free software ! 

  I seriously hope that no-one would break-up with a significant other in 
  any way except face to face. 
-----
  John Freeman from YOU-NIX Magazine had the following to say about brkup:
  "It's great! I'm using brkup to break up with all my friends! I even
  broke up with my cat! Let me break up with you! Please, please!!!"
-----

  -- Of course, I'm making half of this up (you pick which half) just so
  you'll break up with your SO, and I'll have a chuckle.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <getopt.h>

/* Set these #def's to YOUR name and gender. As they are not likely
   to be changed soon (call me a conservative bastard, if you will),
   it should do no harm to hard code them in here. */

#define OWN_NAME "John S. Doe"
#define OWN_GENDER 1 /* Set to number of Y-chromosomes */

#define PACKAGE "brkup"
#define VERSION "0.1"

/* prototypes */
void exit_help();
void exit_version();
void print_usage(FILE *);

/* Name this program was called with. */
char *program_name;

int main(int argc, char *argv[])
{
    char *partner_name = NULL, *own_name = NULL, *reason = NULL;
    int partner_gender = -1, own_gender = -1;
    int i;

    struct option longopts[] = {
	{"version", 0, 0, 'v'},
	{"help", 0, 0, 'h'},
	{"partner-name", 1, 0, 'p'},
	{"partner-gender", 1, 0, 'P'},
	{"own-gender", 1, 0, 'o'},
	{"own-name", 1, 0, 'O'},
	{"reason", 1, 0, 'r'},
	{0, 0, 0, 0}
    };

    program_name = argv[0];

    while ((i = getopt_long(argc, argv, "p:P:o:O:r:vh", longopts, (int *) 0))
	   != EOF) {
	switch (i) {
	case 'p':
	    partner_name = (char *) malloc ((strlen(optarg)+1)*strlen(optarg));
	    strcpy(partner_name, optarg);
	    break;
	case 'P':
	    sscanf(optarg, "%d", &partner_gender);
	    break;
	case 'o':
	    own_name = (char *) malloc ((strlen(optarg)+1)*strlen(optarg));
	    strcpy(own_name, optarg);
	    break;
	case 'O':
	    sscanf(optarg, "%d", &own_gender);
	    break;
	case 'r':
	    reason = (char *) malloc ((strlen(optarg)+1)*strlen(optarg));
	    strcpy(reason, optarg);
	    break;
	case 'h':
	    exit_help();
	    break;
	case 'v':
	    exit_version();
	    break;
	case '?':
	    print_usage(stderr);
	    exit(EXIT_FAILURE);
	    break;
	}
    }
    
    if (own_gender < 0)
	own_gender = OWN_GENDER;
    if (!own_name)
	own_name = OWN_NAME;
	
    if ((partner_gender < 0) || (!partner_name)) {
	print_usage(stderr);
	fprintf(stderr, "%s: partner name or gender not specified.\n", program_name);
	exit(EXIT_FAILURE);
    }

    printf("Dear %s,\n\n\n", partner_name);
    printf("Although we have been together for quite a while now,\n");
    printf("I must inform you that there is another");
    if (partner_gender)
	printf(" man ");
    else
	printf(" woman ");
    printf("in my life.\n\n");
    printf("I had a great time with you, my dear %s, but it's over.\n", partner_name);
    printf("It just didn't seem to work out well because ");
    if (reason)
	printf("%s.\n", reason);
    else
	printf("there was no fire in\nour relationship anymore. ");
    printf("I hope we can still be friends.\n\n");
    printf("May you find many naked ");
    if (own_gender)
	printf("men");
    else
	printf("women");
    printf(" to throw tiny pickles at you.\n\n\n");
    printf("Sincerely,\n\n\n");
    printf("%s\n", own_name);
    
    return 0;
}

void exit_help()
{
	print_usage(stdout);

	printf("\nThe following options are available:\n");
	printf("--help,            ");
	printf("-h          This help.\n");
	printf("--version,         ");
	printf("-v          Version information.\n");
	printf("--own-gender,      ");
	printf("-O GENDER   Set own Y-chromosomes to GENDER.\n");
	printf("--own-name,        ");
	printf("-o NAME     Set own name to NAME.\n");
	printf("--partner-gender,  ");
	printf("-P GENDER   Set partner's Y-chromosomes to GENDER.\n");
	printf("--partner-name,    ");
	printf("-p NAME     Set partner's name to NAME.\n");
printf("\n\
Report bugs to: Cris van Pelt <tribbel@tribe.eu.org>\n");

	exit(EXIT_SUCCESS);
}

void exit_version()
{
	printf("\
%s %s - Break up with a significant other on stdout.\n\
Distributed under the terms of the GPL.\n\
\n\
THIS PACKAGE IS PROVIDED \"AS IS\" AND WITHOUT ANY EXPRESS OR\n\
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n\
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\
\n\
This program is still in it's development stage. It may produce\n\
unwanted results.\
\n\
Copyright (C) 2000 Cris van Pelt <tribbel@tribe.eu.org>.\n", PACKAGE, VERSION);

	exit(EXIT_SUCCESS);
}

void print_usage(FILE * output)
{
	fprintf(output, "Usage: %s -p NAME -P GENDER [OPTIONS]\n", program_name);
}

Log in or registerto write something here or to contact authors.