[thin_rmap] region parsing
This commit is contained in:
		@@ -24,3 +24,7 @@ When(/^I run thin_check with (.*?)$/) do |opts|
 | 
			
		||||
  run_simple("thin_check #{opts} #{dev_file}", false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
When(/^I run thin_rmap with (.*?)$/) do |opts|
 | 
			
		||||
  run_simple("thin_rmap #{opts} #{dev_file}", false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,3 +47,63 @@ Feature: thin_rmap
 | 
			
		||||
  Scenario: Unrecognised option should cause failure
 | 
			
		||||
    When I run `thin_rmap --unleash-the-hedeghogs`
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Valid region format should pass
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 23..7890
 | 
			
		||||
    Then it should pass
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (comma instean of dots)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 23,7890
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (second number a word)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 23..six
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (first number a word)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region four..7890
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (end is lower than begin)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 89..88
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (end is equal to begin)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 89..89
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (no begin)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region ..89
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (no end)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 89..
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (no region at all)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Invalid region format should fail (three dots)
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 89...99
 | 
			
		||||
    Then it should fail
 | 
			
		||||
 | 
			
		||||
  Scenario: Multiple regions should pass
 | 
			
		||||
    Given valid metadata
 | 
			
		||||
    When I run thin_rmap with --region 1..23 --region 45..78
 | 
			
		||||
    Then it should pass
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
#include <libgen.h>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "version.h"
 | 
			
		||||
@@ -19,9 +20,30 @@ namespace {
 | 
			
		||||
 | 
			
		||||
	int rmap(string const &path, vector<region> const ®ions) {
 | 
			
		||||
		cerr << "Not implemented" << endl;
 | 
			
		||||
		return 1;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	region parse_region(string const &str) {
 | 
			
		||||
		istringstream in(str);
 | 
			
		||||
 | 
			
		||||
		char dots[2] = {'\0', '\0'};
 | 
			
		||||
		block_address begin, end;
 | 
			
		||||
 | 
			
		||||
		in >> begin;
 | 
			
		||||
		in.read(dots, sizeof(dots));
 | 
			
		||||
		if (dots[0] != '.' || dots[1] != '.')
 | 
			
		||||
			throw runtime_error("badly formed region (no dots)");
 | 
			
		||||
		in >> end;
 | 
			
		||||
 | 
			
		||||
		if (in.fail())
 | 
			
		||||
			throw runtime_error("badly formed region (couldn't parse numbers)");
 | 
			
		||||
 | 
			
		||||
		if (end <= begin)
 | 
			
		||||
			throw runtime_error("badly formed region (end <= begin)");
 | 
			
		||||
 | 
			
		||||
		return region(begin, end);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	void usage(ostream &out, string const &cmd) {
 | 
			
		||||
		out << "Usage: " << cmd << " [options] {device|file}" << endl
 | 
			
		||||
		    << "Options:" << endl
 | 
			
		||||
@@ -60,6 +82,7 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
		case 1:
 | 
			
		||||
			// region
 | 
			
		||||
			regions.push_back(parse_region(optarg));
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user