<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>LCOV - giftcardreader.info - homework-1-kiettnguyen/giftcardreader.c</title> <link rel="stylesheet" type="text/css" href="../gcov.css"> </head> <body> <table width="100%" border=0 cellspacing=0 cellpadding=0> <tr><td class="title">LCOV - code coverage report</td></tr> <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr> <tr> <td width="100%"> <table cellpadding=1 border=0 width="100%"> <tr> <td width="10%" class="headerItem">Current view:</td> <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">homework-1-kiettnguyen</a> - giftcardreader.c<span style="font-size: 80%;"> (source / <a href="giftcardreader.c.func-sort-c.html">functions</a>)</span></td> <td width="5%"></td> <td width="15%"></td> <td width="10%" class="headerCovTableHead">Hit</td> <td width="10%" class="headerCovTableHead">Total</td> <td width="15%" class="headerCovTableHead">Coverage</td> </tr> <tr> <td class="headerItem">Test:</td> <td class="headerValue">giftcardreader.info</td> <td></td> <td class="headerItem">Lines:</td> <td class="headerCovTableEntry">141</td> <td class="headerCovTableEntry">190</td> <td class="headerCovTableEntryLo">74.2 %</td> </tr> <tr> <td class="headerItem">Date:</td> <td class="headerValue">2022-02-18 19:16:56</td> <td></td> <td class="headerItem">Functions:</td> <td class="headerCovTableEntry">6</td> <td class="headerCovTableEntry">6</td> <td class="headerCovTableEntryHi">100.0 %</td> </tr> <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr> </table> </td> </tr> <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr> </table> <table cellpadding=0 cellspacing=0 border=0> <tr> <td><br></td> </tr> <tr> <td> <pre class="sourceHeading"> Line data Source code</pre> <pre class="source"> <a name="1"><span class="lineNum"> 1 </span> : /*</a> <a name="2"><span class="lineNum"> 2 </span> : * Gift Card Reading Application</a> <a name="3"><span class="lineNum"> 3 </span> : * Original Author: Shoddycorp's Cut-Rate Contracting</a> <a name="4"><span class="lineNum"> 4 </span> : * Comments added by: Justin Cappos (JAC) and Brendan Dolan-Gavitt (BDG)</a> <a name="5"><span class="lineNum"> 5 </span> : * Maintainer:</a> <a name="6"><span class="lineNum"> 6 </span> : * Date: 8 July 2020</a> <a name="7"><span class="lineNum"> 7 </span> : */</a> <a name="8"><span class="lineNum"> 8 </span> : </a> <a name="9"><span class="lineNum"> 9 </span> : </a> <a name="10"><span class="lineNum"> 10 </span> : #include "giftcard.h"</a> <a name="11"><span class="lineNum"> 11 </span> : </a> <a name="12"><span class="lineNum"> 12 </span> : #include <stdio.h></a> <a name="13"><span class="lineNum"> 13 </span> : #include <strings.h></a> <a name="14"><span class="lineNum"> 14 </span> : #include <limits.h></a> <a name="15"><span class="lineNum"> 15 </span> : // .,~==== interpreter for THX-1138 assembly ====~,.</a> <a name="16"><span class="lineNum"> 16 </span> : //</a> <a name="17"><span class="lineNum"> 17 </span> : // This is an emulated version of a microcontroller with</a> <a name="18"><span class="lineNum"> 18 </span> : // 16 registers, one flag (the zero flag), and display</a> <a name="19"><span class="lineNum"> 19 </span> : // functionality. Programs can operate on the message</a> <a name="20"><span class="lineNum"> 20 </span> : // buffer and use opcode 0x07 to update the display, so</a> <a name="21"><span class="lineNum"> 21 </span> : // that animated greetings can be created.</a> <a name="22"><span class="lineNum"> 22 </span> : </a> <a name="23"><span class="lineNum"> 23 </span><span class="lineCov"> 1 : void animate(char *msg, unsigned char *program) {</span></a> <a name="24"><span class="lineNum"> 24 </span> : unsigned char regs[16];</a> <a name="25"><span class="lineNum"> 25 </span><span class="lineCov"> 1 : char *mptr = msg; // TODO: how big is this buffer?</span></a> <a name="26"><span class="lineNum"> 26 </span><span class="lineCov"> 1 : unsigned char *pc = program;</span></a> <a name="27"><span class="lineNum"> 27 </span><span class="lineCov"> 1 : int i = 0;</span></a> <a name="28"><span class="lineNum"> 28 </span><span class="lineCov"> 1 : int zf = 0;</span></a> <a name="29"><span class="lineNum"> 29 </span><span class="lineCov"> 1 : int count =0;</span></a> <a name="30"><span class="lineNum"> 30 </span><span class="lineCov"> 1 : int count2 =0;</span></a> <a name="31"><span class="lineNum"> 31 </span><span class="lineCov"> 1 : unsigned char lastpc =0;</span></a> <a name="32"><span class="lineNum"> 32 </span><span class="lineCov"> 53 : while (pc< program+256) {</span></a> <a name="33"><span class="lineNum"> 33 </span> : unsigned char op, arg1, arg2;</a> <a name="34"><span class="lineNum"> 34 </span><span class="lineCov"> 52 : op = *pc;</span></a> <a name="35"><span class="lineNum"> 35 </span><span class="lineCov"> 52 : arg1 = *(pc+1);</span></a> <a name="36"><span class="lineNum"> 36 </span><span class="lineCov"> 52 : arg2 = *(pc+2);</span></a> <a name="37"><span class="lineNum"> 37 </span><span class="lineCov"> 52 : switch (*pc) {</span></a> <a name="38"><span class="lineNum"> 38 </span> : case 0x00:</a> <a name="39"><span class="lineNum"> 39 </span><span class="lineCov"> 51 : break;</span></a> <a name="40"><span class="lineNum"> 40 </span> : case 0x01:</a> <a name="41"><span class="lineNum"> 41 </span><span class="lineNoCov"> 0 : regs[arg1] = *mptr;</span></a> <a name="42"><span class="lineNum"> 42 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="43"><span class="lineNum"> 43 </span> : case 0x02:</a> <a name="44"><span class="lineNum"> 44 </span><span class="lineNoCov"> 0 : if(arg1<0 || arg1>15){</span></a> <a name="45"><span class="lineNum"> 45 </span><span class="lineNoCov"> 0 : exit(0);</span></a> <a name="46"><span class="lineNum"> 46 </span> : } </a> <a name="47"><span class="lineNum"> 47 </span><span class="lineNoCov"> 0 : *mptr = regs[arg1]; //crash here</span></a> <a name="48"><span class="lineNum"> 48 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="49"><span class="lineNum"> 49 </span> : case 0x03:</a> <a name="50"><span class="lineNum"> 50 </span><span class="lineNoCov"> 0 : mptr += (char)arg1;</span></a> <a name="51"><span class="lineNum"> 51 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="52"><span class="lineNum"> 52 </span> : case 0x04:</a> <a name="53"><span class="lineNum"> 53 </span><span class="lineNoCov"> 0 : regs[arg2] = arg1;</span></a> <a name="54"><span class="lineNum"> 54 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="55"><span class="lineNum"> 55 </span> : case 0x05:</a> <a name="56"><span class="lineNum"> 56 </span><span class="lineNoCov"> 0 : regs[arg1] ^= regs[arg2];</span></a> <a name="57"><span class="lineNum"> 57 </span><span class="lineNoCov"> 0 : zf = !regs[arg1];</span></a> <a name="58"><span class="lineNum"> 58 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="59"><span class="lineNum"> 59 </span> : case 0x06:</a> <a name="60"><span class="lineNum"> 60 </span><span class="lineNoCov"> 0 : regs[arg1] += regs[arg2];</span></a> <a name="61"><span class="lineNum"> 61 </span><span class="lineNoCov"> 0 : zf = !regs[arg1];</span></a> <a name="62"><span class="lineNum"> 62 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="63"><span class="lineNum"> 63 </span> : case 0x07:</a> <a name="64"><span class="lineNum"> 64 </span><span class="lineNoCov"> 0 : puts(msg);</span></a> <a name="65"><span class="lineNum"> 65 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="66"><span class="lineNum"> 66 </span> : case 0x08:</a> <a name="67"><span class="lineNum"> 67 </span><span class="lineNoCov"> 0 : goto done;</span></a> <a name="68"><span class="lineNum"> 68 </span> : case 0x09:</a> <a name="69"><span class="lineNum"> 69 </span><span class="lineCov"> 1 : if(pc< program+256+ (unsigned char)arg1){</span></a> <a name="70"><span class="lineNum"> 70 </span><span class="lineCov"> 1 : pc += (unsigned char)arg1;</span></a> <a name="71"><span class="lineNum"> 71 </span><span class="lineCov"> 1 : }</span></a> <a name="72"><span class="lineNum"> 72 </span> : else{</a> <a name="73"><span class="lineNum"> 73 </span><span class="lineNoCov"> 0 : goto done;</span></a> <a name="74"><span class="lineNum"> 74 </span> : }</a> <a name="75"><span class="lineNum"> 75 </span><span class="lineCov"> 1 : break;</span></a> <a name="76"><span class="lineNum"> 76 </span> : case 0x10:</a> <a name="77"><span class="lineNum"> 77 </span><span class="lineNoCov"> 0 : if(pc< program+256+ (unsigned char)arg1){</span></a> <a name="78"><span class="lineNum"> 78 </span><span class="lineNoCov"> 0 : if (zf) pc += (unsigned char)arg1;</span></a> <a name="79"><span class="lineNum"> 79 </span><span class="lineNoCov"> 0 : }</span></a> <a name="80"><span class="lineNum"> 80 </span> : else{</a> <a name="81"><span class="lineNum"> 81 </span><span class="lineNoCov"> 0 : goto done;</span></a> <a name="82"><span class="lineNum"> 82 </span> : }</a> <a name="83"><span class="lineNum"> 83 </span><span class="lineNoCov"> 0 : break;</span></a> <a name="84"><span class="lineNum"> 84 </span> : }</a> <a name="85"><span class="lineNum"> 85 </span><span class="lineCov"> 52 : pc+=3;</span></a> <a name="86"><span class="lineNum"> 86 </span><span class="lineCov"> 52 : count2++;</span></a> <a name="87"><span class="lineNum"> 87 </span><span class="lineCov"> 52 : if (count2 > 80)</span></a> <a name="88"><span class="lineNum"> 88 </span> : {</a> <a name="89"><span class="lineNum"> 89 </span><span class="lineNoCov"> 0 : goto done;</span></a> <a name="90"><span class="lineNum"> 90 </span> : } </a> <a name="91"><span class="lineNum"> 91 </span> : </a> <a name="92"><span class="lineNum"> 92 </span> : }</a> <a name="93"><span class="lineNum"> 93 </span> : done:</a> <a name="94"><span class="lineNum"> 94 </span><span class="lineCov"> 1 : pc =0;</span></a> <a name="95"><span class="lineNum"> 95 </span><span class="lineCov"> 1 : return;</span></a> <a name="96"><span class="lineNum"> 96 </span> : }</a> <a name="97"><span class="lineNum"> 97 </span> : </a> <a name="98"><span class="lineNum"> 98 </span><span class="lineCov"> 4 : int get_gift_card_value(struct this_gift_card *thisone) {</span></a> <a name="99"><span class="lineNum"> 99 </span> : struct gift_card_data *gcd_ptr;</a> <a name="100"><span class="lineNum"> 100 </span> : struct gift_card_record_data *gcrd_ptr;</a> <a name="101"><span class="lineNum"> 101 </span> : struct gift_card_amount_change *gcac_ptr;</a> <a name="102"><span class="lineNum"> 102 </span><span class="lineCov"> 4 : int ret_count = 0;</span></a> <a name="103"><span class="lineNum"> 103 </span> : </a> <a name="104"><span class="lineNum"> 104 </span><span class="lineCov"> 4 : gcd_ptr = thisone->gift_card_data;</span></a> <a name="105"><span class="lineNum"> 105 </span><span class="lineCov"> 8 : for(int i=0;i<gcd_ptr->number_of_gift_card_records; i++) {</span></a> <a name="106"><span class="lineNum"> 106 </span><span class="lineCov"> 4 : gcrd_ptr = (struct gift_card_record_data *) gcd_ptr->gift_card_record_data[i];</span></a> <a name="107"><span class="lineNum"> 107 </span><span class="lineCov"> 4 : if (gcrd_ptr->type_of_record == 1) {</span></a> <a name="108"><span class="lineNum"> 108 </span><span class="lineCov"> 2 : gcac_ptr = gcrd_ptr->actual_record;</span></a> <a name="109"><span class="lineNum"> 109 </span><span class="lineCov"> 2 : ret_count += gcac_ptr->amount_added;</span></a> <a name="110"><span class="lineNum"> 110 </span><span class="lineCov"> 2 : } </span></a> <a name="111"><span class="lineNum"> 111 </span><span class="lineCov"> 4 : }</span></a> <a name="112"><span class="lineNum"> 112 </span><span class="lineCov"> 4 : return ret_count;</span></a> <a name="113"><span class="lineNum"> 113 </span> : }</a> <a name="114"><span class="lineNum"> 114 </span> : </a> <a name="115"><span class="lineNum"> 115 </span><span class="lineCov"> 3 : void print_gift_card_info(struct this_gift_card *thisone) {</span></a> <a name="116"><span class="lineNum"> 116 </span> : struct gift_card_data *gcd_ptr;</a> <a name="117"><span class="lineNum"> 117 </span> : struct gift_card_record_data *gcrd_ptr;</a> <a name="118"><span class="lineNum"> 118 </span> : struct gift_card_amount_change *gcac_ptr;</a> <a name="119"><span class="lineNum"> 119 </span> : struct gift_card_program *gcp_ptr;</a> <a name="120"><span class="lineNum"> 120 </span> : </a> <a name="121"><span class="lineNum"> 121 </span><span class="lineCov"> 3 : gcd_ptr = thisone->gift_card_data;</span></a> <a name="122"><span class="lineNum"> 122 </span><span class="lineCov"> 3 : printf(" Merchant ID: %32.32s\n",gcd_ptr->merchant_id);</span></a> <a name="123"><span class="lineNum"> 123 </span><span class="lineCov"> 3 : printf(" Customer ID: %32.32s\n",gcd_ptr->customer_id);</span></a> <a name="124"><span class="lineNum"> 124 </span><span class="lineCov"> 3 : printf(" Num records: %d\n",gcd_ptr->number_of_gift_card_records);</span></a> <a name="125"><span class="lineNum"> 125 </span><span class="lineCov"> 6 : for(int i=0;i<gcd_ptr->number_of_gift_card_records; i++) {</span></a> <a name="126"><span class="lineNum"> 126 </span><span class="lineCov"> 3 : gcrd_ptr = (struct gift_card_record_data *) gcd_ptr->gift_card_record_data[i];</span></a> <a name="127"><span class="lineNum"> 127 </span><span class="lineCov"> 3 : if (gcrd_ptr->type_of_record == 1) {</span></a> <a name="128"><span class="lineNum"> 128 </span><span class="lineCov"> 1 : printf(" record_type: amount_change\n");</span></a> <a name="129"><span class="lineNum"> 129 </span><span class="lineCov"> 1 : gcac_ptr = gcrd_ptr->actual_record;</span></a> <a name="130"><span class="lineNum"> 130 </span><span class="lineCov"> 1 : printf(" amount_added: %d\n",gcac_ptr->amount_added);</span></a> <a name="131"><span class="lineNum"> 131 </span><span class="lineCov"> 1 : if (gcac_ptr->amount_added>0) {</span></a> <a name="132"><span class="lineNum"> 132 </span><span class="lineCov"> 1 : printf(" signature: %32.32s\n",gcac_ptr->actual_signature);</span></a> <a name="133"><span class="lineNum"> 133 </span><span class="lineCov"> 1 : }</span></a> <a name="134"><span class="lineNum"> 134 </span><span class="lineCov"> 1 : } </span></a> <a name="135"><span class="lineNum"> 135 </span><span class="lineCov"> 2 : else if (gcrd_ptr->type_of_record == 2) {</span></a> <a name="136"><span class="lineNum"> 136 </span><span class="lineCov"> 1 : printf(" record_type: message\n");</span></a> <a name="137"><span class="lineNum"> 137 </span><span class="lineCov"> 1 : printf(" message: %s\n",(char *)gcrd_ptr->actual_record);</span></a> <a name="138"><span class="lineNum"> 138 </span><span class="lineCov"> 1 : }</span></a> <a name="139"><span class="lineNum"> 139 </span><span class="lineCov"> 1 : else if (gcrd_ptr->type_of_record == 3) {</span></a> <a name="140"><span class="lineNum"> 140 </span><span class="lineCov"> 1 : gcp_ptr = gcrd_ptr->actual_record;</span></a> <a name="141"><span class="lineNum"> 141 </span><span class="lineCov"> 1 : printf(" record_type: animated message\n");</span></a> <a name="142"><span class="lineNum"> 142 </span> : // BDG: Hmm... is message guaranteed to be null-terminated?</a> <a name="143"><span class="lineNum"> 143 </span><span class="lineCov"> 1 : printf(" message: %s\n", gcp_ptr->message);</span></a> <a name="144"><span class="lineNum"> 144 </span><span class="lineCov"> 1 : printf(" [running embedded program] \n");</span></a> <a name="145"><span class="lineNum"> 145 </span><span class="lineCov"> 1 : animate(gcp_ptr->message, gcp_ptr->program);</span></a> <a name="146"><span class="lineNum"> 146 </span><span class="lineCov"> 1 : }</span></a> <a name="147"><span class="lineNum"> 147 </span><span class="lineCov"> 3 : }</span></a> <a name="148"><span class="lineNum"> 148 </span><span class="lineCov"> 3 : printf(" Total value: %d\n\n",get_gift_card_value(thisone));</span></a> <a name="149"><span class="lineNum"> 149 </span><span class="lineCov"> 3 : }</span></a> <a name="150"><span class="lineNum"> 150 </span> : </a> <a name="151"><span class="lineNum"> 151 </span> : // Added to support web functionalities</a> <a name="152"><span class="lineNum"> 152 </span><span class="lineCov"> 1 : void gift_card_json(struct this_gift_card *thisone) {</span></a> <a name="153"><span class="lineNum"> 153 </span> : struct gift_card_data *gcd_ptr;</a> <a name="154"><span class="lineNum"> 154 </span> : struct gift_card_record_data *gcrd_ptr;</a> <a name="155"><span class="lineNum"> 155 </span> : struct gift_card_amount_change *gcac_ptr;</a> <a name="156"><span class="lineNum"> 156 </span><span class="lineCov"> 1 : gcd_ptr = thisone->gift_card_data;</span></a> <a name="157"><span class="lineNum"> 157 </span><span class="lineCov"> 1 : printf("{\n");</span></a> <a name="158"><span class="lineNum"> 158 </span><span class="lineCov"> 1 : printf(" \"merchant_id\": \"%32.32s\",\n", gcd_ptr->merchant_id);</span></a> <a name="159"><span class="lineNum"> 159 </span><span class="lineCov"> 1 : printf(" \"customer_id\": \"%32.32s\",\n", gcd_ptr->customer_id);</span></a> <a name="160"><span class="lineNum"> 160 </span><span class="lineCov"> 1 : printf(" \"total_value\": %d,\n", get_gift_card_value(thisone));</span></a> <a name="161"><span class="lineNum"> 161 </span><span class="lineCov"> 1 : printf(" \"records\": [\n");</span></a> <a name="162"><span class="lineNum"> 162 </span><span class="lineCov"> 2 : for(int i=0;i<gcd_ptr->number_of_gift_card_records; i++) {</span></a> <a name="163"><span class="lineNum"> 163 </span><span class="lineCov"> 1 : gcrd_ptr = (struct gift_card_record_data *) gcd_ptr->gift_card_record_data[i];</span></a> <a name="164"><span class="lineNum"> 164 </span><span class="lineCov"> 1 : printf(" {\n");</span></a> <a name="165"><span class="lineNum"> 165 </span><span class="lineCov"> 1 : if (gcrd_ptr->type_of_record == 1) {</span></a> <a name="166"><span class="lineNum"> 166 </span><span class="lineCov"> 1 : printf(" \"record_type\": \"amount_change\",\n");</span></a> <a name="167"><span class="lineNum"> 167 </span><span class="lineCov"> 1 : gcac_ptr = gcrd_ptr->actual_record;</span></a> <a name="168"><span class="lineNum"> 168 </span><span class="lineCov"> 1 : printf(" \"amount_added\": %d,\n",gcac_ptr->amount_added);</span></a> <a name="169"><span class="lineNum"> 169 </span><span class="lineCov"> 1 : if (gcac_ptr->amount_added>0) {</span></a> <a name="170"><span class="lineNum"> 170 </span> : // printf(" \"signature\": \"%32.32s\"\n",gcac_ptr->actual_signature);</a> <a name="171"><span class="lineNum"> 171 </span><span class="lineCov"> 1 : }</span></a> <a name="172"><span class="lineNum"> 172 </span><span class="lineCov"> 1 : }</span></a> <a name="173"><span class="lineNum"> 173 </span><span class="lineNoCov"> 0 : else if (gcrd_ptr->type_of_record == 2) {</span></a> <a name="174"><span class="lineNum"> 174 </span><span class="lineNoCov"> 0 : printf(" \"record_type\": \"message\",\n");</span></a> <a name="175"><span class="lineNum"> 175 </span><span class="lineNoCov"> 0 : printf(" \"message\": \"%s\"\n",(char *)gcrd_ptr->actual_record);</span></a> <a name="176"><span class="lineNum"> 176 </span><span class="lineNoCov"> 0 : }</span></a> <a name="177"><span class="lineNum"> 177 </span><span class="lineNoCov"> 0 : else if (gcrd_ptr->type_of_record == 3) {</span></a> <a name="178"><span class="lineNum"> 178 </span><span class="lineNoCov"> 0 : struct gift_card_program *gcp = gcrd_ptr->actual_record;</span></a> <a name="179"><span class="lineNum"> 179 </span><span class="lineNoCov"> 0 : printf(" \"record_type\": \"animated message\",\n");</span></a> <a name="180"><span class="lineNum"> 180 </span><span class="lineNoCov"> 0 : printf(" \"message\": \"%s\",\n",gcp->message);</span></a> <a name="181"><span class="lineNum"> 181 </span> : // programs are binary so we will hex for the json</a> <a name="182"><span class="lineNum"> 182 </span><span class="lineNoCov"> 0 : char *hexchars = "01234567890abcdef";</span></a> <a name="183"><span class="lineNum"> 183 </span> : char program_hex[512+1];</a> <a name="184"><span class="lineNum"> 184 </span><span class="lineNoCov"> 0 : program_hex[512] = '\0';</span></a> <a name="185"><span class="lineNum"> 185 </span> : int i;</a> <a name="186"><span class="lineNum"> 186 </span><span class="lineNoCov"> 0 : for(i = 0; i < 256; i++) {</span></a> <a name="187"><span class="lineNum"> 187 </span><span class="lineNoCov"> 0 : program_hex[i*2] = hexchars[((gcp->program[i] & 0xf0) >> 4)];</span></a> <a name="188"><span class="lineNum"> 188 </span><span class="lineNoCov"> 0 : program_hex[i*2+1] = hexchars[(gcp->program[i] & 0x0f)];</span></a> <a name="189"><span class="lineNum"> 189 </span><span class="lineNoCov"> 0 : }</span></a> <a name="190"><span class="lineNum"> 190 </span><span class="lineNoCov"> 0 : printf(" \"program\": \"%s\"\n",program_hex);</span></a> <a name="191"><span class="lineNum"> 191 </span><span class="lineNoCov"> 0 : }</span></a> <a name="192"><span class="lineNum"> 192 </span><span class="lineCov"> 1 : if (i < gcd_ptr->number_of_gift_card_records-1)</span></a> <a name="193"><span class="lineNum"> 193 </span><span class="lineNoCov"> 0 : printf(" },\n");</span></a> <a name="194"><span class="lineNum"> 194 </span> : else</a> <a name="195"><span class="lineNum"> 195 </span><span class="lineCov"> 1 : printf(" }\n");</span></a> <a name="196"><span class="lineNum"> 196 </span><span class="lineCov"> 1 : }</span></a> <a name="197"><span class="lineNum"> 197 </span><span class="lineCov"> 1 : printf(" ]\n");</span></a> <a name="198"><span class="lineNum"> 198 </span><span class="lineCov"> 1 : printf("}\n");</span></a> <a name="199"><span class="lineNum"> 199 </span><span class="lineCov"> 1 : }</span></a> <a name="200"><span class="lineNum"> 200 </span> : </a> <a name="201"><span class="lineNum"> 201 </span> : </a> <a name="202"><span class="lineNum"> 202 </span><span class="lineCov"> 4 : struct this_gift_card *gift_card_reader(FILE *input_fd) {</span></a> <a name="203"><span class="lineNum"> 203 </span> : </a> <a name="204"><span class="lineNum"> 204 </span><span class="lineCov"> 4 : struct this_gift_card *ret_val = malloc(sizeof(struct this_gift_card));</span></a> <a name="205"><span class="lineNum"> 205 </span> : void *optr;</a> <a name="206"><span class="lineNum"> 206 </span> : void *ptr;</a> <a name="207"><span class="lineNum"> 207 </span> : </a> <a name="208"><span class="lineNum"> 208 </span> : // Loop to do the whole file</a> <a name="209"><span class="lineNum"> 209 </span><span class="lineCov"> 8 : while (!feof(input_fd)) {</span></a> <a name="210"><span class="lineNum"> 210 </span> : </a> <a name="211"><span class="lineNum"> 211 </span> : struct gift_card_data *gcd_ptr;</a> <a name="212"><span class="lineNum"> 212 </span> : /* JAC: Why aren't return types checked? */</a> <a name="213"><span class="lineNum"> 213 </span><span class="lineCov"> 4 : fread(&ret_val->num_bytes, 4,1, input_fd);</span></a> <a name="214"><span class="lineNum"> 214 </span><span class="lineCov"> 4 : if ( ret_val->num_bytes < 0 || ret_val->num_bytes > 1024*1024*10)</span></a> <a name="215"><span class="lineNum"> 215 </span> : {</a> <a name="216"><span class="lineNum"> 216 </span><span class="lineNoCov"> 0 : exit(0);</span></a> <a name="217"><span class="lineNum"> 217 </span> : }</a> <a name="218"><span class="lineNum"> 218 </span> : </a> <a name="219"><span class="lineNum"> 219 </span> : </a> <a name="220"><span class="lineNum"> 220 </span> : // Make something the size of the rest and read it in</a> <a name="221"><span class="lineNum"> 221 </span><span class="lineCov"> 4 : ptr = malloc(ret_val->num_bytes);</span></a> <a name="222"><span class="lineNum"> 222 </span><span class="lineCov"> 4 : fread(ptr, ret_val->num_bytes, 1, input_fd);</span></a> <a name="223"><span class="lineNum"> 223 </span> : </a> <a name="224"><span class="lineNum"> 224 </span><span class="lineCov"> 4 : optr = ptr-4;</span></a> <a name="225"><span class="lineNum"> 225 </span> : </a> <a name="226"><span class="lineNum"> 226 </span><span class="lineCov"> 4 : gcd_ptr = ret_val->gift_card_data = malloc(sizeof(struct gift_card_data));</span></a> <a name="227"><span class="lineNum"> 227 </span><span class="lineCov"> 4 : gcd_ptr->merchant_id = ptr;</span></a> <a name="228"><span class="lineNum"> 228 </span><span class="lineCov"> 4 : ptr += 32; </span></a> <a name="229"><span class="lineNum"> 229 </span> : // printf("VD: %d\n",(int)ptr - (int) gcd_ptr->merchant_id);</a> <a name="230"><span class="lineNum"> 230 </span><span class="lineCov"> 4 : gcd_ptr->customer_id = ptr;</span></a> <a name="231"><span class="lineNum"> 231 </span><span class="lineCov"> 4 : ptr += 32; </span></a> <a name="232"><span class="lineNum"> 232 </span> : /* JAC: Something seems off here... */</a> <a name="233"><span class="lineNum"> 233 </span><span class="lineCov"> 4 : gcd_ptr->number_of_gift_card_records = *((char *)ptr);</span></a> <a name="234"><span class="lineNum"> 234 </span><span class="lineCov"> 4 : ptr += 4;</span></a> <a name="235"><span class="lineNum"> 235 </span> : </a> <a name="236"><span class="lineNum"> 236 </span><span class="lineCov"> 4 : gcd_ptr->gift_card_record_data = (void *)malloc(gcd_ptr->number_of_gift_card_records*sizeof(void*));</span></a> <a name="237"><span class="lineNum"> 237 </span> : </a> <a name="238"><span class="lineNum"> 238 </span> : // Now ptr points at the gift card recrod data</a> <a name="239"><span class="lineNum"> 239 </span><span class="lineCov"> 8 : for (int i=0; i < gcd_ptr->number_of_gift_card_records; i++){</span></a> <a name="240"><span class="lineNum"> 240 </span> : // printf("i: %d\n",i);</a> <a name="241"><span class="lineNum"> 241 </span> : struct gift_card_record_data *gcrd_ptr;</a> <a name="242"><span class="lineNum"> 242 </span><span class="lineCov"> 4 : gcrd_ptr = gcd_ptr->gift_card_record_data[i] = malloc(sizeof(struct gift_card_record_data));</span></a> <a name="243"><span class="lineNum"> 243 </span> : struct gift_card_amount_change *gcac_ptr;</a> <a name="244"><span class="lineNum"> 244 </span><span class="lineCov"> 4 : gcac_ptr = gcrd_ptr->actual_record = malloc(sizeof(struct gift_card_record_data));</span></a> <a name="245"><span class="lineNum"> 245 </span> : struct gift_card_program *gcp_ptr;</a> <a name="246"><span class="lineNum"> 246 </span><span class="lineCov"> 4 : gcp_ptr = malloc(sizeof(struct gift_card_program));</span></a> <a name="247"><span class="lineNum"> 247 </span> : </a> <a name="248"><span class="lineNum"> 248 </span><span class="lineCov"> 4 : gcrd_ptr->record_size_in_bytes = *((char *)ptr);</span></a> <a name="249"><span class="lineNum"> 249 </span> : //printf("rec at %x, %d bytes\n", ptr - optr, gcrd_ptr->record_size_in_bytes); </a> <a name="250"><span class="lineNum"> 250 </span><span class="lineCov"> 4 : ptr += 4; </span></a> <a name="251"><span class="lineNum"> 251 </span> : //printf("record_data: %d\n",gcrd_ptr->record_size_in_bytes);</a> <a name="252"><span class="lineNum"> 252 </span><span class="lineCov"> 4 : gcrd_ptr->type_of_record = *((char *)ptr);</span></a> <a name="253"><span class="lineNum"> 253 </span><span class="lineCov"> 4 : ptr += 4; </span></a> <a name="254"><span class="lineNum"> 254 </span> : //printf("type of rec: %d\n", gcrd_ptr->type_of_record);</a> <a name="255"><span class="lineNum"> 255 </span> : </a> <a name="256"><span class="lineNum"> 256 </span> : // amount change</a> <a name="257"><span class="lineNum"> 257 </span><span class="lineCov"> 4 : if (gcrd_ptr->type_of_record == 1) {</span></a> <a name="258"><span class="lineNum"> 258 </span><span class="lineCov"> 2 : gcac_ptr->amount_added = *((int*) ptr);</span></a> <a name="259"><span class="lineNum"> 259 </span><span class="lineCov"> 2 : ptr += 4; </span></a> <a name="260"><span class="lineNum"> 260 </span> : </a> <a name="261"><span class="lineNum"> 261 </span> : // don't need a sig if negative</a> <a name="262"><span class="lineNum"> 262 </span> : /* JAC: something seems off here */</a> <a name="263"><span class="lineNum"> 263 </span><span class="lineCov"> 2 : if (gcac_ptr < 0) break;</span></a> <a name="264"><span class="lineNum"> 264 </span> : </a> <a name="265"><span class="lineNum"> 265 </span><span class="lineCov"> 2 : gcac_ptr->actual_signature = ptr;</span></a> <a name="266"><span class="lineNum"> 266 </span><span class="lineCov"> 2 : ptr+=32;</span></a> <a name="267"><span class="lineNum"> 267 </span><span class="lineCov"> 2 : }</span></a> <a name="268"><span class="lineNum"> 268 </span> : // message</a> <a name="269"><span class="lineNum"> 269 </span><span class="lineCov"> 4 : if (gcrd_ptr->type_of_record == 2) {</span></a> <a name="270"><span class="lineNum"> 270 </span><span class="lineCov"> 1 : gcrd_ptr->actual_record = ptr;</span></a> <a name="271"><span class="lineNum"> 271 </span> : // printf("ptr: %d\n",ptr);</a> <a name="272"><span class="lineNum"> 272 </span> : </a> <a name="273"><span class="lineNum"> 273 </span> : // advance by the string size + 1 for nul</a> <a name="274"><span class="lineNum"> 274 </span> : // BDG: does not seem right</a> <a name="275"><span class="lineNum"> 275 </span><span class="lineCov"> 1 : ptr=ptr+strlen((char *)gcrd_ptr->actual_record)+1;</span></a> <a name="276"><span class="lineNum"> 276 </span> : // printf("ptr: %d\n",ptr);</a> <a name="277"><span class="lineNum"> 277 </span> : </a> <a name="278"><span class="lineNum"> 278 </span><span class="lineCov"> 1 : }</span></a> <a name="279"><span class="lineNum"> 279 </span> : // BDG: gift cards can run code?? Might want to check this one carefully...</a> <a name="280"><span class="lineNum"> 280 </span> : // text animatino (BETA)</a> <a name="281"><span class="lineNum"> 281 </span><span class="lineCov"> 4 : if (gcrd_ptr->type_of_record == 3) {</span></a> <a name="282"><span class="lineNum"> 282 </span><span class="lineCov"> 1 : gcp_ptr->message = malloc(32);</span></a> <a name="283"><span class="lineNum"> 283 </span><span class="lineCov"> 1 : gcp_ptr->program = malloc(256);</span></a> <a name="284"><span class="lineNum"> 284 </span><span class="lineCov"> 1 : memcpy(gcp_ptr->message, ptr, 32);</span></a> <a name="285"><span class="lineNum"> 285 </span><span class="lineCov"> 1 : ptr+=32;</span></a> <a name="286"><span class="lineNum"> 286 </span><span class="lineCov"> 1 : memcpy(gcp_ptr->program, ptr, 256);</span></a> <a name="287"><span class="lineNum"> 287 </span><span class="lineCov"> 1 : ptr+=256;</span></a> <a name="288"><span class="lineNum"> 288 </span><span class="lineCov"> 1 : gcrd_ptr->actual_record = gcp_ptr;</span></a> <a name="289"><span class="lineNum"> 289 </span><span class="lineCov"> 1 : }</span></a> <a name="290"><span class="lineNum"> 290 </span><span class="lineCov"> 4 : }</span></a> <a name="291"><span class="lineNum"> 291 </span> : }</a> <a name="292"><span class="lineNum"> 292 </span><span class="lineCov"> 4 : return ret_val;</span></a> <a name="293"><span class="lineNum"> 293 </span> : }</a> <a name="294"><span class="lineNum"> 294 </span> : </a> <a name="295"><span class="lineNum"> 295 </span> : struct this_gift_card *thisone;</a> <a name="296"><span class="lineNum"> 296 </span> : </a> <a name="297"><span class="lineNum"> 297 </span><span class="lineCov"> 4 : int main(int argc, char **argv) {</span></a> <a name="298"><span class="lineNum"> 298 </span><span class="lineCov"> 4 : if (argc != 3) {</span></a> <a name="299"><span class="lineNum"> 299 </span><span class="lineNoCov"> 0 : fprintf(stderr, "usage: %s <1|2> file.gft\n", argv[0]);</span></a> <a name="300"><span class="lineNum"> 300 </span><span class="lineNoCov"> 0 : fprintf(stderr, " - Use 1 for text output, 2 for JSON output\n");</span></a> <a name="301"><span class="lineNum"> 301 </span><span class="lineNoCov"> 0 : return 1;</span></a> <a name="302"><span class="lineNum"> 302 </span> : }</a> <a name="303"><span class="lineNum"> 303 </span><span class="lineCov"> 4 : FILE *input_fd = fopen(argv[2],"r");</span></a> <a name="304"><span class="lineNum"> 304 </span><span class="lineCov"> 4 : if (!input_fd) {</span></a> <a name="305"><span class="lineNum"> 305 </span><span class="lineNoCov"> 0 : fprintf(stderr, "error opening file\n");</span></a> <a name="306"><span class="lineNum"> 306 </span><span class="lineNoCov"> 0 : return 1;</span></a> <a name="307"><span class="lineNum"> 307 </span> : }</a> <a name="308"><span class="lineNum"> 308 </span><span class="lineCov"> 4 : thisone = gift_card_reader(input_fd);</span></a> <a name="309"><span class="lineNum"> 309 </span><span class="lineCov"> 4 : if (argv[1][0] == '1') print_gift_card_info(thisone);</span></a> <a name="310"><span class="lineNum"> 310 </span><span class="lineCov"> 1 : else if (argv[1][0] == '2') gift_card_json(thisone);</span></a> <a name="311"><span class="lineNum"> 311 </span> : </a> <a name="312"><span class="lineNum"> 312 </span><span class="lineCov"> 4 : return 0;</span></a> <a name="313"><span class="lineNum"> 313 </span><span class="lineCov"> 4 : }</span></a> </pre> </td> </tr> </table> <br> <table width="100%" border=0 cellspacing=0 cellpadding=0> <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr> <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.15</a></td></tr> </table> <br> </body> </html>