traveling-salesman / xcode_redirect.hpp
xcode_redirect.hpp
Raw
//
//  xcode_redirect.hpp
//
//  Created by Marcus Darden on 1/13/19.
//  Copyright © 2019 Marcus Darden. All rights reserved.
//
// Usage: add the following line to main().
//    xcode_redirect(argc, argv);

#ifndef xcode_redirect_hpp
#define xcode_redirect_hpp

#include <iostream>
#include <cstdio>

// REQUIRES: argc & argv from main(), and optind from getopt.h
// MODIFIES: optind is incremented until it equals argc
// EFFECTS:
//     Looks for extra arguments after getopt() finishes reading options.
//     It replaces simple shell functionality by using freopen() to change
//     stdin (from < infilename) and stdout (from > outfilename).
inline void xcode_redirect(int argc, char **argv, int optind = 1) {
    while (optind < argc) {
        switch (*argv[optind]) {
            case '<':  // redirect input
                if (!freopen(argv[++optind], "r", stdin)) {
                    std::cerr << "Unable to open input file: " << argv[optind] << std::endl;
                    exit(1);
                }
                break;
            case '>':  // redirect output
                if (!freopen(argv[++optind], "w", stdout)) {
                    std::cerr << "Unable to open output file: " << argv[optind] << std::endl;
                    exit(1);
                }
                break;
        }  // switch
        ++optind;
    }  // while
}  // xcode_redirect()

#endif /* xcode_redirect_hpp */