diff --git a/.bundle/config b/.bundle/config index 2369228816d4670ce70d83e414bf1a7b8f30a9de..dcbe76826522d10512a7897a0a94ec20cd67208e 100644 --- a/.bundle/config +++ b/.bundle/config @@ -1,2 +1,3 @@ --- -BUNDLE_PATH: "vendor/bundle" +BUNDLE_PATH: "vendor" +BUNDLE_NO_INSTALL: "true" diff --git a/Gemfile b/Gemfile index f08d5a64f147490675596ff51c82d7359a1fd440..995e04938704bc0e1c17e31a7fbd17962ab36ad4 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,8 @@ gem "jekyll", "~> 3.6.0" # If you have any plugins, put them here! group :jekyll_plugins do gem "jekyll-feed", "~> 0.6" - gem "jekyll-menus" + gem "jekyll-menus", "0.6" + gem 'jekyll-multiple-languages-plugin' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Gemfile.lock b/Gemfile.lock index deac11c5ab929f037d1df3c1bdd1983d270fded7..aa9919b7acac36edbad90d351883ce0d81d4618a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,10 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - ffi (1.9.25) + ffi (1.11.1) forwardable-extended (2.6.0) jekyll (3.6.3) addressable (~> 2.4) @@ -17,31 +17,31 @@ GEM pathutil (~> 0.9) rouge (>= 1.7, < 3) safe_yaml (~> 1.0) - jekyll-feed (0.9.2) + jekyll-feed (0.11.0) jekyll (~> 3.3) jekyll-menus (0.6.0) jekyll (~> 3.1) + jekyll-multiple-languages-plugin (1.6.0) + jekyll (>= 2.0, < 4.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) jekyll-watch (1.5.1) listen (~> 3.0) kramdown (1.17.0) - liquid (4.0.1) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) + liquid (4.0.3) + listen (3.2.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - pathutil (0.16.1) + pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (3.0.3) + public_suffix (4.0.1) rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) + rb-inotify (0.10.0) + ffi (~> 1.0) rouge (2.2.1) - ruby_dep (1.5.0) - safe_yaml (1.0.4) - sass (3.6.0) + safe_yaml (1.0.5) + sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) @@ -53,8 +53,9 @@ PLATFORMS DEPENDENCIES jekyll (~> 3.6.0) jekyll-feed (~> 0.6) - jekyll-menus + jekyll-menus (= 0.6) + jekyll-multiple-languages-plugin tzinfo-data BUNDLED WITH - 1.16.2 + 1.17.2 diff --git a/_config.yml b/_config.yml index e26efeed19fa6a289e81c7d274f9362a3fb29d90..d16c13eaf36a384d5fa6851d73eac3d52e2dd1f7 100644 --- a/_config.yml +++ b/_config.yml @@ -3,14 +3,17 @@ title: IRMA author: Privacy by Design Foundation email: '' description: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. -baseurl: "/" +baseurl: "" url: '' +languages: ["nl", "en", "de"] +exclude_from_localizations: ["uploads", css"] defaults: - scope: path: '' values: layout: default markdown: kramdown -gems: +plugins: - jekyll-feed - jekyll-menus +- jekyll-multiple-languages-plugin diff --git a/_i18n/de.yml b/_i18n/de.yml new file mode 100644 index 0000000000000000000000000000000000000000..f16f52695206162abb89b66f9b54fab0a19f3110 --- /dev/null +++ b/_i18n/de.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_i18n/en.yml b/_i18n/en.yml new file mode 100644 index 0000000000000000000000000000000000000000..f16f52695206162abb89b66f9b54fab0a19f3110 --- /dev/null +++ b/_i18n/en.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
  • Als je de website bekijkt op + je computer of laptop en je drukt op die login knop verschijnt er een QR code. + Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een + knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of + je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben + je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het + indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin + verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op + OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed + is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_i18n/nl.yml b/_i18n/nl.yml new file mode 100644 index 0000000000000000000000000000000000000000..f16f52695206162abb89b66f9b54fab0a19f3110 --- /dev/null +++ b/_i18n/nl.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
  • Als je de website bekijkt op + je computer of laptop en je drukt op die login knop verschijnt er een QR code. + Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een + knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of + je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben + je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het + indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin + verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op + OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed + is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_includes/block-cta-bar.html b/_includes/block-cta-bar.html deleted file mode 100644 index 2ee6cfbea3f388e1306e6ea23446d3e844f3456d..0000000000000000000000000000000000000000 --- a/_includes/block-cta-bar.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
-

{{ section.content }}

-
-
-
- - -
-
-
-
-
\ No newline at end of file diff --git a/_includes/block-feature-1.html b/_includes/block-feature-1.html deleted file mode 100644 index 0caab0bc4e45c5e99e7b1608418fe3fe5cfee71f..0000000000000000000000000000000000000000 --- a/_includes/block-feature-1.html +++ /dev/null @@ -1,17 +0,0 @@ -{% if section.media_alignment and section.media_alignment == "Left" %} -{% include block-feature-2.html %} -{% else %} -
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
- {{ section.media.alt_text }} -
-
-
-
-{% endif %} \ No newline at end of file diff --git a/_includes/block-feature-2.html b/_includes/block-feature-2.html deleted file mode 100644 index 09890e3ec461c3b882ec293d47947fdc4c3b84b1..0000000000000000000000000000000000000000 --- a/_includes/block-feature-2.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
- {{ section.media.alt_text }} -
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-footer-1.html b/_includes/block-footer-1.html deleted file mode 100644 index a7cb876a872d75c996ee457ad39fb30515b773e4..0000000000000000000000000000000000000000 --- a/_includes/block-footer-1.html +++ /dev/null @@ -1,5 +0,0 @@ -
-
-

{{ section.content }}

-
-
\ No newline at end of file diff --git a/_includes/block-header-1.html b/_includes/block-header-1.html deleted file mode 100644 index d630cd1d8d00036c8b928c3043af279f48509792..0000000000000000000000000000000000000000 --- a/_includes/block-header-1.html +++ /dev/null @@ -1,23 +0,0 @@ -
- - - - -
\ No newline at end of file diff --git a/_includes/block-header-2.html b/_includes/block-header-2.html deleted file mode 100644 index e156330924a7bc04762517091cd94dd3d01b284f..0000000000000000000000000000000000000000 --- a/_includes/block-header-2.html +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - - -
\ No newline at end of file diff --git a/_includes/block-header-3.html b/_includes/block-header-3.html deleted file mode 100644 index 3b8b47dbc096b0d62d692a38b41d366057aadf8c..0000000000000000000000000000000000000000 --- a/_includes/block-header-3.html +++ /dev/null @@ -1,9 +0,0 @@ -
- - - -
\ No newline at end of file diff --git a/_includes/block-hero-1.html b/_includes/block-hero-1.html deleted file mode 100644 index 6d4de005fd9c866fa1cdfe461624e8cac338fb22..0000000000000000000000000000000000000000 --- a/_includes/block-hero-1.html +++ /dev/null @@ -1,5 +0,0 @@ -
-
-

{{ section.heading }}

-
-
\ No newline at end of file diff --git a/_includes/block-hero-2.html b/_includes/block-hero-2.html deleted file mode 100644 index f7589182323b970a0b1c1e04afe28c52ee2c6e12..0000000000000000000000000000000000000000 --- a/_includes/block-hero-2.html +++ /dev/null @@ -1,20 +0,0 @@ -
-
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

- {% if section.cta and section.cta.enabled == true %} - {{ section.cta.button_text }} - {% endif %} -
-
- {{ section.image.alt_text }} -
-
-
-
\ No newline at end of file diff --git a/_includes/block-irma-1.html b/_includes/block-irma-1.html deleted file mode 100644 index c28fff6f39599f3e9660e06ea6a92003b400eac9..0000000000000000000000000000000000000000 --- a/_includes/block-irma-1.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
-
-

{{ section.heading }}

-
-
\ No newline at end of file diff --git a/_includes/block-faq-1.html b/_includes/block-irma-faq.html similarity index 80% rename from _includes/block-faq-1.html rename to _includes/block-irma-faq.html index 7dc796e44c508b3b94a380502656e5bd0a0ec70e..73583fdfd56219ddd41fc4a10a4c9bcc8441d406 100644 --- a/_includes/block-faq-1.html +++ b/_includes/block-irma-faq.html @@ -1,13 +1,13 @@
-
+
-

{{ section.headline }}

+

{% t section.headline %}

{% for faq_item in section.faq_items %} - +
-

{{ faq_item.answer }}

+

{% t faq_item.answer %}

{% endfor %}
diff --git a/_includes/block-irma-footer-2.html b/_includes/block-irma-footer-2.html deleted file mode 100644 index 2e59b3248a375d96fc820c43d9f98cc2ef29b226..0000000000000000000000000000000000000000 --- a/_includes/block-irma-footer-2.html +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/_includes/block-irma-footer.html b/_includes/block-irma-footer.html new file mode 100644 index 0000000000000000000000000000000000000000..83582d4811c15d495ad066f9955f1fe20f0f4502 --- /dev/null +++ b/_includes/block-irma-footer.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/_includes/block-irma-header-1.html b/_includes/block-irma-header.html similarity index 51% rename from _includes/block-irma-header-1.html rename to _includes/block-irma-header.html index bafd66edd3d83ed15c1dc1b1af814d828638ac4d..dcd36072ebd407fc88b52b680f47b51718baf55f 100644 --- a/_includes/block-irma-header-1.html +++ b/_includes/block-irma-header.html @@ -1,16 +1,13 @@
diff --git a/_includes/block-irma-hero-1.html b/_includes/block-irma-hero-1.html new file mode 100644 index 0000000000000000000000000000000000000000..7f8770deca2e669fee4b10599401a62108baae9d --- /dev/null +++ b/_includes/block-irma-hero-1.html @@ -0,0 +1,6 @@ +
+
+
+

{% t section.heading %}

+
+
\ No newline at end of file diff --git a/_includes/block-irma-2.html b/_includes/block-irma-hero-2.html similarity index 55% rename from _includes/block-irma-2.html rename to _includes/block-irma-hero-2.html index b303267097c18aa56678d895a728d182ef381171..35686bea3a96fc9c3d4ece13ce182f79a0d62ebd 100644 --- a/_includes/block-irma-2.html +++ b/_includes/block-irma-hero-2.html @@ -1,21 +1,21 @@
-

{{ section.headline }}

+

{% t section.headline %}

{{ section.content }}

{% if section.ctaiOS and section.ctaiOS.enabled == true %} - + {% endif %} {% if section.ctaAndroid and section.ctaAndroid.enabled == true %} - + {% endif %}
- {{ section.image.alt_text }} + {% t section.image.alt_text %}
diff --git a/_includes/block-irma-three-column-1.html b/_includes/block-irma-three-column-1.html deleted file mode 100644 index c7baabae5b120f948f249ec23863af752208bca2..0000000000000000000000000000000000000000 --- a/_includes/block-irma-three-column-1.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-irma-three-column.html b/_includes/block-irma-three-column.html new file mode 100644 index 0000000000000000000000000000000000000000..13bd0e25ceb3c255dd19d3c10b0481731173e6e1 --- /dev/null +++ b/_includes/block-irma-three-column.html @@ -0,0 +1,28 @@ +
+
+
+
+
+
+ {% t section.image_1.alt %} +
+

{% t section.col_1.headline %}

+

{% t section.col_1.content %}

+
+
+
+ {% t section.image_2.alt %} +
+

{% t section.col_2.headline %}

+

{% t section.col_2.content %}

+
+
+
+ {% t section.image_3.alt %} +
+

{% t section.col_3.headline %}

+

{% t section.col_3.content %}

+
+
+
+
\ No newline at end of file diff --git a/_includes/block-media-1.html b/_includes/block-media-1.html deleted file mode 100644 index 90e156e5d5551b5a92113026de7f9c416e5dc215..0000000000000000000000000000000000000000 --- a/_includes/block-media-1.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
- {{ section.caption }} - {% if section.caption %} -
{{ section.caption }}
- {% endif %} -
-
-
\ No newline at end of file diff --git a/_includes/block-media-2.html b/_includes/block-media-2.html deleted file mode 100644 index 2448bf8fd9ae0d6bd969c2316ceefe2a64529fa1..0000000000000000000000000000000000000000 --- a/_includes/block-media-2.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-
-
-
-
\ No newline at end of file diff --git a/_includes/block-one-column-1.html b/_includes/block-one-column-1.html deleted file mode 100644 index 8ad2e373146e612dfa250624ed3c7fe54934ac19..0000000000000000000000000000000000000000 --- a/_includes/block-one-column-1.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-text-1.html b/_includes/block-text-1.html deleted file mode 100644 index f48e0e2dc9a9d750bc35aff34a1d73dacb240eef..0000000000000000000000000000000000000000 --- a/_includes/block-text-1.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
-
-
-

{{ section.headline }}

-
-
- {{ section.content }} -
-
-
-
\ No newline at end of file diff --git a/_includes/block-three-column-1.html b/_includes/block-three-column-1.html deleted file mode 100644 index b41e0ac7fe13691890a86c5b6ad1417cefd45e25..0000000000000000000000000000000000000000 --- a/_includes/block-three-column-1.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_3.caption %} -
{{ section.image_3.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-three-column-irma-1.html b/_includes/block-three-column-irma-1.html deleted file mode 100644 index e0ee2f50fb94a935ad76d8b14c878f4f59f2a0e1..0000000000000000000000000000000000000000 --- a/_includes/block-three-column-irma-1.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-

{{ section.heading }}

-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_3.caption %} -
{{ section.image_3.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-two-column-1.html b/_includes/block-two-column-1.html deleted file mode 100644 index b7df4af4374655d0e36bd02b639d9045181ac1c9..0000000000000000000000000000000000000000 --- a/_includes/block-two-column-1.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html index 51d301ed60d859e2a95b6064d28ef215b02aaf8b..16bcdb8b17ba9cfcc47398a6de26a0124a2e12ed 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -5,13 +5,12 @@ - {% if page.title %}{{ page.title }}{% endif %} - - + + \ No newline at end of file diff --git a/_includes/svg.html b/_includes/svg.html index 11afeac3302aaeb3a901db0720845be43639b60d..f53bedd91b8055a30ca26f4fe2f46829b82e5fac 100644 --- a/_includes/svg.html +++ b/_includes/svg.html @@ -1,5 +1,5 @@ {% if include.id %} - + {% endif %} \ No newline at end of file diff --git a/css/irma.css b/css/irma.css index aa79370fe079120a03d97bb61056355e07583ebb..742a7a5b25d6785c3b68000f953255b9f1a4d935 100644 --- a/css/irma.css +++ b/css/irma.css @@ -1,3 +1,18 @@ +/* Language elements */ + +#language { + font-size: 2em; +} + +#language ol { + display: flex; +} + +#language li { + margin-right: 0.5em; + list-style-type: none; +} + /* Scrolling to elements*/ html { diff --git a/index.md b/index.md index 10a2096615a18e9b788f40521f6d27edb030162d..bc052c892f73af8b81e1bd41f0947672aa30b2d9 100644 --- a/index.md +++ b/index.md @@ -1,249 +1,137 @@ --- +languages: +- nl +- en +- de layout: blocks title: IRMA -lang: en -lang-ref: index date: 2017-11-22T23:00:00.000+00:00 page_sections: - template: navigation-header - block: irma-header-1 + block: irma-header logo: "/uploads/non-free/irma_logo@1x.png" menu: "/uploads/non-free/navigation-menu.png" url: "/" navigation: - - link: "/" - link_text: IRMA - - link: "#gebruik" - link_text: Gebruik - - link: "#uitleg" - link_text: Uitleg - - link: "#faqs" - link_text: FAQs - - link: "#links" - link_text: Links + - link: nav.home_link + link_text: nav.home_text + - link: nav.usage_link + link_text: nav.usage_text + - link: nav.explanation_link + link_text: nav.explanation_text + - link: nav.faq_link + link_text: nav.faq_text + - link: nav.links_link + link_text: nav.links_text - template: irma-banner - block: irma-2 - headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + block: irma-hero-2 + headline: banner.headline ctaiOS: enabled: true - url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 - button_text: IRMA voor iOS + url: banner.ios_url + button_text: banner.ios ctaAndroid: enabled: true - url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu - button_text: IRMA voor Android + url: banner.android_url + button_text: banner.android image: - image: "/uploads/non-free/screenshot.png" - alt_text: Product Shot + image: banner.product_shot_src + alt_text: banner.product_shot_alt background_image: "/uploads/non-free/irma-2-bg.png" - template: 3-column-text - block: three-column-1 - id: gebruik + block: irma-three-column + id: usage.id image_1: image: "/uploads/non-free/login.png" + alt: usage.login_alt image_2: image: "/uploads/non-free/signature.png" + alt: usage.sign_alt image_3: image: "/uploads/non-free/secure.png" + alt: usage.trust_alt col_1: - headline: Inloggen - content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen - die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde - film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + headline: usage.login_headline + content: usage.login_content col_2: - headline: Ondertekenen - content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen - relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met - IRMA ondertekenen als arts, als burger of vanuit een andere rol. + headline: usage.sign_headline + content: usage.sign_content col_3: - headline: Vertrouwen - content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch - beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en - echt van jou. + headline: usage.trust_headline + content: usage.trust_content - template: slogan - block: irma-1 - id: start - heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + block: irma-hero-1 + id: slogan.id + heading: slogan.heading - template: 3-column-text - block: three-column-1 - id: uitleg + block: irma-three-column + id: explanation.id image_1: image: "/uploads/non-free/getstarted.png" + alt: explanation.getstarted_alt image_2: image: "/uploads/non-free/tool.png" + alt: explanation.tool_alt image_3: image: "/uploads/non-free/usecases.png" + alt: explanation.usecases_alt col_1: - headline: Zelf aan de slag met IRMA - content: Iedereen kan de IRMA app gratis downloaden (Android - en iOS) - en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen - en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw - emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen - zichzelf online bekend maken. + headline: explanation.getstarted_headline + content: explanation.getstarted_content col_2: - headline: IRMA is een middel, geen doel op zich - content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch - moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met - IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. - Bijvoorbeeld een film kijken of iets (ver)kopen. + headline: explanation.tool_headline + content: explanation.tool_content col_3: - headline: Wat kan ik er al mee? - content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, - bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder - gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun - je zelf een aantal IRMA demo's - uitproberen. + headline: explanation.usecases_headline + content: explanation.usecases_content - template: faq - block: faq-1 - id: faqs - headline: Veel gestelde vragen en antwoorden - daarop + block: irma-faq + id: faq.id + headline: faq.headline faq_items: - - question: Hoe moet ik met IRMA inloggen op een website? - answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar - bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet - op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken - die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende - situaties:
  • Als je de website bekijkt op - je computer of laptop en je drukt op die login knop verschijnt er een QR code. - Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een - knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of - je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben - je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het - indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin - verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op - OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed - is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het - kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen - hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. - - question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? - answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, - BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. - Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. - Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie - toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties - toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens - laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar - verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens - aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale - (beroeps)groepen. - - question: Kan ik IRMA op een tweede telefoon of tablet zetten? - answer: Jazeker, op ieder (Android - en iOS) - apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. - Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat - kwijt bent, kun je nog met een ander inloggen. - - question: Hoezo is IRMA privacy-vriendelijk en veilig? - answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd - met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde - situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je - soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of - studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend - door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, - waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt - zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen - je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. - Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, - bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: - je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt - wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' - - question: Waar staan mijn IRMA gegevens opgeslagen? - answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in - de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet - ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn - ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken - vanuit de IRMA app aan een website doorgegeven worden. - - question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? - answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze - geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van - hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar - je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. - De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een - waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen - door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. - Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente - ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. - - question: Wat doe ik als ik een nieuwe telefoon koop? - answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw - account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid - om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. - Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens - opnieuw op te halen. Het kost wel een klein beetje tijd. - - question: Wat doe ik als ik mijn telefoon verlies? - answer: De IRMA app op je telefoon is beschermd met een PIN, net als je - app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus - geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een - goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf - echter nog beter beschermen: bij het openen van een IRMA account heb je de - optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun - je via de MijnIRMA - omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de - IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres - toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar - met IRMA zelf in te loggen. Het is verstandig dat te doen. - - question: Ik heb een vraag over IRMA; waar kan ik terecht? - answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, - dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website - je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met - je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over - hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte - een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar - het adres irma@privacybydesign.foundation. - - question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? - answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met - de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken - vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. - De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon - staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. - - question: Wie zit er achter IRMA? - answer: IRMA wordt gemaakt door de stichting Privacy - by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security - onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk - en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting - Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie - Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit - en continuiteit van IRMA gegarandeerd. - - question: Hoezo kan IRMA gratis zijn? - answer: IRMA is gratis voor gebruikers. IRMA is ook gratis voor websites die - gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app - opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet - gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in - IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte - moet betaald worden en moet een contract getekend worden, waarbij de uitgever - zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste - persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen - op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de - organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien - geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + - question: faq.item1.question + answer: faq.item1.answer + - question: faq.item2.question + answer: faq.item2.answer + - question: faq.item3.question + answer: faq.item3.answer + - question: faq.item4.question + answer: faq.item4.answer + - question: faq.item5.question + answer: faq.item5.answer + - question: faq.item6.question + answer: faq.item6.answer + - question: faq.item7.question + answer: faq.item7.answer + - question: faq.item8.question + answer: faq.item8.answer + - question: faq.item9.question + answer: faq.item9.answer + - question: faq.item10.question + answer: faq.item10.answer + - question: faq.item11.question + answer: faq.item11.answer + - question: faq.item12.question + answer: faq.item12.answer + - question: faq.item13.question + answer: faq.item13.answer + - question: faq.item14.question + answer: faq.item14.answer - - question: IRMA is open source; wat betekent dat? - answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software - staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van - computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een - transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van - leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat - alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. - - - question: Ik wil meer informatie over IRMA; waar kan ik terecht? - answer: Het grotere verhaal achter IRMA staat beschreven in een IRMA Manifest.

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op een eigen pagina. Mensen die de software van IRMA willen bekijken kunnen terecht op een technische documentatie pagina en op GitHub. - -- template: irma-footer-2 - block: irma-footer-2 - id: links +- template: irma-footer + block: irma-footer + id: footer.id image_1: image: "/uploads/non-free/irma_logo@1x.png" + alt: footer.irma_alt col_2: - headline: Privacy by Design Foundation - content: IRMA wordt gemaakt door de stichting Privacy - by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op haar eigen website. + headline: footer.irma_headline + content: footer.irma_content col_3: - headline: Docs - content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische documentatie. + headline: footer.doc_headline + content: footer.doc_content col_4: - headline: GitHub - content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen terecht op GitHub. - + headline: footer.github_headline + content: footer.github_content --- diff --git a/vendor/bundle/ruby/2.3.0/bin/jekyll b/vendor/bundle/ruby/2.3.0/bin/jekyll deleted file mode 100755 index 80c4bef4e849e8891198a66a5a778dde810019e4..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/jekyll +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'jekyll' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('jekyll', 'jekyll', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/kramdown b/vendor/bundle/ruby/2.3.0/bin/kramdown deleted file mode 100755 index 3fc2e03da3e2f2222e03ac388432f1f78c532d18..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/kramdown +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'kramdown' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('kramdown', 'kramdown', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/listen b/vendor/bundle/ruby/2.3.0/bin/listen deleted file mode 100755 index 17b391b1aac1bc301ca8622bf2a631abd67339fc..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/listen +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'listen' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('listen', 'listen', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/rougify b/vendor/bundle/ruby/2.3.0/bin/rougify deleted file mode 100755 index 93c899f2a74dbd140df60075170951fdf0b17807..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/rougify +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'rouge' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('rouge', 'rougify', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/safe_yaml b/vendor/bundle/ruby/2.3.0/bin/safe_yaml deleted file mode 100755 index aa92b59ecc5b3cff0ca733a45de8dd0eb98fe9a7..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/safe_yaml +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'safe_yaml' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('safe_yaml', 'safe_yaml', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/sass b/vendor/bundle/ruby/2.3.0/bin/sass deleted file mode 100755 index 2fdd68ccee8a2a0e5b1d736daf45518a2674f623..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/sass +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'sass' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('sass', 'sass', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/sass-convert b/vendor/bundle/ruby/2.3.0/bin/sass-convert deleted file mode 100755 index 0ae7e590078838e8f9d52106c6ea3acc390dd6af..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/sass-convert +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'sass' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('sass', 'sass-convert', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/scss b/vendor/bundle/ruby/2.3.0/bin/scss deleted file mode 100755 index 02d7dbecfc4a0c6f82b14f0892fe8eec48f83396..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/bin/scss +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'sass' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -if ARGV.first - str = ARGV.first - str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding - if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then - version = $1 - ARGV.shift - end -end - -load Gem.bin_path('sass', 'scss', version) diff --git a/vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem b/vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem deleted file mode 100644 index 3e53ea0e40340e58428b322d4535e8d50eb1733d..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem b/vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem deleted file mode 100644 index d5616ad5725f946628b99e1df91f84c2c52f1730..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem b/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem deleted file mode 100644 index 0016be0fc34e20d94d8db39db0c54f7e53291616..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem deleted file mode 100644 index 370222f6928cab5a725f30ccbc4e0eee086db3aa..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem deleted file mode 100644 index 64f1454cba7d0825be96b069675581ec33107638..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem deleted file mode 100644 index 0d221a9dbe963e680a6c5cc8ad6fed038380ef9c..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-menus-0.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-menus-0.6.0.gem deleted file mode 100644 index 7cb34556d8a085da6bd4e45925142f6c5c6d4bcd..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/jekyll-menus-0.6.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-sass-converter-1.5.2.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-sass-converter-1.5.2.gem deleted file mode 100644 index 7f0d488d9f06cda432267c5b1000307e13eb5eed..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/jekyll-sass-converter-1.5.2.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem deleted file mode 100644 index fc804ee6f3ca7d8dc1ad7d79813940c29b11d0c9..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem b/vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem deleted file mode 100644 index c5ca2344e24794c08139779e92b9f7c233475b7c..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem b/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem deleted file mode 100644 index 2186389704f1fad84b9c30bbfd06e51fe40667f6..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem b/vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem deleted file mode 100644 index 3508492c768aa345f8e35a4875c8110d9c1f07ad..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem b/vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem deleted file mode 100644 index e5333e006bae100c0b2bb4a1eda22d89487e348d..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem b/vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem deleted file mode 100644 index 1d8cdf8f3f8b425d2ebb5d656259880af65d9cdd..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem b/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem deleted file mode 100644 index f83ab3eaba3dd2836085bea466d4753203e5d34e..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem b/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem deleted file mode 100644 index e88708245ef168c343df9b060fc0659fea7713b5..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem b/vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem deleted file mode 100644 index cd3d5858582413ef98bf2be5b7ac5a574ba5c73a..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem b/vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem deleted file mode 100644 index 667cdb64dd1054cd8759913a8e5ef6387cbbb4a4..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem b/vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem deleted file mode 100644 index 04b330408ef8b9b5f849bbf15dc97003e130ef1b..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/safe_yaml-1.0.4.gem b/vendor/bundle/ruby/2.3.0/cache/safe_yaml-1.0.4.gem deleted file mode 100644 index 7da49f5e6a100903315eb3277e3119ee2e7f380f..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/safe_yaml-1.0.4.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem deleted file mode 100644 index 856d6f5dcd1256b50d38a7a3432d0aa9349a9750..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem b/vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem deleted file mode 100644 index 94646539b8f75d78e003bc7c6a6352ff4340ac4a..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle deleted file mode 100755 index e9433c468a53a6326142bfca1a84ee42297e9710..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem.build_complete b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem.build_complete deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out deleted file mode 100644 index 95d8007f05156888f700161211469df0c81b1feb..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out +++ /dev/null @@ -1,140 +0,0 @@ -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20190924-36740-x47nfw.rb extconf.rb -checking for ffi.h... no -checking for ffi.h in /usr/local/include,/usr/include/ffi... no -checking for shlwapi.h... no -checking for ruby/thread.h... yes -checking for rb_thread_blocking_region()... no -checking for rb_thread_call_with_gvl()... yes -checking for rb_thread_call_without_gvl()... yes -creating extconf.h -creating Makefile - -To see why this extension failed to compile, please check the mkmf.log which can be found here: - - /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" clean - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" -Configuring libffi -clang: error: unsupported option '-print-multi-os-directory' -clang: error: no input files -cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make -/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' 'CFLAGS_FOR_BUILD=' 'CFLAGS_FOR_TARGET=' 'INSTALL=/usr/bin/install -c' 'INSTALL_DATA=/usr/bin/install -c -m 644' 'INSTALL_PROGRAM=/usr/bin/install -c' 'INSTALL_SCRIPT=/usr/bin/install -c' 'JC1FLAGS=' 'LDFLAGS=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo ' 'PICFLAG=' 'PICFLAG_FOR_TARGET=' 'RUNTESTFLAGS=' 'SHELL=/bin/sh' 'exec_prefix=/usr/local' 'infodir=/usr/local/share/info' 'libdir=/usr/local/lib' 'mandir=/usr/local/share/man' 'prefix=/usr/local' 'AR=ar' 'AS=as' 'CC=xcrun clang' 'CXX=g++' 'LD=ld' 'NM=/usr/bin/nm -B' 'RANLIB=ranlib' 'DESTDIR=' all-recursive -Making all in include -make[3]: Nothing to be done for `all'. -Making all in testsuite -make[3]: Nothing to be done for `all'. -Making all in man -make[3]: Nothing to be done for `all'. -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/prep_cif.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c -fno-common -DPIC -o src/.libs/prep_cif.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/types.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c -fno-common -DPIC -o src/.libs/types.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c -fno-common -DPIC -o src/.libs/raw_api.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/java_raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c -fno-common -DPIC -o src/.libs/java_raw_api.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/closures.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c -fno-common -DPIC -o src/.libs/closures.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffi64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c -fno-common -DPIC -o src/x86/.libs/ffi64.o -/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/unix64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S -fno-common -DPIC -o src/x86/.libs/unix64.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffiw64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c -fno-common -DPIC -o src/x86/.libs/ffiw64.o -/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/win64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S -fno-common -DPIC -o src/x86/.libs/win64.o -/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -o libffi_convenience.la src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -libtool: link: ar cru .libs/libffi_convenience.a src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -libtool: link: ranlib .libs/libffi_convenience.a -libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" ) -/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -no-undefined -version-info `grep -v '^#' /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version` -o libffi.la -rpath /usr/local/lib src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -libtool: link: xcrun clang -dynamiclib -o .libs/libffi.7.dylib src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -install_name /usr/local/lib/libffi.7.dylib -compatibility_version 9 -current_version 9.0 -Wl,-single_module -ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame -libtool: link: (cd ".libs" && rm -f "libffi.dylib" && ln -s "libffi.7.dylib" "libffi.dylib") -libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" ) -compiling AbstractMemory.c -compiling ArrayType.c -compiling Buffer.c -compiling Call.c -compiling ClosurePool.c -compiling DataConverter.c -compiling DynamicLibrary.c -compiling Function.c -Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations] - ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); - ^ -/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here - __attribute__((deprecated)) - ^ -1 warning generated. -compiling FunctionInfo.c -compiling LastError.c -compiling LongDouble.c -compiling MappedType.c -compiling MemoryPointer.c -compiling MethodHandle.c -compiling Platform.c -compiling Pointer.c -compiling Struct.c -compiling StructByReference.c -compiling StructByValue.c -compiling StructLayout.c -compiling Thread.c -compiling Type.c -compiling Types.c -compiling Variadic.c -compiling ffi.c -linking shared-object ffi_c.bundle -ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" install -cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make -/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' 'CFLAGS_FOR_BUILD=' 'CFLAGS_FOR_TARGET=' 'INSTALL=/usr/bin/install -c' 'INSTALL_DATA=/usr/bin/install -c -m 644' 'INSTALL_PROGRAM=/usr/bin/install -c' 'INSTALL_SCRIPT=/usr/bin/install -c' 'JC1FLAGS=' 'LDFLAGS=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo ' 'PICFLAG=' 'PICFLAG_FOR_TARGET=' 'RUNTESTFLAGS=' 'SHELL=/bin/sh' 'exec_prefix=/usr/local' 'infodir=/usr/local/share/info' 'libdir=/usr/local/lib' 'mandir=/usr/local/share/man' 'prefix=/usr/local' 'AR=ar' 'AS=as' 'CC=xcrun clang' 'CXX=g++' 'LD=ld' 'NM=/usr/bin/nm -B' 'RANLIB=ranlib' 'DESTDIR=' all-recursive -Making all in include -make[3]: Nothing to be done for `all'. -Making all in testsuite -make[3]: Nothing to be done for `all'. -Making all in man -make[3]: Nothing to be done for `all'. -make[3]: Nothing to be done for `all-am'. -compiling AbstractMemory.c -compiling ArrayType.c -compiling Buffer.c -compiling Call.c -compiling ClosurePool.c -compiling DataConverter.c -compiling DynamicLibrary.c -compiling Function.c -Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations] - ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); - ^ -/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here - __attribute__((deprecated)) - ^ -1 warning generated. -compiling FunctionInfo.c -compiling LastError.c -compiling LongDouble.c -compiling MappedType.c -compiling MemoryPointer.c -compiling MethodHandle.c -compiling Platform.c -compiling Pointer.c -compiling Struct.c -compiling StructByReference.c -compiling StructByValue.c -compiling StructLayout.c -compiling Thread.c -compiling Type.c -compiling Types.c -compiling Variadic.c -compiling ffi.c -linking shared-object ffi_c.bundle -ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame -/usr/bin/install -c -m 0755 ffi_c.bundle ./.gem.20190924-36740-x1wmd8 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log deleted file mode 100644 index 1fdbe02e8f1efef4c5013804c66869f3f32307ca..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log +++ /dev/null @@ -1,250 +0,0 @@ -"pkg-config --exists libffi" -package configuration for libffi is not found -have_header: checking for ffi.h... -------------------- no - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return 0; -6: } -/* end */ - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c" -conftest.c:3:10: fatal error: 'ffi.h' file not found -#include - ^~~~~~~ -1 error generated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -find_header: checking for ffi.h in /usr/local/include,/usr/include/ffi... -------------------- no - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c" -conftest.c:3:10: fatal error: 'ffi.h' file not found -#include - ^~~~~~~ -1 error generated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -I/usr/local/include -c conftest.c" -conftest.c:3:10: fatal error: 'ffi.h' file not found -#include - ^~~~~~~ -1 error generated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -I/usr/include/ffi -c conftest.c" -conftest.c:3:10: fatal error: 'ffi.h' file not found -#include - ^~~~~~~ -1 error generated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_header: checking for shlwapi.h... -------------------- no - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c" -conftest.c:3:10: fatal error: 'shlwapi.h' file not found -#include - ^~~~~~~~~~~ -1 error generated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_header: checking for ruby/thread.h... -------------------- yes - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_func: checking for rb_thread_blocking_region()... -------------------- no - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -conftest.c:13:57: error: use of undeclared identifier 'rb_thread_blocking_region' -int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; } -/* end */ - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -Undefined symbols for architecture x86_64: - "_rb_thread_blocking_region", referenced from: - _t in conftest-4e6b3e.o -ld: symbol(s) not found for architecture x86_64 -clang: error: linker command failed with exit code 1 (use -v to see invocation) -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: extern void rb_thread_blocking_region(); -14: int t(void) { rb_thread_blocking_region(); return 0; } -/* end */ - --------------------- - -have_func: checking for rb_thread_call_with_gvl()... -------------------- yes - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_with_gvl' -int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; } -/* end */ - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: extern void rb_thread_call_with_gvl(); -14: int t(void) { rb_thread_call_with_gvl(); return 0; } -/* end */ - --------------------- - -have_func: checking for rb_thread_call_without_gvl()... -------------------- yes - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_without_gvl' -int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; } -/* end */ - -"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: printf("%p", &t); - 9: } -10: -11: return 0; -12: } -13: extern void rb_thread_call_without_gvl(); -14: int t(void) { rb_thread_call_without_gvl(); return 0; } -/* end */ - --------------------- - -extconf.h is: -/* begin */ -1: #ifndef EXTCONF_H -2: #define EXTCONF_H -3: #define HAVE_RUBY_THREAD_H 1 -4: #define HAVE_RB_THREAD_CALL_WITH_GVL 1 -5: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 -6: #define HAVE_FFI_PREP_CIF_VAR 1 -7: #define USE_INTERNAL_LIBFFI 1 -8: #define RUBY_1_9 1 -9: #endif -/* end */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md deleted file mode 100644 index 12cacd253fc4d943f0e3e4a3e4523a34ad5a5ad8..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md +++ /dev/null @@ -1,216 +0,0 @@ -# Addressable 2.5.2 -- better support for frozen string literals -- fixed bug w/ uppercase characters in scheme -- IDNA errors w/ emoji URLs -- compatibility w/ public_suffix 3.x - -# Addressable 2.5.1 -- allow unicode normalization to be disabled for URI Template expansion -- removed duplicate test - -# Addressable 2.5.0 -- dropping support for Ruby 1.9 -- adding support for Ruby 2.4 preview -- add support for public suffixes and tld; first runtime dependency -- hostname escaping should match RFC; underscores in hostnames no longer escaped -- paths beginning with // and missing an authority are now considered invalid -- validation now also takes place after setting a path -- handle backslashes in authority more like a browser for `heuristic_parse` -- unescaped backslashes in host now raise an `InvalidURIError` -- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation -- `heuristic_parse` now trims whitespace before parsing -- host parts longer than 63 bytes will be ignored and not passed to libidn -- normalized values always encoded as UTF-8 - -# Addressable 2.4.0 -- support for 1.8.x dropped -- double quotes in a host now raises an error -- newlines in host will no longer get unescaped during normalization -- stricter handling of bogus scheme values -- stricter handling of encoded port values -- calling `require 'addressable'` will now load both the URI and Template files -- assigning to the `hostname` component with an `IPAddr` object is now supported -- assigning to the `origin` component is now supported -- fixed minor bug where an exception would be thrown for a missing ACE suffix -- better partial expansion of URI templates - -# Addressable 2.3.8 -- fix warnings -- update dependency gems -- support for 1.8.x officially deprecated - -# Addressable 2.3.7 -- fix scenario in which invalid URIs don't get an exception until inspected -- handle hostnames with two adjacent periods correctly -- upgrade of RSpec - -# Addressable 2.3.6 -- normalization drops empty query string -- better handling in template extract for missing values -- template modifier for `'?'` now treated as optional -- fixed issue where character class parameters were modified -- templates can now be tested for equality -- added `:sorted` option to normalization of query strings -- fixed issue with normalization of hosts given in `'example.com.'` form - -# Addressable 2.3.5 -- added Addressable::URI#empty? method -- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts -- compatibility with Net::HTTP in Ruby 2.0.0 -- Addressable::URI#route_from should always give relative URIs - -# Addressable 2.3.4 -- fixed issue with encoding altering its inputs -- query string normalization now leaves ';' characters alone -- FakeFS is detected before attempting to load unicode tables -- additional testing to ensure frozen objects don't cause problems - -# Addressable 2.3.3 -- fixed issue with converting common primitives during template expansion -- fixed port encoding issue -- removed a few warnings -- normalize should now ignore %2B in query strings -- the IDNA logic should now be handled by libidn in Ruby 1.9 -- no template match should now result in nil instead of an empty MatchData -- added license information to gemspec - -# Addressable 2.3.2 -- added Addressable::URI#default_port method -- fixed issue with Marshalling Unicode data on Windows -- improved heuristic parsing to better handle IPv4 addresses - -# Addressable 2.3.1 -- fixed missing unicode data file - -# Addressable 2.3.0 -- updated Addressable::Template to use RFC 6570, level 4 -- fixed compatibility problems with some versions of Ruby -- moved unicode tables into a data file for performance reasons -- removing support for multiple query value notations - -# Addressable 2.2.8 -- fixed issues with dot segment removal code -- form encoding can now handle multiple values per key -- updated development environment - -# Addressable 2.2.7 -- fixed issues related to Addressable::URI#query_values= -- the Addressable::URI.parse method is now polymorphic - -# Addressable 2.2.6 -- changed the way ambiguous paths are handled -- fixed bug with frozen URIs -- https supported in heuristic parsing - -# Addressable 2.2.5 -- 'parsing' a pre-parsed URI object is now a dup operation -- introduced conditional support for libidn -- fixed normalization issue on ampersands in query strings -- added additional tests around handling of query strings - -# Addressable 2.2.4 -- added origin support from draft-ietf-websec-origin-00 -- resolved issue with attempting to navigate below root -- fixed bug with string splitting in query strings - -# Addressable 2.2.3 -- added :flat_array notation for query strings - -# Addressable 2.2.2 -- fixed issue with percent escaping of '+' character in query strings - -# Addressable 2.2.1 -- added support for application/x-www-form-urlencoded. - -# Addressable 2.2.0 -- added site methods -- improved documentation - -# Addressable 2.1.2 -- added HTTP request URI methods -- better handling of Windows file paths -- validation_deferred boolean replaced with defer_validation block -- normalization of percent-encoded paths should now be correct -- fixed issue with constructing URIs with relative paths -- fixed warnings - -# Addressable 2.1.1 -- more type checking changes -- fixed issue with unicode normalization -- added method to find template defaults -- symbolic keys are now allowed in template mappings -- numeric values and symbolic values are now allowed in template mappings - -# Addressable 2.1.0 -- refactored URI template support out into its own class -- removed extract method due to being useless and unreliable -- removed Addressable::URI.expand_template -- removed Addressable::URI#extract_mapping -- added partial template expansion -- fixed minor bugs in the parse and heuristic_parse methods -- fixed incompatibility with Ruby 1.9.1 -- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s -- fixed unicode normalization exception -- updated query_values methods to better handle subscript notation -- worked around issue with freezing URIs -- improved specs - -# Addressable 2.0.2 -- fixed issue with URI template expansion -- fixed issue with percent escaping characters 0-15 - -# Addressable 2.0.1 -- fixed issue with query string assignment -- fixed issue with improperly encoded components - -# Addressable 2.0.0 -- the initialize method now takes an options hash as its only parameter -- added query_values method to URI class -- completely replaced IDNA implementation with pure Ruby -- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION -- completely reworked the Rakefile -- changed the behavior of the port method significantly -- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed -- documentation is now in YARD format -- more rigorous type checking -- to_str method implemented, implicit conversion to Strings now allowed -- Addressable::URI#omit method added, Addressable::URI#merge method replaced -- updated URI Template code to match v 03 of the draft spec -- added a bunch of new specifications - -# Addressable 1.0.4 -- switched to using RSpec's pending system for specs that rely on IDN -- fixed issue with creating URIs with paths that are not prefixed with '/' - -# Addressable 1.0.3 -- implemented a hash method - -# Addressable 1.0.2 -- fixed minor bug with the extract_mapping method - -# Addressable 1.0.1 -- fixed minor bug with the extract_mapping method - -# Addressable 1.0.0 -- heuristic parse method added -- parsing is slightly more strict -- replaced to_h with to_hash -- fixed routing methods -- improved specifications -- improved heckle rake task -- no surviving heckle mutations - -# Addressable 0.1.2 -- improved normalization -- fixed bug in joining algorithm -- updated specifications - -# Addressable 0.1.1 -- updated documentation -- added URI Template variable extraction - -# Addressable 0.1.0 -- initial release -- implementation based on RFC 3986, 3987 -- support for IRIs via libidn -- support for the URI Template draft spec diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile deleted file mode 100644 index c2344b6552ac6ef6b354c7cc7f6d9e2fd46d398f..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile +++ /dev/null @@ -1,32 +0,0 @@ -source 'https://rubygems.org' - -gemspec - -group :test do - gem 'rspec', '~> 3.0' - gem 'rspec-its', '~> 1.1' -end - -group :development do - gem 'launchy', '~> 2.4', '>= 2.4.3' - gem 'redcarpet', :platform => :mri_19 - gem 'yard' -end - -group :test, :development do - gem 'rake', '> 10.0', '< 12' - gem 'simplecov', :require => false - gem 'coveralls', :require => false, :platforms => [ - :ruby_20, :ruby_21, :ruby_22, :ruby_23 - ] - # Used to test compatibility. - gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount' - - if RUBY_VERSION.start_with?('2.0', '2.1') - gem 'rack', '< 2', :require => false - else - gem 'rack', :require => false - end -end - -gem 'idn-ruby', :platform => [:mri_20, :mri_21, :mri_22, :mri_23, :mri_24] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt deleted file mode 100644 index ef51da2b0e8df139a427a56d3c2054c1b5e75118..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md deleted file mode 100644 index e01fd0eb0242e6cfaf60def440d76b984142922c..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# Addressable - -
-
Homepage
github.com/sporkmonger/addressable
-
Author
Bob Aman
-
Copyright
Copyright © Bob Aman
-
License
Apache 2.0
-
- -[![Gem Version](http://img.shields.io/gem/dt/addressable.svg)][gem] -[![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.svg?branch=master)][travis] -[![Dependency Status](https://gemnasium.com/sporkmonger/addressable.svg?travis)][gemnasium] -[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls] -[![Documentation Coverage Status](http://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch] - -[gem]: https://rubygems.org/gems/addressable -[travis]: http://travis-ci.org/sporkmonger/addressable -[gemnasium]: https://gemnasium.com/sporkmonger/addressable -[coveralls]: https://coveralls.io/r/sporkmonger/addressable -[inch]: http://inch-ci.org/github/sporkmonger/addressable - -# Description - -Addressable is a replacement for the URI implementation that is part of -Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and -RFC 6570 (level 4), providing support for IRIs and URI templates. - -# Reference - -- {Addressable::URI} -- {Addressable::Template} - -# Example usage - -```ruby -require "addressable/uri" - -uri = Addressable::URI.parse("http://example.com/path/to/resource/") -uri.scheme -#=> "http" -uri.host -#=> "example.com" -uri.path -#=> "/path/to/resource/" - -uri = Addressable::URI.parse("http://www.詹姆斯.com/") -uri.normalize -#=> # -``` - - -# URI Templates - -For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). - - -```ruby - -require "addressable/template" - -template = Addressable::Template.new("http://example.com/{?query*}/") -template.expand({ - "query" => { - 'foo' => 'bar', - 'color' => 'red' - } -}) -#=> # - -template = Addressable::Template.new("http://example.com/{?one,two,three}") -template.partial_expand({"one" => "1", "three" => 3}).pattern -#=> "http://example.com/?one=1{&two}&three=3" - -template = Addressable::Template.new( - "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" -) -uri = Addressable::URI.parse( - "http://example.com/a/b/c/?one=1&two=2#foo" -) -template.extract(uri) -#=> -# { -# "host" => "example.com", -# "segments" => ["a", "b", "c"], -# "one" => "1", -# "two" => "2", -# "fragment" => "foo" -# } -``` - -# Install - -```console -$ gem install addressable -``` - -You may optionally turn on native IDN support by installing libidn and the -idn gem: - -```console -$ sudo apt-get install idn # Debian/Ubuntu -$ brew install libidn # OS X -$ gem install idn-ruby -``` - -# Semantic Versioning - -This project uses sementic versioning. You can (and should) specify your -dependency using a pessimistic version constraint covering the major and minor -values: - -```ruby -spec.add_dependency 'addressable', '~> 2.5' -``` - -If you need a specific bug fix, you can also specify minimum tiny versions -without preventing updates to the latest minor release: - -```ruby -spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7' -``` diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile deleted file mode 100644 index ffdcb8c525038cbb9f64100022a86cc1003f92bc..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile +++ /dev/null @@ -1,32 +0,0 @@ -require 'rubygems' -require 'rake' - -require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version') - -PKG_DISPLAY_NAME = 'Addressable' -PKG_NAME = PKG_DISPLAY_NAME.downcase -PKG_VERSION = Addressable::VERSION::STRING -PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" - -RELEASE_NAME = "REL #{PKG_VERSION}" - -PKG_SUMMARY = "URI Implementation" -PKG_DESCRIPTION = <<-TEXT -Addressable is a replacement for the URI implementation that is part of -Ruby's standard library. It more closely conforms to the relevant RFCs and -adds support for IRIs and URI templates. -TEXT - -PKG_FILES = FileList[ - "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*", - "tasks/**/*", - "[A-Z]*", "Rakefile" -].exclude(/pkg/).exclude(/database\.yml/). - exclude(/Gemfile\.lock/).exclude(/[_\.]git$/) - -task :default => "spec" - -WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false -SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) - -Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data deleted file mode 100644 index cdfc22418a51396f2b89cfc1afb2c892b30d7e3f..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable.rb deleted file mode 100644 index f09a05e91aa60a7c91e147510a10162a69bc1af0..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'addressable/uri' -require 'addressable/template' diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna.rb deleted file mode 100644 index c6da1b0667cefac85d6bc14eb0df4d7e5dd33770..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna.rb +++ /dev/null @@ -1,25 +0,0 @@ -# encoding:utf-8 -#-- -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#++ - - -begin - require "addressable/idna/native" -rescue LoadError - # libidn or the idn gem was not available, fall back on a pure-Ruby - # implementation... - require "addressable/idna/pure" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb deleted file mode 100644 index e7c22547f4c7a09a1eda049fe57c68cc083faf65..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb +++ /dev/null @@ -1,59 +0,0 @@ -# encoding:utf-8 -#-- -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#++ - - -require "idn" - -module Addressable - module IDNA - def self.punycode_encode(value) - IDN::Punycode.encode(value.to_s) - end - - def self.punycode_decode(value) - IDN::Punycode.decode(value.to_s) - end - - def self.unicode_normalize_kc(value) - IDN::Stringprep.nfkc_normalize(value.to_s) - end - - def self.to_ascii(value) - value.to_s.split('.', -1).map do |segment| - if segment.size > 0 && segment.size < 64 - IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED) - elsif segment.size >= 64 - segment - else - '' - end - end.join('.') - end - - def self.to_unicode(value) - value.to_s.split('.', -1).map do |segment| - if segment.size > 0 && segment.size < 64 - IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED) - elsif segment.size >= 64 - segment - else - '' - end - end.join('.') - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb deleted file mode 100644 index 33f026aa340b406c0f8de0431fb2bb89c6d35d5e..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb +++ /dev/null @@ -1,677 +0,0 @@ -# encoding:utf-8 -#-- -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#++ - - -module Addressable - module IDNA - # This module is loosely based on idn_actionmailer by Mick Staugaard, - # the unicode library by Yoshida Masato, and the punycode implementation - # by Kazuhiro Nishiyama. Most of the code was copied verbatim, but - # some reformatting was done, and some translation from C was done. - # - # Without their code to work from as a base, we'd all still be relying - # on the presence of libidn. Which nobody ever seems to have installed. - # - # Original sources: - # http://github.com/staugaard/idn_actionmailer - # http://www.yoshidam.net/Ruby.html#unicode - # http://rubyforge.org/frs/?group_id=2550 - - - UNICODE_TABLE = File.expand_path( - File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data') - ) - - ACE_PREFIX = "xn--" - - UTF8_REGEX = /\A(?: - [\x09\x0A\x0D\x20-\x7E] # ASCII - | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte - | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs - | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte - | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates - | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 - | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 - | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 - )*\z/mnx - - UTF8_REGEX_MULTIBYTE = /(?: - [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte - | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs - | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte - | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates - | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 - | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 - | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 - )/mnx - - # :startdoc: - - # Converts from a Unicode internationalized domain name to an ASCII - # domain name as described in RFC 3490. - def self.to_ascii(input) - input = input.to_s unless input.is_a?(String) - input = input.dup - if input.respond_to?(:force_encoding) - input.force_encoding(Encoding::ASCII_8BIT) - end - if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE - parts = unicode_downcase(input).split('.') - parts.map! do |part| - if part.respond_to?(:force_encoding) - part.force_encoding(Encoding::ASCII_8BIT) - end - if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE - ACE_PREFIX + punycode_encode(unicode_normalize_kc(part)) - else - part - end - end - parts.join('.') - else - input - end - end - - # Converts from an ASCII domain name to a Unicode internationalized - # domain name as described in RFC 3490. - def self.to_unicode(input) - input = input.to_s unless input.is_a?(String) - parts = input.split('.') - parts.map! do |part| - if part =~ /^#{ACE_PREFIX}(.+)/ - begin - punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1]) - rescue Addressable::IDNA::PunycodeBadInput - # toUnicode is explicitly defined as never-fails by the spec - part - end - else - part - end - end - output = parts.join('.') - if output.respond_to?(:force_encoding) - output.force_encoding(Encoding::UTF_8) - end - output - end - - # Unicode normalization form KC. - def self.unicode_normalize_kc(input) - input = input.to_s unless input.is_a?(String) - unpacked = input.unpack("U*") - unpacked = - unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked))) - return unpacked.pack("U*") - end - - ## - # Unicode aware downcase method. - # - # @api private - # @param [String] input - # The input string. - # @return [String] The downcased result. - def self.unicode_downcase(input) - input = input.to_s unless input.is_a?(String) - unpacked = input.unpack("U*") - unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) } - return unpacked.pack("U*") - end - (class <= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT && - ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT - # Hangul L + V - return HANGUL_SBASE + ( - (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE) - ) * HANGUL_TCOUNT - elsif ch_one >= HANGUL_SBASE && - ch_one < HANGUL_SBASE + HANGUL_SCOUNT && - (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 && - ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT - # Hangul LV + T - return ch_one + (ch_two - HANGUL_TBASE) - end - - p = [] - ucs4_to_utf8 = lambda do |ch| - if ch < 128 - p << ch - elsif ch < 2048 - p << (ch >> 6 | 192) - p << (ch & 63 | 128) - elsif ch < 0x10000 - p << (ch >> 12 | 224) - p << (ch >> 6 & 63 | 128) - p << (ch & 63 | 128) - elsif ch < 0x200000 - p << (ch >> 18 | 240) - p << (ch >> 12 & 63 | 128) - p << (ch >> 6 & 63 | 128) - p << (ch & 63 | 128) - elsif ch < 0x4000000 - p << (ch >> 24 | 248) - p << (ch >> 18 & 63 | 128) - p << (ch >> 12 & 63 | 128) - p << (ch >> 6 & 63 | 128) - p << (ch & 63 | 128) - elsif ch < 0x80000000 - p << (ch >> 30 | 252) - p << (ch >> 24 & 63 | 128) - p << (ch >> 18 & 63 | 128) - p << (ch >> 12 & 63 | 128) - p << (ch >> 6 & 63 | 128) - p << (ch & 63 | 128) - end - end - - ucs4_to_utf8.call(ch_one) - ucs4_to_utf8.call(ch_two) - - return lookup_unicode_composition(p) - end - (class < cc - unpacked[i] = last - unpacked[i-1] = ch - i -= 1 if i > 1 - else - i += 1 - end - end - return unpacked - end - (class <= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT - l, v, t = unicode_decompose_hangul(cp) - unpacked_result << l - unpacked_result << v if v - unpacked_result << t if t - else - dc = lookup_unicode_compatibility(cp) - unless dc - unpacked_result << cp - else - unpacked_result.concat(unicode_decompose(dc.unpack("U*"))) - end - end - end - return unpacked_result - end - (class <= HANGUL_SCOUNT - l = codepoint - v = t = nil - return l, v, t - end - l = HANGUL_LBASE + sindex / HANGUL_NCOUNT - v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT - t = HANGUL_TBASE + sindex % HANGUL_TCOUNT - if t == HANGUL_TBASE - t = nil - end - return l, v, t - end - (class <?" + - "@ABCDEFGHIJKLMNO" + - "PQRSTUVWXYZ[\\]^_" + - "`abcdefghijklmno" + - "pqrstuvwxyz{|}~\n" - - # Input is invalid. - class PunycodeBadInput < StandardError; end - # Output would exceed the space provided. - class PunycodeBigOutput < StandardError; end - # Input needs wider integers to process. - class PunycodeOverflow < StandardError; end - - def self.punycode_encode(unicode) - unicode = unicode.to_s unless unicode.is_a?(String) - input = unicode.unpack("U*") - output = [0] * (ACE_MAX_LENGTH + 1) - input_length = input.size - output_length = [ACE_MAX_LENGTH] - - # Initialize the state - n = PUNYCODE_INITIAL_N - delta = out = 0 - max_out = output_length[0] - bias = PUNYCODE_INITIAL_BIAS - - # Handle the basic code points: - input_length.times do |j| - if punycode_basic?(input[j]) - if max_out - out < 2 - raise PunycodeBigOutput, - "Output would exceed the space provided." - end - output[out] = input[j] - out += 1 - end - end - - h = b = out - - # h is the number of code points that have been handled, b is the - # number of basic code points, and out is the number of characters - # that have been output. - - if b > 0 - output[out] = PUNYCODE_DELIMITER - out += 1 - end - - # Main encoding loop: - - while h < input_length - # All non-basic code points < n have been - # handled already. Find the next larger one: - - m = PUNYCODE_MAXINT - input_length.times do |j| - m = input[j] if (n...m) === input[j] - end - - # Increase delta enough to advance the decoder's - # state to , but guard against overflow: - - if m - n > (PUNYCODE_MAXINT - delta) / (h + 1) - raise PunycodeOverflow, "Input needs wider integers to process." - end - delta += (m - n) * (h + 1) - n = m - - input_length.times do |j| - # Punycode does not need to check whether input[j] is basic: - if input[j] < n - delta += 1 - if delta == 0 - raise PunycodeOverflow, - "Input needs wider integers to process." - end - end - - if input[j] == n - # Represent delta as a generalized variable-length integer: - - q = delta; k = PUNYCODE_BASE - while true - if out >= max_out - raise PunycodeBigOutput, - "Output would exceed the space provided." - end - t = ( - if k <= bias - PUNYCODE_TMIN - elsif k >= bias + PUNYCODE_TMAX - PUNYCODE_TMAX - else - k - bias - end - ) - break if q < t - output[out] = - punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t)) - out += 1 - q = (q - t) / (PUNYCODE_BASE - t) - k += PUNYCODE_BASE - end - - output[out] = punycode_encode_digit(q) - out += 1 - bias = punycode_adapt(delta, h + 1, h == b) - delta = 0 - h += 1 - end - end - - delta += 1 - n += 1 - end - - output_length[0] = out - - outlen = out - outlen.times do |j| - c = output[j] - unless c >= 0 && c <= 127 - raise StandardError, "Invalid output char." - end - unless PUNYCODE_PRINT_ASCII[c] - raise PunycodeBadInput, "Input is invalid." - end - end - - output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "") - end - (class <= 0 && c <= 127 - raise PunycodeBadInput, "Input is invalid." - end - input.push(c) - end - - input_length = input.length - output_length = [UNICODE_MAX_LENGTH] - - # Initialize the state - n = PUNYCODE_INITIAL_N - - out = i = 0 - max_out = output_length[0] - bias = PUNYCODE_INITIAL_BIAS - - # Handle the basic code points: Let b be the number of input code - # points before the last delimiter, or 0 if there is none, then - # copy the first b code points to the output. - - b = 0 - input_length.times do |j| - b = j if punycode_delimiter?(input[j]) - end - if b > max_out - raise PunycodeBigOutput, "Output would exceed the space provided." - end - - b.times do |j| - unless punycode_basic?(input[j]) - raise PunycodeBadInput, "Input is invalid." - end - output[out] = input[j] - out+=1 - end - - # Main decoding loop: Start just after the last delimiter if any - # basic code points were copied; start at the beginning otherwise. - - in_ = b > 0 ? b + 1 : 0 - while in_ < input_length - - # in_ is the index of the next character to be consumed, and - # out is the number of code points in the output array. - - # Decode a generalized variable-length integer into delta, - # which gets added to i. The overflow checking is easier - # if we increase i as we go, then subtract off its starting - # value at the end to obtain delta. - - oldi = i; w = 1; k = PUNYCODE_BASE - while true - if in_ >= input_length - raise PunycodeBadInput, "Input is invalid." - end - digit = punycode_decode_digit(input[in_]) - in_+=1 - if digit >= PUNYCODE_BASE - raise PunycodeBadInput, "Input is invalid." - end - if digit > (PUNYCODE_MAXINT - i) / w - raise PunycodeOverflow, "Input needs wider integers to process." - end - i += digit * w - t = ( - if k <= bias - PUNYCODE_TMIN - elsif k >= bias + PUNYCODE_TMAX - PUNYCODE_TMAX - else - k - bias - end - ) - break if digit < t - if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t) - raise PunycodeOverflow, "Input needs wider integers to process." - end - w *= PUNYCODE_BASE - t - k += PUNYCODE_BASE - end - - bias = punycode_adapt(i - oldi, out + 1, oldi == 0) - - # I was supposed to wrap around from out + 1 to 0, - # incrementing n each time, so we'll fix that now: - - if i / (out + 1) > PUNYCODE_MAXINT - n - raise PunycodeOverflow, "Input needs wider integers to process." - end - n += i / (out + 1) - i %= out + 1 - - # Insert n at position i of the output: - - # not needed for Punycode: - # raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base - if out >= max_out - raise PunycodeBigOutput, "Output would exceed the space provided." - end - - #memmove(output + i + 1, output + i, (out - i) * sizeof *output) - output[i + 1, out - i] = output[i, out - i] - output[i] = n - i += 1 - - out += 1 - end - - output_length[0] = out - - output.pack("U*") - end - (class <> 1 - # delta >> 1 is a faster way of doing delta / 2 - delta += delta / numpoints - difference = PUNYCODE_BASE - PUNYCODE_TMIN - - k = 0 - while delta > (difference * PUNYCODE_TMAX) / 2 - delta /= difference - k += PUNYCODE_BASE - end - - k + (difference + 1) * delta / (delta + PUNYCODE_SKEW) - end - (class < '?', - '/' => '/', - '#' => '#', - '.' => '.', - ';' => ';', - '&' => '&' - } - JOINERS = { - '?' => '&', - '.' => '.', - ';' => ';', - '&' => '&', - '/' => '/' - } - - ## - # Raised if an invalid template value is supplied. - class InvalidTemplateValueError < StandardError - end - - ## - # Raised if an invalid template operator is used in a pattern. - class InvalidTemplateOperatorError < StandardError - end - - ## - # Raised if an invalid template operator is used in a pattern. - class TemplateOperatorAbortedError < StandardError - end - - ## - # This class represents the data that is extracted when a Template - # is matched against a URI. - class MatchData - ## - # Creates a new MatchData object. - # MatchData objects should never be instantiated directly. - # - # @param [Addressable::URI] uri - # The URI that the template was matched against. - def initialize(uri, template, mapping) - @uri = uri.dup.freeze - @template = template - @mapping = mapping.dup.freeze - end - - ## - # @return [Addressable::URI] - # The URI that the Template was matched against. - attr_reader :uri - - ## - # @return [Addressable::Template] - # The Template used for the match. - attr_reader :template - - ## - # @return [Hash] - # The mapping that resulted from the match. - # Note that this mapping does not include keys or values for - # variables that appear in the Template, but are not present - # in the URI. - attr_reader :mapping - - ## - # @return [Array] - # The list of variables that were present in the Template. - # Note that this list will include variables which do not appear - # in the mapping because they were not present in URI. - def variables - self.template.variables - end - alias_method :keys, :variables - alias_method :names, :variables - - ## - # @return [Array] - # The list of values that were captured by the Template. - # Note that this list will include nils for any variables which - # were in the Template, but did not appear in the URI. - def values - @values ||= self.variables.inject([]) do |accu, key| - accu << self.mapping[key] - accu - end - end - alias_method :captures, :values - - ## - # Accesses captured values by name or by index. - # - # @param [String, Symbol, Fixnum] key - # Capture index or name. Note that when accessing by with index - # of 0, the full URI will be returned. The intention is to mimic - # the ::MatchData#[] behavior. - # - # @param [#to_int, nil] len - # If provided, an array of values will be returend with the given - # parameter used as length. - # - # @return [Array, String, nil] - # The captured value corresponding to the index or name. If the - # value was not provided or the key is unknown, nil will be - # returned. - # - # If the second parameter is provided, an array of that length will - # be returned instead. - def [](key, len = nil) - if len - to_a[key, len] - elsif String === key or Symbol === key - mapping[key.to_s] - else - to_a[key] - end - end - - ## - # @return [Array] - # Array with the matched URI as first element followed by the captured - # values. - def to_a - [to_s, *values] - end - - ## - # @return [String] - # The matched URI as String. - def to_s - uri.to_s - end - alias_method :string, :to_s - - # Returns multiple captured values at once. - # - # @param [String, Symbol, Fixnum] *indexes - # Indices of the captures to be returned - # - # @return [Array] - # Values corresponding to given indices. - # - # @see Addressable::Template::MatchData#[] - def values_at(*indexes) - indexes.map { |i| self[i] } - end - - ## - # Returns a String representation of the MatchData's state. - # - # @return [String] The MatchData's state, as a String. - def inspect - sprintf("#<%s:%#0x RESULT:%s>", - self.class.to_s, self.object_id, self.mapping.inspect) - end - - ## - # Dummy method for code expecting a ::MatchData instance - # - # @return [String] An empty string. - def pre_match - "" - end - alias_method :post_match, :pre_match - end - - ## - # Creates a new Addressable::Template object. - # - # @param [#to_str] pattern The URI Template pattern. - # - # @return [Addressable::Template] The initialized Template object. - def initialize(pattern) - if !pattern.respond_to?(:to_str) - raise TypeError, "Can't convert #{pattern.class} into String." - end - @pattern = pattern.to_str.dup.freeze - end - - ## - # Freeze URI, initializing instance variables. - # - # @return [Addressable::URI] The frozen URI object. - def freeze - self.variables - self.variable_defaults - self.named_captures - super - end - - ## - # @return [String] The Template object's pattern. - attr_reader :pattern - - ## - # Returns a String representation of the Template object's state. - # - # @return [String] The Template object's state, as a String. - def inspect - sprintf("#<%s:%#0x PATTERN:%s>", - self.class.to_s, self.object_id, self.pattern) - end - - ## - # Returns true if the Template objects are equal. This method - # does NOT normalize either Template before doing the comparison. - # - # @param [Object] template The Template to compare. - # - # @return [TrueClass, FalseClass] - # true if the Templates are equivalent, false - # otherwise. - def ==(template) - return false unless template.kind_of?(Template) - return self.pattern == template.pattern - end - - ## - # Addressable::Template makes no distinction between `==` and `eql?`. - # - # @see #== - alias_method :eql?, :== - - ## - # Extracts a mapping from the URI using a URI Template pattern. - # - # @param [Addressable::URI, #to_str] uri - # The URI to extract from. - # - # @param [#restore, #match] processor - # A template processor object may optionally be supplied. - # - # The object should respond to either the restore or - # match messages or both. The restore method should - # take two parameters: `[String] name` and `[String] value`. - # The restore method should reverse any transformations that - # have been performed on the value to ensure a valid URI. - # The match method should take a single - # parameter: `[String] name`. The match method should return - # a String containing a regular expression capture group for - # matching on that particular variable. The default value is `".*?"`. - # The match method has no effect on multivariate operator - # expansions. - # - # @return [Hash, NilClass] - # The Hash mapping that was extracted from the URI, or - # nil if the URI didn't match the template. - # - # @example - # class ExampleProcessor - # def self.restore(name, value) - # return value.gsub(/\+/, " ") if name == "query" - # return value - # end - # - # def self.match(name) - # return ".*?" if name == "first" - # return ".*" - # end - # end - # - # uri = Addressable::URI.parse( - # "http://example.com/search/an+example+search+query/" - # ) - # Addressable::Template.new( - # "http://example.com/search/{query}/" - # ).extract(uri, ExampleProcessor) - # #=> {"query" => "an example search query"} - # - # uri = Addressable::URI.parse("http://example.com/a/b/c/") - # Addressable::Template.new( - # "http://example.com/{first}/{second}/" - # ).extract(uri, ExampleProcessor) - # #=> {"first" => "a", "second" => "b/c"} - # - # uri = Addressable::URI.parse("http://example.com/a/b/c/") - # Addressable::Template.new( - # "http://example.com/{first}/{-list|/|second}/" - # ).extract(uri) - # #=> {"first" => "a", "second" => ["b", "c"]} - def extract(uri, processor=nil) - match_data = self.match(uri, processor) - return (match_data ? match_data.mapping : nil) - end - - ## - # Extracts match data from the URI using a URI Template pattern. - # - # @param [Addressable::URI, #to_str] uri - # The URI to extract from. - # - # @param [#restore, #match] processor - # A template processor object may optionally be supplied. - # - # The object should respond to either the restore or - # match messages or both. The restore method should - # take two parameters: `[String] name` and `[String] value`. - # The restore method should reverse any transformations that - # have been performed on the value to ensure a valid URI. - # The match method should take a single - # parameter: `[String] name`. The match method should return - # a String containing a regular expression capture group for - # matching on that particular variable. The default value is `".*?"`. - # The match method has no effect on multivariate operator - # expansions. - # - # @return [Hash, NilClass] - # The Hash mapping that was extracted from the URI, or - # nil if the URI didn't match the template. - # - # @example - # class ExampleProcessor - # def self.restore(name, value) - # return value.gsub(/\+/, " ") if name == "query" - # return value - # end - # - # def self.match(name) - # return ".*?" if name == "first" - # return ".*" - # end - # end - # - # uri = Addressable::URI.parse( - # "http://example.com/search/an+example+search+query/" - # ) - # match = Addressable::Template.new( - # "http://example.com/search/{query}/" - # ).match(uri, ExampleProcessor) - # match.variables - # #=> ["query"] - # match.captures - # #=> ["an example search query"] - # - # uri = Addressable::URI.parse("http://example.com/a/b/c/") - # match = Addressable::Template.new( - # "http://example.com/{first}/{+second}/" - # ).match(uri, ExampleProcessor) - # match.variables - # #=> ["first", "second"] - # match.captures - # #=> ["a", "b/c"] - # - # uri = Addressable::URI.parse("http://example.com/a/b/c/") - # match = Addressable::Template.new( - # "http://example.com/{first}{/second*}/" - # ).match(uri) - # match.variables - # #=> ["first", "second"] - # match.captures - # #=> ["a", ["b", "c"]] - def match(uri, processor=nil) - uri = Addressable::URI.parse(uri) - mapping = {} - - # First, we need to process the pattern, and extract the values. - expansions, expansion_regexp = - parse_template_pattern(pattern, processor) - - return nil unless uri.to_str.match(expansion_regexp) - unparsed_values = uri.to_str.scan(expansion_regexp).flatten - - if uri.to_str == pattern - return Addressable::Template::MatchData.new(uri, self, mapping) - elsif expansions.size > 0 - index = 0 - expansions.each do |expansion| - _, operator, varlist = *expansion.match(EXPRESSION) - varlist.split(',').each do |varspec| - _, name, modifier = *varspec.match(VARSPEC) - mapping[name] ||= nil - case operator - when nil, '+', '#', '/', '.' - unparsed_value = unparsed_values[index] - name = varspec[VARSPEC, 1] - value = unparsed_value - value = value.split(JOINERS[operator]) if value && modifier == '*' - when ';', '?', '&' - if modifier == '*' - if unparsed_values[index] - value = unparsed_values[index].split(JOINERS[operator]) - value = value.inject({}) do |acc, v| - key, val = v.split('=') - val = "" if val.nil? - acc[key] = val - acc - end - end - else - if (unparsed_values[index]) - name, value = unparsed_values[index].split('=') - value = "" if value.nil? - end - end - end - if processor != nil && processor.respond_to?(:restore) - value = processor.restore(name, value) - end - if processor == nil - if value.is_a?(Hash) - value = value.inject({}){|acc, (k, v)| - acc[Addressable::URI.unencode_component(k)] = - Addressable::URI.unencode_component(v) - acc - } - elsif value.is_a?(Array) - value = value.map{|v| Addressable::URI.unencode_component(v) } - else - value = Addressable::URI.unencode_component(value) - end - end - if !mapping.has_key?(name) || mapping[name].nil? - # Doesn't exist, set to value (even if value is nil) - mapping[name] = value - end - index = index + 1 - end - end - return Addressable::Template::MatchData.new(uri, self, mapping) - else - return nil - end - end - - ## - # Expands a URI template into another URI template. - # - # @param [Hash] mapping The mapping that corresponds to the pattern. - # @param [#validate, #transform] processor - # An optional processor object may be supplied. - # @param [Boolean] normalize_values - # Optional flag to enable/disable unicode normalization. Default: true - # - # The object should respond to either the validate or - # transform messages or both. Both the validate and - # transform methods should take two parameters: name and - # value. The validate method should return true - # or false; true if the value of the variable is valid, - # false otherwise. An InvalidTemplateValueError - # exception will be raised if the value is invalid. The transform - # method should return the transformed variable value as a String. - # If a transform method is used, the value will not be percent - # encoded automatically. Unicode normalization will be performed both - # before and after sending the value to the transform method. - # - # @return [Addressable::Template] The partially expanded URI template. - # - # @example - # Addressable::Template.new( - # "http://example.com/{one}/{two}/" - # ).partial_expand({"one" => "1"}).pattern - # #=> "http://example.com/1/{two}/" - # - # Addressable::Template.new( - # "http://example.com/{?one,two}/" - # ).partial_expand({"one" => "1"}).pattern - # #=> "http://example.com/?one=1{&two}/" - # - # Addressable::Template.new( - # "http://example.com/{?one,two,three}/" - # ).partial_expand({"one" => "1", "three" => 3}).pattern - # #=> "http://example.com/?one=1{&two}&three=3" - def partial_expand(mapping, processor=nil, normalize_values=true) - result = self.pattern.dup - mapping = normalize_keys(mapping) - result.gsub!( EXPRESSION ) do |capture| - transform_partial_capture(mapping, capture, processor, normalize_values) - end - return Addressable::Template.new(result) - end - - ## - # Expands a URI template into a full URI. - # - # @param [Hash] mapping The mapping that corresponds to the pattern. - # @param [#validate, #transform] processor - # An optional processor object may be supplied. - # @param [Boolean] normalize_values - # Optional flag to enable/disable unicode normalization. Default: true - # - # The object should respond to either the validate or - # transform messages or both. Both the validate and - # transform methods should take two parameters: name and - # value. The validate method should return true - # or false; true if the value of the variable is valid, - # false otherwise. An InvalidTemplateValueError - # exception will be raised if the value is invalid. The transform - # method should return the transformed variable value as a String. - # If a transform method is used, the value will not be percent - # encoded automatically. Unicode normalization will be performed both - # before and after sending the value to the transform method. - # - # @return [Addressable::URI] The expanded URI template. - # - # @example - # class ExampleProcessor - # def self.validate(name, value) - # return !!(value =~ /^[\w ]+$/) if name == "query" - # return true - # end - # - # def self.transform(name, value) - # return value.gsub(/ /, "+") if name == "query" - # return value - # end - # end - # - # Addressable::Template.new( - # "http://example.com/search/{query}/" - # ).expand( - # {"query" => "an example search query"}, - # ExampleProcessor - # ).to_str - # #=> "http://example.com/search/an+example+search+query/" - # - # Addressable::Template.new( - # "http://example.com/search/{query}/" - # ).expand( - # {"query" => "an example search query"} - # ).to_str - # #=> "http://example.com/search/an%20example%20search%20query/" - # - # Addressable::Template.new( - # "http://example.com/search/{query}/" - # ).expand( - # {"query" => "bogus!"}, - # ExampleProcessor - # ).to_str - # #=> Addressable::Template::InvalidTemplateValueError - def expand(mapping, processor=nil, normalize_values=true) - result = self.pattern.dup - mapping = normalize_keys(mapping) - result.gsub!( EXPRESSION ) do |capture| - transform_capture(mapping, capture, processor, normalize_values) - end - return Addressable::URI.parse(result) - end - - ## - # Returns an Array of variables used within the template pattern. - # The variables are listed in the Array in the order they appear within - # the pattern. Multiple occurrences of a variable within a pattern are - # not represented in this Array. - # - # @return [Array] The variables present in the template's pattern. - def variables - @variables ||= ordered_variable_defaults.map { |var, val| var }.uniq - end - alias_method :keys, :variables - alias_method :names, :variables - - ## - # Returns a mapping of variables to their default values specified - # in the template. Variables without defaults are not returned. - # - # @return [Hash] Mapping of template variables to their defaults - def variable_defaults - @variable_defaults ||= - Hash[*ordered_variable_defaults.reject { |k, v| v.nil? }.flatten] - end - - ## - # Coerces a template into a `Regexp` object. This regular expression will - # behave very similarly to the actual template, and should match the same - # URI values, but it cannot fully handle, for example, values that would - # extract to an `Array`. - # - # @return [Regexp] A regular expression which should match the template. - def to_regexp - _, source = parse_template_pattern(pattern) - Regexp.new(source) - end - - ## - # Returns the source of the coerced `Regexp`. - # - # @return [String] The source of the `Regexp` given by {#to_regexp}. - # - # @api private - def source - self.to_regexp.source - end - - ## - # Returns the named captures of the coerced `Regexp`. - # - # @return [Hash] The named captures of the `Regexp` given by {#to_regexp}. - # - # @api private - def named_captures - self.to_regexp.named_captures - end - - ## - # Generates a route result for a given set of parameters. - # Should only be used by rack-mount. - # - # @param params [Hash] The set of parameters used to expand the template. - # @param recall [Hash] Default parameters used to expand the template. - # @param options [Hash] Either a `:processor` or a `:parameterize` block. - # - # @api private - def generate(params={}, recall={}, options={}) - merged = recall.merge(params) - if options[:processor] - processor = options[:processor] - elsif options[:parameterize] - # TODO: This is sending me into fits trying to shoe-horn this into - # the existing API. I think I've got this backwards and processors - # should be a set of 4 optional blocks named :validate, :transform, - # :match, and :restore. Having to use a singleton here is a huge - # code smell. - processor = Object.new - class <validate or - # transform messages or both. Both the validate and - # transform methods should take two parameters: name and - # value. The validate method should return true - # or false; true if the value of the variable is valid, - # false otherwise. An InvalidTemplateValueError exception - # will be raised if the value is invalid. The transform method - # should return the transformed variable value as a String. If a - # transform method is used, the value will not be percent encoded - # automatically. Unicode normalization will be performed both before and - # after sending the value to the transform method. - # - # @return [String] The expanded expression - def transform_partial_capture(mapping, capture, processor = nil, - normalize_values = true) - _, operator, varlist = *capture.match(EXPRESSION) - - vars = varlist.split(',') - - if '?' == operator - # partial expansion of form style query variables sometimes requires a - # slight reordering of the variables to produce a valid url. - first_to_expand = vars.find { |varspec| - _, name, _ = *varspec.match(VARSPEC) - mapping.key? name - } - - vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand} if first_to_expand - end - - vars - .zip(operator_sequence(operator).take(vars.length)) - .reduce("".dup) do |acc, (varspec, op)| - _, name, _ = *varspec.match(VARSPEC) - - acc << if mapping.key? name - transform_capture(mapping, "{#{op}#{varspec}}", - processor, normalize_values) - else - "{#{op}#{varspec}}" - end - end - end - - ## - # Creates a lazy Enumerator of the operators that should be used to expand - # variables in a varlist starting with `operator`. For example, an operator - # `"?"` results in the sequence `"?","&","&"...` - # - # @param [String] operator from which to generate a sequence - # - # @return [Enumerator] sequence of operators - def operator_sequence(operator) - rest_operator = if "?" == operator - "&" - else - operator - end - head_operator = operator - - Enumerator.new do |y| - y << head_operator.to_s - while true - y << rest_operator.to_s - end - end - end - - ## - # Transforms a mapped value so that values can be substituted into the - # template. - # - # @param [Hash] mapping The mapping to replace captures - # @param [String] capture - # The expression to replace - # @param [#validate, #transform] processor - # An optional processor object may be supplied. - # @param [Boolean] normalize_values - # Optional flag to enable/disable unicode normalization. Default: true - # - # - # The object should respond to either the validate or - # transform messages or both. Both the validate and - # transform methods should take two parameters: name and - # value. The validate method should return true - # or false; true if the value of the variable is valid, - # false otherwise. An InvalidTemplateValueError exception - # will be raised if the value is invalid. The transform method - # should return the transformed variable value as a String. If a - # transform method is used, the value will not be percent encoded - # automatically. Unicode normalization will be performed both before and - # after sending the value to the transform method. - # - # @return [String] The expanded expression - def transform_capture(mapping, capture, processor=nil, - normalize_values=true) - _, operator, varlist = *capture.match(EXPRESSION) - return_value = varlist.split(',').inject([]) do |acc, varspec| - _, name, modifier = *varspec.match(VARSPEC) - value = mapping[name] - unless value == nil || value == {} - allow_reserved = %w(+ #).include?(operator) - # Common primitives where the .to_s output is well-defined - if Numeric === value || Symbol === value || - value == true || value == false - value = value.to_s - end - length = modifier.gsub(':', '').to_i if modifier =~ /^:\d+/ - - unless (Hash === value) || - value.respond_to?(:to_ary) || value.respond_to?(:to_str) - raise TypeError, - "Can't convert #{value.class} into String or Array." - end - - value = normalize_value(value) if normalize_values - - if processor == nil || !processor.respond_to?(:transform) - # Handle percent escaping - if allow_reserved - encode_map = - Addressable::URI::CharacterClasses::RESERVED + - Addressable::URI::CharacterClasses::UNRESERVED - else - encode_map = Addressable::URI::CharacterClasses::UNRESERVED - end - if value.kind_of?(Array) - transformed_value = value.map do |val| - if length - Addressable::URI.encode_component(val[0...length], encode_map) - else - Addressable::URI.encode_component(val, encode_map) - end - end - unless modifier == "*" - transformed_value = transformed_value.join(',') - end - elsif value.kind_of?(Hash) - transformed_value = value.map do |key, val| - if modifier == "*" - "#{ - Addressable::URI.encode_component( key, encode_map) - }=#{ - Addressable::URI.encode_component( val, encode_map) - }" - else - "#{ - Addressable::URI.encode_component( key, encode_map) - },#{ - Addressable::URI.encode_component( val, encode_map) - }" - end - end - unless modifier == "*" - transformed_value = transformed_value.join(',') - end - else - if length - transformed_value = Addressable::URI.encode_component( - value[0...length], encode_map) - else - transformed_value = Addressable::URI.encode_component( - value, encode_map) - end - end - end - - # Process, if we've got a processor - if processor != nil - if processor.respond_to?(:validate) - if !processor.validate(name, value) - display_value = value.kind_of?(Array) ? value.inspect : value - raise InvalidTemplateValueError, - "#{name}=#{display_value} is an invalid template value." - end - end - if processor.respond_to?(:transform) - transformed_value = processor.transform(name, value) - if normalize_values - transformed_value = normalize_value(transformed_value) - end - end - end - acc << [name, transformed_value] - end - acc - end - return "" if return_value.empty? - join_values(operator, return_value) - end - - ## - # Takes a set of values, and joins them together based on the - # operator. - # - # @param [String, Nil] operator One of the operators from the set - # (?,&,+,#,;,/,.), or nil if there wasn't one. - # @param [Array] return_value - # The set of return values (as [variable_name, value] tuples) that will - # be joined together. - # - # @return [String] The transformed mapped value - def join_values(operator, return_value) - leader = LEADERS.fetch(operator, '') - joiner = JOINERS.fetch(operator, ',') - case operator - when '&', '?' - leader + return_value.map{|k,v| - if v.is_a?(Array) && v.first =~ /=/ - v.join(joiner) - elsif v.is_a?(Array) - v.map{|inner_value| "#{k}=#{inner_value}"}.join(joiner) - else - "#{k}=#{v}" - end - }.join(joiner) - when ';' - return_value.map{|k,v| - if v.is_a?(Array) && v.first =~ /=/ - ';' + v.join(";") - elsif v.is_a?(Array) - ';' + v.map{|inner_value| "#{k}=#{inner_value}"}.join(";") - else - v && v != '' ? ";#{k}=#{v}" : ";#{k}" - end - }.join - else - leader + return_value.map{|k,v| v}.join(joiner) - end - end - - ## - # Takes a set of values, and joins them together based on the - # operator. - # - # @param [Hash, Array, String] value - # Normalizes keys and values with IDNA#unicode_normalize_kc - # - # @return [Hash, Array, String] The normalized values - def normalize_value(value) - unless value.is_a?(Hash) - value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str - end - - # Handle unicode normalization - if value.kind_of?(Array) - value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) } - elsif value.kind_of?(Hash) - value = value.inject({}) { |acc, (k, v)| - acc[Addressable::IDNA.unicode_normalize_kc(k)] = - Addressable::IDNA.unicode_normalize_kc(v) - acc - } - else - value = Addressable::IDNA.unicode_normalize_kc(value) - end - value - end - - ## - # Generates a hash with string keys - # - # @param [Hash] mapping A mapping hash to normalize - # - # @return [Hash] - # A hash with stringified keys - def normalize_keys(mapping) - return mapping.inject({}) do |accu, pair| - name, value = pair - if Symbol === name - name = name.to_s - elsif name.respond_to?(:to_str) - name = name.to_str - else - raise TypeError, - "Can't convert #{name.class} into String." - end - accu[name] = value - accu - end - end - - ## - # Generates the Regexp that parses a template pattern. - # - # @param [String] pattern The URI template pattern. - # @param [#match] processor The template processor to use. - # - # @return [Regexp] - # A regular expression which may be used to parse a template pattern. - def parse_template_pattern(pattern, processor=nil) - # Escape the pattern. The two gsubs restore the escaped curly braces - # back to their original form. Basically, escape everything that isn't - # within an expansion. - escaped_pattern = Regexp.escape( - pattern - ).gsub(/\\\{(.*?)\\\}/) do |escaped| - escaped.gsub(/\\(.)/, "\\1") - end - - expansions = [] - - # Create a regular expression that captures the values of the - # variables in the URI. - regexp_string = escaped_pattern.gsub( EXPRESSION ) do |expansion| - - expansions << expansion - _, operator, varlist = *expansion.match(EXPRESSION) - leader = Regexp.escape(LEADERS.fetch(operator, '')) - joiner = Regexp.escape(JOINERS.fetch(operator, ',')) - combined = varlist.split(',').map do |varspec| - _, name, modifier = *varspec.match(VARSPEC) - - result = processor && processor.respond_to?(:match) ? processor.match(name) : nil - if result - "(?<#{name}>#{ result })" - else - group = case operator - when '+' - "#{ RESERVED }*?" - when '#' - "#{ RESERVED }*?" - when '/' - "#{ UNRESERVED }*?" - when '.' - "#{ UNRESERVED.gsub('\.', '') }*?" - when ';' - "#{ UNRESERVED }*=?#{ UNRESERVED }*?" - when '?' - "#{ UNRESERVED }*=#{ UNRESERVED }*?" - when '&' - "#{ UNRESERVED }*=#{ UNRESERVED }*?" - else - "#{ UNRESERVED }*?" - end - if modifier == '*' - "(?<#{name}>#{group}(?:#{joiner}?#{group})*)?" - else - "(?<#{name}>#{group})?" - end - end - end.join("#{joiner}?") - "(?:|#{leader}#{combined})" - end - - # Ensure that the regular expression matches the whole URI. - regexp_string = "^#{regexp_string}$" - return expansions, Regexp.new(regexp_string) - end - - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb deleted file mode 100644 index a4fa1a7ceebc67d54d19b28806b4e3ba15ecbc03..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb +++ /dev/null @@ -1,2492 +0,0 @@ -# encoding:utf-8 -#-- -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#++ - - -require "addressable/version" -require "addressable/idna" -require "public_suffix" - -## -# Addressable is a library for processing links and URIs. -module Addressable - ## - # This is an implementation of a URI parser based on - # RFC 3986, - # RFC 3987. - class URI - ## - # Raised if something other than a uri is supplied. - class InvalidURIError < StandardError - end - - ## - # Container for the character classes specified in - # RFC 3986. - module CharacterClasses - ALPHA = "a-zA-Z" - DIGIT = "0-9" - GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@" - SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=" - RESERVED = GEN_DELIMS + SUB_DELIMS - UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~" - PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@" - SCHEME = ALPHA + DIGIT + "\\-\\+\\." - HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]" - AUTHORITY = PCHAR - PATH = PCHAR + "\\/" - QUERY = PCHAR + "\\/\\?" - FRAGMENT = PCHAR + "\\/\\?" - end - - SLASH = '/' - EMPTY_STR = '' - - URIREGEX = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ - - PORT_MAPPING = { - "http" => 80, - "https" => 443, - "ftp" => 21, - "tftp" => 69, - "sftp" => 22, - "ssh" => 22, - "svn+ssh" => 22, - "telnet" => 23, - "nntp" => 119, - "gopher" => 70, - "wais" => 210, - "ldap" => 389, - "prospero" => 1525 - } - - ## - # Returns a URI object based on the parsed string. - # - # @param [String, Addressable::URI, #to_str] uri - # The URI string to parse. - # No parsing is performed if the object is already an - # Addressable::URI. - # - # @return [Addressable::URI] The parsed URI. - def self.parse(uri) - # If we were given nil, return nil. - return nil unless uri - # If a URI object is passed, just return itself. - return uri.dup if uri.kind_of?(self) - - # If a URI object of the Ruby standard library variety is passed, - # convert it to a string, then parse the string. - # We do the check this way because we don't want to accidentally - # cause a missing constant exception to be thrown. - if uri.class.name =~ /^URI\b/ - uri = uri.to_s - end - - # Otherwise, convert to a String - begin - uri = uri.to_str - rescue TypeError, NoMethodError - raise TypeError, "Can't convert #{uri.class} into String." - end if not uri.is_a? String - - # This Regexp supplied as an example in RFC 3986, and it works great. - scan = uri.scan(URIREGEX) - fragments = scan[0] - scheme = fragments[1] - authority = fragments[3] - path = fragments[4] - query = fragments[6] - fragment = fragments[8] - user = nil - password = nil - host = nil - port = nil - if authority != nil - # The Regexp above doesn't split apart the authority. - userinfo = authority[/^([^\[\]]*)@/, 1] - if userinfo != nil - user = userinfo.strip[/^([^:]*):?/, 1] - password = userinfo.strip[/:(.*)$/, 1] - end - host = authority.gsub( - /^([^\[\]]*)@/, EMPTY_STR - ).gsub( - /:([^:@\[\]]*?)$/, EMPTY_STR - ) - port = authority[/:([^:@\[\]]*?)$/, 1] - end - if port == EMPTY_STR - port = nil - end - - return new( - :scheme => scheme, - :user => user, - :password => password, - :host => host, - :port => port, - :path => path, - :query => query, - :fragment => fragment - ) - end - - ## - # Converts an input to a URI. The input does not have to be a valid - # URI — the method will use heuristics to guess what URI was intended. - # This is not standards-compliant, merely user-friendly. - # - # @param [String, Addressable::URI, #to_str] uri - # The URI string to parse. - # No parsing is performed if the object is already an - # Addressable::URI. - # @param [Hash] hints - # A Hash of hints to the heuristic parser. - # Defaults to {:scheme => "http"}. - # - # @return [Addressable::URI] The parsed URI. - def self.heuristic_parse(uri, hints={}) - # If we were given nil, return nil. - return nil unless uri - # If a URI object is passed, just return itself. - return uri.dup if uri.kind_of?(self) - - # If a URI object of the Ruby standard library variety is passed, - # convert it to a string, then parse the string. - # We do the check this way because we don't want to accidentally - # cause a missing constant exception to be thrown. - if uri.class.name =~ /^URI\b/ - uri = uri.to_s - end - - if !uri.respond_to?(:to_str) - raise TypeError, "Can't convert #{uri.class} into String." - end - # Otherwise, convert to a String - uri = uri.to_str.dup.strip - hints = { - :scheme => "http" - }.merge(hints) - case uri - when /^http:\/+/ - uri.gsub!(/^http:\/+/, "http://") - when /^https:\/+/ - uri.gsub!(/^https:\/+/, "https://") - when /^feed:\/+http:\/+/ - uri.gsub!(/^feed:\/+http:\/+/, "feed:http://") - when /^feed:\/+/ - uri.gsub!(/^feed:\/+/, "feed://") - when /^file:\/+/ - uri.gsub!(/^file:\/+/, "file:///") - when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ - uri.gsub!(/^/, hints[:scheme] + "://") - end - match = uri.match(URIREGEX) - fragments = match.captures - authority = fragments[3] - if authority && authority.length > 0 - new_authority = authority.gsub(/\\/, '/').gsub(/ /, '%20') - # NOTE: We want offset 4, not 3! - offset = match.offset(4) - uri[offset[0]...offset[1]] = new_authority - end - parsed = self.parse(uri) - if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/ - parsed = self.parse(hints[:scheme] + "://" + uri) - end - if parsed.path.include?(".") - new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1] - if new_host - parsed.defer_validation do - new_path = parsed.path.gsub( - Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR) - parsed.host = new_host - parsed.path = new_path - parsed.scheme = hints[:scheme] unless parsed.scheme - end - end - end - return parsed - end - - ## - # Converts a path to a file scheme URI. If the path supplied is - # relative, it will be returned as a relative URI. If the path supplied - # is actually a non-file URI, it will parse the URI as if it had been - # parsed with Addressable::URI.parse. Handles all of the - # various Microsoft-specific formats for specifying paths. - # - # @param [String, Addressable::URI, #to_str] path - # Typically a String path to a file or directory, but - # will return a sensible return value if an absolute URI is supplied - # instead. - # - # @return [Addressable::URI] - # The parsed file scheme URI or the original URI if some other URI - # scheme was provided. - # - # @example - # base = Addressable::URI.convert_path("/absolute/path/") - # uri = Addressable::URI.convert_path("relative/path") - # (base + uri).to_s - # #=> "file:///absolute/path/relative/path" - # - # Addressable::URI.convert_path( - # "c:\\windows\\My Documents 100%20\\foo.txt" - # ).to_s - # #=> "file:///c:/windows/My%20Documents%20100%20/foo.txt" - # - # Addressable::URI.convert_path("http://example.com/").to_s - # #=> "http://example.com/" - def self.convert_path(path) - # If we were given nil, return nil. - return nil unless path - # If a URI object is passed, just return itself. - return path if path.kind_of?(self) - if !path.respond_to?(:to_str) - raise TypeError, "Can't convert #{path.class} into String." - end - # Otherwise, convert to a String - path = path.to_str.strip - - path.gsub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/ - path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/ - uri = self.parse(path) - - if uri.scheme == nil - # Adjust windows-style uris - uri.path.gsub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do - "/#{$1.downcase}:/" - end - uri.path.gsub!(/\\/, SLASH) - if File.exist?(uri.path) && - File.stat(uri.path).directory? - uri.path.gsub!(/\/$/, EMPTY_STR) - uri.path = uri.path + '/' - end - - # If the path is absolute, set the scheme and host. - if uri.path =~ /^\// - uri.scheme = "file" - uri.host = EMPTY_STR - end - uri.normalize! - end - - return uri - end - - ## - # Joins several URIs together. - # - # @param [String, Addressable::URI, #to_str] *uris - # The URIs to join. - # - # @return [Addressable::URI] The joined URI. - # - # @example - # base = "http://example.com/" - # uri = Addressable::URI.parse("relative/path") - # Addressable::URI.join(base, uri) - # #=> # - def self.join(*uris) - uri_objects = uris.collect do |uri| - if !uri.respond_to?(:to_str) - raise TypeError, "Can't convert #{uri.class} into String." - end - uri.kind_of?(self) ? uri : self.parse(uri.to_str) - end - result = uri_objects.shift.dup - for uri in uri_objects - result.join!(uri) - end - return result - end - - ## - # Percent encodes a URI component. - # - # @param [String, #to_str] component The URI component to encode. - # - # @param [String, Regexp] character_class - # The characters which are not percent encoded. If a String - # is passed, the String must be formatted as a regular - # expression character class. (Do not include the surrounding square - # brackets.) For example, "b-zB-Z0-9" would cause - # everything but the letters 'b' through 'z' and the numbers '0' through - # '9' to be percent encoded. If a Regexp is passed, the - # value /[^b-zB-Z0-9]/ would have the same effect. A set of - # useful String values may be found in the - # Addressable::URI::CharacterClasses module. The default - # value is the reserved plus unreserved character classes specified in - # RFC 3986. - # - # @param [Regexp] upcase_encoded - # A string of characters that may already be percent encoded, and whose - # encodings should be upcased. This allows normalization of percent - # encodings for characters not included in the - # character_class. - # - # @return [String] The encoded component. - # - # @example - # Addressable::URI.encode_component("simple/example", "b-zB-Z0-9") - # => "simple%2Fex%61mple" - # Addressable::URI.encode_component("simple/example", /[^b-zB-Z0-9]/) - # => "simple%2Fex%61mple" - # Addressable::URI.encode_component( - # "simple/example", Addressable::URI::CharacterClasses::UNRESERVED - # ) - # => "simple%2Fexample" - def self.encode_component(component, character_class= - CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, - upcase_encoded='') - return nil if component.nil? - - begin - if component.kind_of?(Symbol) || - component.kind_of?(Numeric) || - component.kind_of?(TrueClass) || - component.kind_of?(FalseClass) - component = component.to_s - else - component = component.to_str - end - rescue TypeError, NoMethodError - raise TypeError, "Can't convert #{component.class} into String." - end if !component.is_a? String - - if ![String, Regexp].include?(character_class.class) - raise TypeError, - "Expected String or Regexp, got #{character_class.inspect}" - end - if character_class.kind_of?(String) - character_class = /[^#{character_class}]/ - end - # We can't perform regexps on invalid UTF sequences, but - # here we need to, so switch to ASCII. - component = component.dup - component.force_encoding(Encoding::ASCII_8BIT) - # Avoiding gsub! because there are edge cases with frozen strings - component = component.gsub(character_class) do |sequence| - (sequence.unpack('C*').map { |c| "%" + ("%02x" % c).upcase }).join - end - if upcase_encoded.length > 0 - component = component.gsub(/%(#{upcase_encoded.chars.map do |char| - char.unpack('C*').map { |c| '%02x' % c }.join - end.join('|')})/i) { |s| s.upcase } - end - return component - end - - class << self - alias_method :encode_component, :encode_component - end - - ## - # Unencodes any percent encoded characters within a URI component. - # This method may be used for unencoding either components or full URIs, - # however, it is recommended to use the unencode_component - # alias when unencoding components. - # - # @param [String, Addressable::URI, #to_str] uri - # The URI or component to unencode. - # - # @param [Class] return_type - # The type of object to return. - # This value may only be set to String or - # Addressable::URI. All other values are invalid. Defaults - # to String. - # - # @param [String] leave_encoded - # A string of characters to leave encoded. If a percent encoded character - # in this list is encountered then it will remain percent encoded. - # - # @return [String, Addressable::URI] - # The unencoded component or URI. - # The return type is determined by the return_type - # parameter. - def self.unencode(uri, return_type=String, leave_encoded='') - return nil if uri.nil? - - begin - uri = uri.to_str - rescue NoMethodError, TypeError - raise TypeError, "Can't convert #{uri.class} into String." - end if !uri.is_a? String - if ![String, ::Addressable::URI].include?(return_type) - raise TypeError, - "Expected Class (String or Addressable::URI), " + - "got #{return_type.inspect}" - end - uri = uri.dup - # Seriously, only use UTF-8. I'm really not kidding! - uri.force_encoding("utf-8") - leave_encoded = leave_encoded.dup.force_encoding("utf-8") - result = uri.gsub(/%[0-9a-f]{2}/iu) do |sequence| - c = sequence[1..3].to_i(16).chr - c.force_encoding("utf-8") - leave_encoded.include?(c) ? sequence : c - end - result.force_encoding("utf-8") - if return_type == String - return result - elsif return_type == ::Addressable::URI - return ::Addressable::URI.parse(result) - end - end - - class << self - alias_method :unescape, :unencode - alias_method :unencode_component, :unencode - alias_method :unescape_component, :unencode - end - - - ## - # Normalizes the encoding of a URI component. - # - # @param [String, #to_str] component The URI component to encode. - # - # @param [String, Regexp] character_class - # The characters which are not percent encoded. If a String - # is passed, the String must be formatted as a regular - # expression character class. (Do not include the surrounding square - # brackets.) For example, "b-zB-Z0-9" would cause - # everything but the letters 'b' through 'z' and the numbers '0' - # through '9' to be percent encoded. If a Regexp is passed, - # the value /[^b-zB-Z0-9]/ would have the same effect. A - # set of useful String values may be found in the - # Addressable::URI::CharacterClasses module. The default - # value is the reserved plus unreserved character classes specified in - # RFC 3986. - # - # @param [String] leave_encoded - # When character_class is a String then - # leave_encoded is a string of characters that should remain - # percent encoded while normalizing the component; if they appear percent - # encoded in the original component, then they will be upcased ("%2f" - # normalized to "%2F") but otherwise left alone. - # - # @return [String] The normalized component. - # - # @example - # Addressable::URI.normalize_component("simpl%65/%65xampl%65", "b-zB-Z") - # => "simple%2Fex%61mple" - # Addressable::URI.normalize_component( - # "simpl%65/%65xampl%65", /[^b-zB-Z]/ - # ) - # => "simple%2Fex%61mple" - # Addressable::URI.normalize_component( - # "simpl%65/%65xampl%65", - # Addressable::URI::CharacterClasses::UNRESERVED - # ) - # => "simple%2Fexample" - # Addressable::URI.normalize_component( - # "one%20two%2fthree%26four", - # "0-9a-zA-Z &/", - # "/" - # ) - # => "one two%2Fthree&four" - def self.normalize_component(component, character_class= - CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, - leave_encoded='') - return nil if component.nil? - - begin - component = component.to_str - rescue NoMethodError, TypeError - raise TypeError, "Can't convert #{component.class} into String." - end if !component.is_a? String - - if ![String, Regexp].include?(character_class.class) - raise TypeError, - "Expected String or Regexp, got #{character_class.inspect}" - end - if character_class.kind_of?(String) - leave_re = if leave_encoded.length > 0 - character_class = "#{character_class}%" unless character_class.include?('%') - - "|%(?!#{leave_encoded.chars.map do |char| - seq = char.unpack('C*').map { |c| '%02x' % c }.join - [seq.upcase, seq.downcase] - end.flatten.join('|')})" - end - - character_class = /[^#{character_class}]#{leave_re}/ - end - # We can't perform regexps on invalid UTF sequences, but - # here we need to, so switch to ASCII. - component = component.dup - component.force_encoding(Encoding::ASCII_8BIT) - unencoded = self.unencode_component(component, String, leave_encoded) - begin - encoded = self.encode_component( - Addressable::IDNA.unicode_normalize_kc(unencoded), - character_class, - leave_encoded - ) - rescue ArgumentError - encoded = self.encode_component(unencoded) - end - encoded.force_encoding(Encoding::UTF_8) - return encoded - end - - ## - # Percent encodes any special characters in the URI. - # - # @param [String, Addressable::URI, #to_str] uri - # The URI to encode. - # - # @param [Class] return_type - # The type of object to return. - # This value may only be set to String or - # Addressable::URI. All other values are invalid. Defaults - # to String. - # - # @return [String, Addressable::URI] - # The encoded URI. - # The return type is determined by the return_type - # parameter. - def self.encode(uri, return_type=String) - return nil if uri.nil? - - begin - uri = uri.to_str - rescue NoMethodError, TypeError - raise TypeError, "Can't convert #{uri.class} into String." - end if !uri.is_a? String - - if ![String, ::Addressable::URI].include?(return_type) - raise TypeError, - "Expected Class (String or Addressable::URI), " + - "got #{return_type.inspect}" - end - uri_object = uri.kind_of?(self) ? uri : self.parse(uri) - encoded_uri = Addressable::URI.new( - :scheme => self.encode_component(uri_object.scheme, - Addressable::URI::CharacterClasses::SCHEME), - :authority => self.encode_component(uri_object.authority, - Addressable::URI::CharacterClasses::AUTHORITY), - :path => self.encode_component(uri_object.path, - Addressable::URI::CharacterClasses::PATH), - :query => self.encode_component(uri_object.query, - Addressable::URI::CharacterClasses::QUERY), - :fragment => self.encode_component(uri_object.fragment, - Addressable::URI::CharacterClasses::FRAGMENT) - ) - if return_type == String - return encoded_uri.to_s - elsif return_type == ::Addressable::URI - return encoded_uri - end - end - - class << self - alias_method :escape, :encode - end - - ## - # Normalizes the encoding of a URI. Characters within a hostname are - # not percent encoded to allow for internationalized domain names. - # - # @param [String, Addressable::URI, #to_str] uri - # The URI to encode. - # - # @param [Class] return_type - # The type of object to return. - # This value may only be set to String or - # Addressable::URI. All other values are invalid. Defaults - # to String. - # - # @return [String, Addressable::URI] - # The encoded URI. - # The return type is determined by the return_type - # parameter. - def self.normalized_encode(uri, return_type=String) - begin - uri = uri.to_str - rescue NoMethodError, TypeError - raise TypeError, "Can't convert #{uri.class} into String." - end if !uri.is_a? String - - if ![String, ::Addressable::URI].include?(return_type) - raise TypeError, - "Expected Class (String or Addressable::URI), " + - "got #{return_type.inspect}" - end - uri_object = uri.kind_of?(self) ? uri : self.parse(uri) - components = { - :scheme => self.unencode_component(uri_object.scheme), - :user => self.unencode_component(uri_object.user), - :password => self.unencode_component(uri_object.password), - :host => self.unencode_component(uri_object.host), - :port => (uri_object.port.nil? ? nil : uri_object.port.to_s), - :path => self.unencode_component(uri_object.path), - :query => self.unencode_component(uri_object.query), - :fragment => self.unencode_component(uri_object.fragment) - } - components.each do |key, value| - if value != nil - begin - components[key] = - Addressable::IDNA.unicode_normalize_kc(value.to_str) - rescue ArgumentError - # Likely a malformed UTF-8 character, skip unicode normalization - components[key] = value.to_str - end - end - end - encoded_uri = Addressable::URI.new( - :scheme => self.encode_component(components[:scheme], - Addressable::URI::CharacterClasses::SCHEME), - :user => self.encode_component(components[:user], - Addressable::URI::CharacterClasses::UNRESERVED), - :password => self.encode_component(components[:password], - Addressable::URI::CharacterClasses::UNRESERVED), - :host => components[:host], - :port => components[:port], - :path => self.encode_component(components[:path], - Addressable::URI::CharacterClasses::PATH), - :query => self.encode_component(components[:query], - Addressable::URI::CharacterClasses::QUERY), - :fragment => self.encode_component(components[:fragment], - Addressable::URI::CharacterClasses::FRAGMENT) - ) - if return_type == String - return encoded_uri.to_s - elsif return_type == ::Addressable::URI - return encoded_uri - end - end - - ## - # Encodes a set of key/value pairs according to the rules for the - # application/x-www-form-urlencoded MIME type. - # - # @param [#to_hash, #to_ary] form_values - # The form values to encode. - # - # @param [TrueClass, FalseClass] sort - # Sort the key/value pairs prior to encoding. - # Defaults to false. - # - # @return [String] - # The encoded value. - def self.form_encode(form_values, sort=false) - if form_values.respond_to?(:to_hash) - form_values = form_values.to_hash.to_a - elsif form_values.respond_to?(:to_ary) - form_values = form_values.to_ary - else - raise TypeError, "Can't convert #{form_values.class} into Array." - end - - form_values = form_values.inject([]) do |accu, (key, value)| - if value.kind_of?(Array) - value.each do |v| - accu << [key.to_s, v.to_s] - end - else - accu << [key.to_s, value.to_s] - end - accu - end - - if sort - # Useful for OAuth and optimizing caching systems - form_values = form_values.sort - end - escaped_form_values = form_values.map do |(key, value)| - # Line breaks are CRLF pairs - [ - self.encode_component( - key.gsub(/(\r\n|\n|\r)/, "\r\n"), - CharacterClasses::UNRESERVED - ).gsub("%20", "+"), - self.encode_component( - value.gsub(/(\r\n|\n|\r)/, "\r\n"), - CharacterClasses::UNRESERVED - ).gsub("%20", "+") - ] - end - return escaped_form_values.map do |(key, value)| - "#{key}=#{value}" - end.join("&") - end - - ## - # Decodes a String according to the rules for the - # application/x-www-form-urlencoded MIME type. - # - # @param [String, #to_str] encoded_value - # The form values to decode. - # - # @return [Array] - # The decoded values. - # This is not a Hash because of the possibility for - # duplicate keys. - def self.form_unencode(encoded_value) - if !encoded_value.respond_to?(:to_str) - raise TypeError, "Can't convert #{encoded_value.class} into String." - end - encoded_value = encoded_value.to_str - split_values = encoded_value.split("&").map do |pair| - pair.split("=", 2) - end - return split_values.map do |(key, value)| - [ - key ? self.unencode_component( - key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil, - value ? (self.unencode_component( - value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil - ] - end - end - - ## - # Creates a new uri object from component parts. - # - # @option [String, #to_str] scheme The scheme component. - # @option [String, #to_str] user The user component. - # @option [String, #to_str] password The password component. - # @option [String, #to_str] userinfo - # The userinfo component. If this is supplied, the user and password - # components must be omitted. - # @option [String, #to_str] host The host component. - # @option [String, #to_str] port The port component. - # @option [String, #to_str] authority - # The authority component. If this is supplied, the user, password, - # userinfo, host, and port components must be omitted. - # @option [String, #to_str] path The path component. - # @option [String, #to_str] query The query component. - # @option [String, #to_str] fragment The fragment component. - # - # @return [Addressable::URI] The constructed URI object. - def initialize(options={}) - if options.has_key?(:authority) - if (options.keys & [:userinfo, :user, :password, :host, :port]).any? - raise ArgumentError, - "Cannot specify both an authority and any of the components " + - "within the authority." - end - end - if options.has_key?(:userinfo) - if (options.keys & [:user, :password]).any? - raise ArgumentError, - "Cannot specify both a userinfo and either the user or password." - end - end - - self.defer_validation do - # Bunch of crazy logic required because of the composite components - # like userinfo and authority. - self.scheme = options[:scheme] if options[:scheme] - self.user = options[:user] if options[:user] - self.password = options[:password] if options[:password] - self.userinfo = options[:userinfo] if options[:userinfo] - self.host = options[:host] if options[:host] - self.port = options[:port] if options[:port] - self.authority = options[:authority] if options[:authority] - self.path = options[:path] if options[:path] - self.query = options[:query] if options[:query] - self.query_values = options[:query_values] if options[:query_values] - self.fragment = options[:fragment] if options[:fragment] - end - self.to_s - end - - ## - # Freeze URI, initializing instance variables. - # - # @return [Addressable::URI] The frozen URI object. - def freeze - self.normalized_scheme - self.normalized_user - self.normalized_password - self.normalized_userinfo - self.normalized_host - self.normalized_port - self.normalized_authority - self.normalized_site - self.normalized_path - self.normalized_query - self.normalized_fragment - self.hash - super - end - - ## - # The scheme component for this URI. - # - # @return [String] The scheme component. - def scheme - return defined?(@scheme) ? @scheme : nil - end - - ## - # The scheme component for this URI, normalized. - # - # @return [String] The scheme component, normalized. - def normalized_scheme - return nil unless self.scheme - @normalized_scheme ||= begin - if self.scheme =~ /^\s*ssh\+svn\s*$/i - "svn+ssh".dup - else - Addressable::URI.normalize_component( - self.scheme.strip.downcase, - Addressable::URI::CharacterClasses::SCHEME - ) - end - end - # All normalized values should be UTF-8 - @normalized_scheme.force_encoding(Encoding::UTF_8) if @normalized_scheme - @normalized_scheme - end - - ## - # Sets the scheme component for this URI. - # - # @param [String, #to_str] new_scheme The new scheme component. - def scheme=(new_scheme) - if new_scheme && !new_scheme.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_scheme.class} into String." - elsif new_scheme - new_scheme = new_scheme.to_str - end - if new_scheme && new_scheme !~ /\A[a-z][a-z0-9\.\+\-]*\z/i - raise InvalidURIError, "Invalid scheme format: #{new_scheme}" - end - @scheme = new_scheme - @scheme = nil if @scheme.to_s.strip.empty? - - # Reset dependent values - remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The user component for this URI. - # - # @return [String] The user component. - def user - return defined?(@user) ? @user : nil - end - - ## - # The user component for this URI, normalized. - # - # @return [String] The user component, normalized. - def normalized_user - return nil unless self.user - return @normalized_user if defined?(@normalized_user) - @normalized_user ||= begin - if normalized_scheme =~ /https?/ && self.user.strip.empty? && - (!self.password || self.password.strip.empty?) - nil - else - Addressable::URI.normalize_component( - self.user.strip, - Addressable::URI::CharacterClasses::UNRESERVED - ) - end - end - # All normalized values should be UTF-8 - @normalized_user.force_encoding(Encoding::UTF_8) if @normalized_user - @normalized_user - end - - ## - # Sets the user component for this URI. - # - # @param [String, #to_str] new_user The new user component. - def user=(new_user) - if new_user && !new_user.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_user.class} into String." - end - @user = new_user ? new_user.to_str : nil - - # You can't have a nil user with a non-nil password - if password != nil - @user = EMPTY_STR if @user.nil? - end - - # Reset dependent values - remove_instance_variable(:@userinfo) if defined?(@userinfo) - remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) - remove_instance_variable(:@authority) if defined?(@authority) - remove_instance_variable(:@normalized_user) if defined?(@normalized_user) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The password component for this URI. - # - # @return [String] The password component. - def password - return defined?(@password) ? @password : nil - end - - ## - # The password component for this URI, normalized. - # - # @return [String] The password component, normalized. - def normalized_password - return nil unless self.password - return @normalized_password if defined?(@normalized_password) - @normalized_password ||= begin - if self.normalized_scheme =~ /https?/ && self.password.strip.empty? && - (!self.user || self.user.strip.empty?) - nil - else - Addressable::URI.normalize_component( - self.password.strip, - Addressable::URI::CharacterClasses::UNRESERVED - ) - end - end - # All normalized values should be UTF-8 - if @normalized_password - @normalized_password.force_encoding(Encoding::UTF_8) - end - @normalized_password - end - - ## - # Sets the password component for this URI. - # - # @param [String, #to_str] new_password The new password component. - def password=(new_password) - if new_password && !new_password.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_password.class} into String." - end - @password = new_password ? new_password.to_str : nil - - # You can't have a nil user with a non-nil password - @password ||= nil - @user ||= nil - if @password != nil - @user = EMPTY_STR if @user.nil? - end - - # Reset dependent values - remove_instance_variable(:@userinfo) if defined?(@userinfo) - remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) - remove_instance_variable(:@authority) if defined?(@authority) - remove_instance_variable(:@normalized_password) if defined?(@normalized_password) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The userinfo component for this URI. - # Combines the user and password components. - # - # @return [String] The userinfo component. - def userinfo - current_user = self.user - current_password = self.password - (current_user || current_password) && @userinfo ||= begin - if current_user && current_password - "#{current_user}:#{current_password}" - elsif current_user && !current_password - "#{current_user}" - end - end - end - - ## - # The userinfo component for this URI, normalized. - # - # @return [String] The userinfo component, normalized. - def normalized_userinfo - return nil unless self.userinfo - return @normalized_userinfo if defined?(@normalized_userinfo) - @normalized_userinfo ||= begin - current_user = self.normalized_user - current_password = self.normalized_password - if !current_user && !current_password - nil - elsif current_user && current_password - "#{current_user}:#{current_password}".dup - elsif current_user && !current_password - "#{current_user}".dup - end - end - # All normalized values should be UTF-8 - if @normalized_userinfo - @normalized_userinfo.force_encoding(Encoding::UTF_8) - end - @normalized_userinfo - end - - ## - # Sets the userinfo component for this URI. - # - # @param [String, #to_str] new_userinfo The new userinfo component. - def userinfo=(new_userinfo) - if new_userinfo && !new_userinfo.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_userinfo.class} into String." - end - new_user, new_password = if new_userinfo - [ - new_userinfo.to_str.strip[/^(.*):/, 1], - new_userinfo.to_str.strip[/:(.*)$/, 1] - ] - else - [nil, nil] - end - - # Password assigned first to ensure validity in case of nil - self.password = new_password - self.user = new_user - - # Reset dependent values - remove_instance_variable(:@authority) if defined?(@authority) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The host component for this URI. - # - # @return [String] The host component. - def host - return defined?(@host) ? @host : nil - end - - ## - # The host component for this URI, normalized. - # - # @return [String] The host component, normalized. - def normalized_host - return nil unless self.host - @normalized_host ||= begin - if !self.host.strip.empty? - result = ::Addressable::IDNA.to_ascii( - URI.unencode_component(self.host.strip.downcase) - ) - if result =~ /[^\.]\.$/ - # Single trailing dots are unnecessary. - result = result[0...-1] - end - result = Addressable::URI.normalize_component( - result, - CharacterClasses::HOST) - result - else - EMPTY_STR.dup - end - end - # All normalized values should be UTF-8 - @normalized_host.force_encoding(Encoding::UTF_8) if @normalized_host - @normalized_host - end - - ## - # Sets the host component for this URI. - # - # @param [String, #to_str] new_host The new host component. - def host=(new_host) - if new_host && !new_host.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_host.class} into String." - end - @host = new_host ? new_host.to_str : nil - - # Reset dependent values - remove_instance_variable(:@authority) if defined?(@authority) - remove_instance_variable(:@normalized_host) if defined?(@normalized_host) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # This method is same as URI::Generic#host except - # brackets for IPv6 (and 'IPvFuture') addresses are removed. - # - # @see Addressable::URI#host - # - # @return [String] The hostname for this URI. - def hostname - v = self.host - /\A\[(.*)\]\z/ =~ v ? $1 : v - end - - ## - # This method is same as URI::Generic#host= except - # the argument can be a bare IPv6 address (or 'IPvFuture'). - # - # @see Addressable::URI#host= - # - # @param [String, #to_str] new_hostname The new hostname for this URI. - def hostname=(new_hostname) - if new_hostname && - (new_hostname.respond_to?(:ipv4?) || new_hostname.respond_to?(:ipv6?)) - new_hostname = new_hostname.to_s - elsif new_hostname && !new_hostname.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_hostname.class} into String." - end - v = new_hostname ? new_hostname.to_str : nil - v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v - self.host = v - end - - ## - # Returns the top-level domain for this host. - # - # @example - # Addressable::URI.parse("www.example.co.uk").tld # => "co.uk" - def tld - PublicSuffix.parse(self.host, ignore_private: true).tld - end - - ## - # Returns the public suffix domain for this host. - # - # @example - # Addressable::URI.parse("www.example.co.uk").domain # => "example.co.uk" - def domain - PublicSuffix.domain(self.host, ignore_private: true) - end - - ## - # The authority component for this URI. - # Combines the user, password, host, and port components. - # - # @return [String] The authority component. - def authority - self.host && @authority ||= begin - authority = String.new - if self.userinfo != nil - authority << "#{self.userinfo}@" - end - authority << self.host - if self.port != nil - authority << ":#{self.port}" - end - authority - end - end - - ## - # The authority component for this URI, normalized. - # - # @return [String] The authority component, normalized. - def normalized_authority - return nil unless self.authority - @normalized_authority ||= begin - authority = String.new - if self.normalized_userinfo != nil - authority << "#{self.normalized_userinfo}@" - end - authority << self.normalized_host - if self.normalized_port != nil - authority << ":#{self.normalized_port}" - end - authority - end - # All normalized values should be UTF-8 - if @normalized_authority - @normalized_authority.force_encoding(Encoding::UTF_8) - end - @normalized_authority - end - - ## - # Sets the authority component for this URI. - # - # @param [String, #to_str] new_authority The new authority component. - def authority=(new_authority) - if new_authority - if !new_authority.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_authority.class} into String." - end - new_authority = new_authority.to_str - new_userinfo = new_authority[/^([^\[\]]*)@/, 1] - if new_userinfo - new_user = new_userinfo.strip[/^([^:]*):?/, 1] - new_password = new_userinfo.strip[/:(.*)$/, 1] - end - new_host = new_authority.gsub( - /^([^\[\]]*)@/, EMPTY_STR - ).gsub( - /:([^:@\[\]]*?)$/, EMPTY_STR - ) - new_port = - new_authority[/:([^:@\[\]]*?)$/, 1] - end - - # Password assigned first to ensure validity in case of nil - self.password = defined?(new_password) ? new_password : nil - self.user = defined?(new_user) ? new_user : nil - self.host = defined?(new_host) ? new_host : nil - self.port = defined?(new_port) ? new_port : nil - - # Reset dependent values - remove_instance_variable(:@userinfo) if defined?(@userinfo) - remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The origin for this URI, serialized to ASCII, as per - # RFC 6454, section 6.2. - # - # @return [String] The serialized origin. - def origin - if self.scheme && self.authority - if self.normalized_port - "#{self.normalized_scheme}://#{self.normalized_host}" + - ":#{self.normalized_port}" - else - "#{self.normalized_scheme}://#{self.normalized_host}" - end - else - "null" - end - end - - ## - # Sets the origin for this URI, serialized to ASCII, as per - # RFC 6454, section 6.2. This assignment will reset the `userinfo` - # component. - # - # @param [String, #to_str] new_origin The new origin component. - def origin=(new_origin) - if new_origin - if !new_origin.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_origin.class} into String." - end - new_origin = new_origin.to_str - new_scheme = new_origin[/^([^:\/?#]+):\/\//, 1] - unless new_scheme - raise InvalidURIError, 'An origin cannot omit the scheme.' - end - new_host = new_origin[/:\/\/([^\/?#:]+)/, 1] - unless new_host - raise InvalidURIError, 'An origin cannot omit the host.' - end - new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1] - end - - self.scheme = defined?(new_scheme) ? new_scheme : nil - self.host = defined?(new_host) ? new_host : nil - self.port = defined?(new_port) ? new_port : nil - self.userinfo = nil - - # Reset dependent values - remove_instance_variable(:@userinfo) if defined?(@userinfo) - remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) - remove_instance_variable(:@authority) if defined?(@authority) - remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - # Returns an array of known ip-based schemes. These schemes typically - # use a similar URI form: - # //:@:/ - def self.ip_based_schemes - return self.port_mapping.keys - end - - # Returns a hash of common IP-based schemes and their default port - # numbers. Adding new schemes to this hash, as necessary, will allow - # for better URI normalization. - def self.port_mapping - PORT_MAPPING - end - - ## - # The port component for this URI. - # This is the port number actually given in the URI. This does not - # infer port numbers from default values. - # - # @return [Integer] The port component. - def port - return defined?(@port) ? @port : nil - end - - ## - # The port component for this URI, normalized. - # - # @return [Integer] The port component, normalized. - def normalized_port - return nil unless self.port - return @normalized_port if defined?(@normalized_port) - @normalized_port ||= begin - if URI.port_mapping[self.normalized_scheme] == self.port - nil - else - self.port - end - end - end - - ## - # Sets the port component for this URI. - # - # @param [String, Integer, #to_s] new_port The new port component. - def port=(new_port) - if new_port != nil && new_port.respond_to?(:to_str) - new_port = Addressable::URI.unencode_component(new_port.to_str) - end - - if new_port.respond_to?(:valid_encoding?) && !new_port.valid_encoding? - raise InvalidURIError, "Invalid encoding in port" - end - - if new_port != nil && !(new_port.to_s =~ /^\d+$/) - raise InvalidURIError, - "Invalid port number: #{new_port.inspect}" - end - - @port = new_port.to_s.to_i - @port = nil if @port == 0 - - # Reset dependent values - remove_instance_variable(:@authority) if defined?(@authority) - remove_instance_variable(:@normalized_port) if defined?(@normalized_port) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The inferred port component for this URI. - # This method will normalize to the default port for the URI's scheme if - # the port isn't explicitly specified in the URI. - # - # @return [Integer] The inferred port component. - def inferred_port - if self.port.to_i == 0 - self.default_port - else - self.port.to_i - end - end - - ## - # The default port for this URI's scheme. - # This method will always returns the default port for the URI's scheme - # regardless of the presence of an explicit port in the URI. - # - # @return [Integer] The default port. - def default_port - URI.port_mapping[self.scheme.strip.downcase] if self.scheme - end - - ## - # The combination of components that represent a site. - # Combines the scheme, user, password, host, and port components. - # Primarily useful for HTTP and HTTPS. - # - # For example, "http://example.com/path?query" would have a - # site value of "http://example.com". - # - # @return [String] The components that identify a site. - def site - (self.scheme || self.authority) && @site ||= begin - site_string = "".dup - site_string << "#{self.scheme}:" if self.scheme != nil - site_string << "//#{self.authority}" if self.authority != nil - site_string - end - end - - ## - # The normalized combination of components that represent a site. - # Combines the scheme, user, password, host, and port components. - # Primarily useful for HTTP and HTTPS. - # - # For example, "http://example.com/path?query" would have a - # site value of "http://example.com". - # - # @return [String] The normalized components that identify a site. - def normalized_site - return nil unless self.site - @normalized_site ||= begin - site_string = "".dup - if self.normalized_scheme != nil - site_string << "#{self.normalized_scheme}:" - end - if self.normalized_authority != nil - site_string << "//#{self.normalized_authority}" - end - site_string - end - # All normalized values should be UTF-8 - @normalized_site.force_encoding(Encoding::UTF_8) if @normalized_site - @normalized_site - end - - ## - # Sets the site value for this URI. - # - # @param [String, #to_str] new_site The new site value. - def site=(new_site) - if new_site - if !new_site.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_site.class} into String." - end - new_site = new_site.to_str - # These two regular expressions derived from the primary parsing - # expression - self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1] - self.authority = new_site[ - /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1 - ] - else - self.scheme = nil - self.authority = nil - end - end - - ## - # The path component for this URI. - # - # @return [String] The path component. - def path - return defined?(@path) ? @path : EMPTY_STR - end - - NORMPATH = /^(?!\/)[^\/:]*:.*$/ - ## - # The path component for this URI, normalized. - # - # @return [String] The path component, normalized. - def normalized_path - @normalized_path ||= begin - path = self.path.to_s - if self.scheme == nil && path =~ NORMPATH - # Relative paths with colons in the first segment are ambiguous. - path = path.sub(":", "%2F") - end - # String#split(delimeter, -1) uses the more strict splitting behavior - # found by default in Python. - result = path.strip.split(SLASH, -1).map do |segment| - Addressable::URI.normalize_component( - segment, - Addressable::URI::CharacterClasses::PCHAR - ) - end.join(SLASH) - - result = URI.normalize_path(result) - if result.empty? && - ["http", "https", "ftp", "tftp"].include?(self.normalized_scheme) - result = SLASH.dup - end - result - end - # All normalized values should be UTF-8 - @normalized_path.force_encoding(Encoding::UTF_8) if @normalized_path - @normalized_path - end - - ## - # Sets the path component for this URI. - # - # @param [String, #to_str] new_path The new path component. - def path=(new_path) - if new_path && !new_path.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_path.class} into String." - end - @path = (new_path || EMPTY_STR).to_str - if !@path.empty? && @path[0..0] != SLASH && host != nil - @path = "/#{@path}" - end - - # Reset dependent values - remove_instance_variable(:@normalized_path) if defined?(@normalized_path) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # The basename, if any, of the file in the path component. - # - # @return [String] The path's basename. - def basename - # Path cannot be nil - return File.basename(self.path).gsub(/;[^\/]*$/, EMPTY_STR) - end - - ## - # The extname, if any, of the file in the path component. - # Empty string if there is no extension. - # - # @return [String] The path's extname. - def extname - return nil unless self.path - return File.extname(self.basename) - end - - ## - # The query component for this URI. - # - # @return [String] The query component. - def query - return defined?(@query) ? @query : nil - end - - ## - # The query component for this URI, normalized. - # - # @return [String] The query component, normalized. - def normalized_query(*flags) - return nil unless self.query - return @normalized_query if defined?(@normalized_query) - @normalized_query ||= begin - modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup - # Make sure possible key-value pair delimiters are escaped. - modified_query_class.sub!("\\&", "").sub!("\\;", "") - pairs = (self.query || "").split("&", -1) - pairs.sort! if flags.include?(:sorted) - component = pairs.map do |pair| - Addressable::URI.normalize_component(pair, modified_query_class, "+") - end.join("&") - component == "" ? nil : component - end - # All normalized values should be UTF-8 - @normalized_query.force_encoding(Encoding::UTF_8) if @normalized_query - @normalized_query - end - - ## - # Sets the query component for this URI. - # - # @param [String, #to_str] new_query The new query component. - def query=(new_query) - if new_query && !new_query.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_query.class} into String." - end - @query = new_query ? new_query.to_str : nil - - # Reset dependent values - remove_instance_variable(:@normalized_query) if defined?(@normalized_query) - remove_composite_values - end - - ## - # Converts the query component to a Hash value. - # - # @param [Class] return_type The return type desired. Value must be either - # `Hash` or `Array`. - # - # @return [Hash, Array, nil] The query string parsed as a Hash or Array - # or nil if the query string is blank. - # - # @example - # Addressable::URI.parse("?one=1&two=2&three=3").query_values - # #=> {"one" => "1", "two" => "2", "three" => "3"} - # Addressable::URI.parse("?one=two&one=three").query_values(Array) - # #=> [["one", "two"], ["one", "three"]] - # Addressable::URI.parse("?one=two&one=three").query_values(Hash) - # #=> {"one" => "three"} - # Addressable::URI.parse("?").query_values - # #=> {} - # Addressable::URI.parse("").query_values - # #=> nil - def query_values(return_type=Hash) - empty_accumulator = Array == return_type ? [] : {} - if return_type != Hash && return_type != Array - raise ArgumentError, "Invalid return type. Must be Hash or Array." - end - return nil if self.query == nil - split_query = self.query.split("&").map do |pair| - pair.split("=", 2) if pair && !pair.empty? - end.compact - return split_query.inject(empty_accumulator.dup) do |accu, pair| - # I'd rather use key/value identifiers instead of array lookups, - # but in this case I really want to maintain the exact pair structure, - # so it's best to make all changes in-place. - pair[0] = URI.unencode_component(pair[0]) - if pair[1].respond_to?(:to_str) - # I loathe the fact that I have to do this. Stupid HTML 4.01. - # Treating '+' as a space was just an unbelievably bad idea. - # There was nothing wrong with '%20'! - # If it ain't broke, don't fix it! - pair[1] = URI.unencode_component(pair[1].to_str.gsub(/\+/, " ")) - end - if return_type == Hash - accu[pair[0]] = pair[1] - else - accu << pair - end - accu - end - end - - ## - # Sets the query component for this URI from a Hash object. - # An empty Hash or Array will result in an empty query string. - # - # @param [Hash, #to_hash, Array] new_query_values The new query values. - # - # @example - # uri.query_values = {:a => "a", :b => ["c", "d", "e"]} - # uri.query - # # => "a=a&b=c&b=d&b=e" - # uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']] - # uri.query - # # => "a=a&b=c&b=d&b=e" - # uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]] - # uri.query - # # => "a=a&b=c&b=d&b=e" - # uri.query_values = [['flag'], ['key', 'value']] - # uri.query - # # => "flag&key=value" - def query_values=(new_query_values) - if new_query_values == nil - self.query = nil - return nil - end - - if !new_query_values.is_a?(Array) - if !new_query_values.respond_to?(:to_hash) - raise TypeError, - "Can't convert #{new_query_values.class} into Hash." - end - new_query_values = new_query_values.to_hash - new_query_values = new_query_values.map do |key, value| - key = key.to_s if key.kind_of?(Symbol) - [key, value] - end - # Useful default for OAuth and caching. - # Only to be used for non-Array inputs. Arrays should preserve order. - new_query_values.sort! - end - - # new_query_values have form [['key1', 'value1'], ['key2', 'value2']] - buffer = "".dup - new_query_values.each do |key, value| - encoded_key = URI.encode_component( - key, CharacterClasses::UNRESERVED - ) - if value == nil - buffer << "#{encoded_key}&" - elsif value.kind_of?(Array) - value.each do |sub_value| - encoded_value = URI.encode_component( - sub_value, CharacterClasses::UNRESERVED - ) - buffer << "#{encoded_key}=#{encoded_value}&" - end - else - encoded_value = URI.encode_component( - value, CharacterClasses::UNRESERVED - ) - buffer << "#{encoded_key}=#{encoded_value}&" - end - end - self.query = buffer.chop - end - - ## - # The HTTP request URI for this URI. This is the path and the - # query string. - # - # @return [String] The request URI required for an HTTP request. - def request_uri - return nil if self.absolute? && self.scheme !~ /^https?$/i - return ( - (!self.path.empty? ? self.path : SLASH) + - (self.query ? "?#{self.query}" : EMPTY_STR) - ) - end - - ## - # Sets the HTTP request URI for this URI. - # - # @param [String, #to_str] new_request_uri The new HTTP request URI. - def request_uri=(new_request_uri) - if !new_request_uri.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_request_uri.class} into String." - end - if self.absolute? && self.scheme !~ /^https?$/i - raise InvalidURIError, - "Cannot set an HTTP request URI for a non-HTTP URI." - end - new_request_uri = new_request_uri.to_str - path_component = new_request_uri[/^([^\?]*)\?(?:.*)$/, 1] - query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1] - path_component = path_component.to_s - path_component = (!path_component.empty? ? path_component : SLASH) - self.path = path_component - self.query = query_component - - # Reset dependent values - remove_composite_values - end - - ## - # The fragment component for this URI. - # - # @return [String] The fragment component. - def fragment - return defined?(@fragment) ? @fragment : nil - end - - ## - # The fragment component for this URI, normalized. - # - # @return [String] The fragment component, normalized. - def normalized_fragment - return nil unless self.fragment - return @normalized_fragment if defined?(@normalized_fragment) - @normalized_fragment ||= begin - component = Addressable::URI.normalize_component( - self.fragment, - Addressable::URI::CharacterClasses::FRAGMENT - ) - component == "" ? nil : component - end - # All normalized values should be UTF-8 - if @normalized_fragment - @normalized_fragment.force_encoding(Encoding::UTF_8) - end - @normalized_fragment - end - - ## - # Sets the fragment component for this URI. - # - # @param [String, #to_str] new_fragment The new fragment component. - def fragment=(new_fragment) - if new_fragment && !new_fragment.respond_to?(:to_str) - raise TypeError, "Can't convert #{new_fragment.class} into String." - end - @fragment = new_fragment ? new_fragment.to_str : nil - - # Reset dependent values - remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment) - remove_composite_values - - # Ensure we haven't created an invalid URI - validate() - end - - ## - # Determines if the scheme indicates an IP-based protocol. - # - # @return [TrueClass, FalseClass] - # true if the scheme indicates an IP-based protocol. - # false otherwise. - def ip_based? - if self.scheme - return URI.ip_based_schemes.include?( - self.scheme.strip.downcase) - end - return false - end - - ## - # Determines if the URI is relative. - # - # @return [TrueClass, FalseClass] - # true if the URI is relative. false - # otherwise. - def relative? - return self.scheme.nil? - end - - ## - # Determines if the URI is absolute. - # - # @return [TrueClass, FalseClass] - # true if the URI is absolute. false - # otherwise. - def absolute? - return !relative? - end - - ## - # Joins two URIs together. - # - # @param [String, Addressable::URI, #to_str] The URI to join with. - # - # @return [Addressable::URI] The joined URI. - def join(uri) - if !uri.respond_to?(:to_str) - raise TypeError, "Can't convert #{uri.class} into String." - end - if !uri.kind_of?(URI) - # Otherwise, convert to a String, then parse. - uri = URI.parse(uri.to_str) - end - if uri.to_s.empty? - return self.dup - end - - joined_scheme = nil - joined_user = nil - joined_password = nil - joined_host = nil - joined_port = nil - joined_path = nil - joined_query = nil - joined_fragment = nil - - # Section 5.2.2 of RFC 3986 - if uri.scheme != nil - joined_scheme = uri.scheme - joined_user = uri.user - joined_password = uri.password - joined_host = uri.host - joined_port = uri.port - joined_path = URI.normalize_path(uri.path) - joined_query = uri.query - else - if uri.authority != nil - joined_user = uri.user - joined_password = uri.password - joined_host = uri.host - joined_port = uri.port - joined_path = URI.normalize_path(uri.path) - joined_query = uri.query - else - if uri.path == nil || uri.path.empty? - joined_path = self.path - if uri.query != nil - joined_query = uri.query - else - joined_query = self.query - end - else - if uri.path[0..0] == SLASH - joined_path = URI.normalize_path(uri.path) - else - base_path = self.path.dup - base_path = EMPTY_STR if base_path == nil - base_path = URI.normalize_path(base_path) - - # Section 5.2.3 of RFC 3986 - # - # Removes the right-most path segment from the base path. - if base_path =~ /\// - base_path.gsub!(/\/[^\/]+$/, SLASH) - else - base_path = EMPTY_STR - end - - # If the base path is empty and an authority segment has been - # defined, use a base path of SLASH - if base_path.empty? && self.authority != nil - base_path = SLASH - end - - joined_path = URI.normalize_path(base_path + uri.path) - end - joined_query = uri.query - end - joined_user = self.user - joined_password = self.password - joined_host = self.host - joined_port = self.port - end - joined_scheme = self.scheme - end - joined_fragment = uri.fragment - - return self.class.new( - :scheme => joined_scheme, - :user => joined_user, - :password => joined_password, - :host => joined_host, - :port => joined_port, - :path => joined_path, - :query => joined_query, - :fragment => joined_fragment - ) - end - alias_method :+, :join - - ## - # Destructive form of join. - # - # @param [String, Addressable::URI, #to_str] The URI to join with. - # - # @return [Addressable::URI] The joined URI. - # - # @see Addressable::URI#join - def join!(uri) - replace_self(self.join(uri)) - end - - ## - # Merges a URI with a Hash of components. - # This method has different behavior from join. Any - # components present in the hash parameter will override the - # original components. The path component is not treated specially. - # - # @param [Hash, Addressable::URI, #to_hash] The components to merge with. - # - # @return [Addressable::URI] The merged URI. - # - # @see Hash#merge - def merge(hash) - if !hash.respond_to?(:to_hash) - raise TypeError, "Can't convert #{hash.class} into Hash." - end - hash = hash.to_hash - - if hash.has_key?(:authority) - if (hash.keys & [:userinfo, :user, :password, :host, :port]).any? - raise ArgumentError, - "Cannot specify both an authority and any of the components " + - "within the authority." - end - end - if hash.has_key?(:userinfo) - if (hash.keys & [:user, :password]).any? - raise ArgumentError, - "Cannot specify both a userinfo and either the user or password." - end - end - - uri = self.class.new - uri.defer_validation do - # Bunch of crazy logic required because of the composite components - # like userinfo and authority. - uri.scheme = - hash.has_key?(:scheme) ? hash[:scheme] : self.scheme - if hash.has_key?(:authority) - uri.authority = - hash.has_key?(:authority) ? hash[:authority] : self.authority - end - if hash.has_key?(:userinfo) - uri.userinfo = - hash.has_key?(:userinfo) ? hash[:userinfo] : self.userinfo - end - if !hash.has_key?(:userinfo) && !hash.has_key?(:authority) - uri.user = - hash.has_key?(:user) ? hash[:user] : self.user - uri.password = - hash.has_key?(:password) ? hash[:password] : self.password - end - if !hash.has_key?(:authority) - uri.host = - hash.has_key?(:host) ? hash[:host] : self.host - uri.port = - hash.has_key?(:port) ? hash[:port] : self.port - end - uri.path = - hash.has_key?(:path) ? hash[:path] : self.path - uri.query = - hash.has_key?(:query) ? hash[:query] : self.query - uri.fragment = - hash.has_key?(:fragment) ? hash[:fragment] : self.fragment - end - - return uri - end - - ## - # Destructive form of merge. - # - # @param [Hash, Addressable::URI, #to_hash] The components to merge with. - # - # @return [Addressable::URI] The merged URI. - # - # @see Addressable::URI#merge - def merge!(uri) - replace_self(self.merge(uri)) - end - - ## - # Returns the shortest normalized relative form of this URI that uses the - # supplied URI as a base for resolution. Returns an absolute URI if - # necessary. This is effectively the opposite of route_to. - # - # @param [String, Addressable::URI, #to_str] uri The URI to route from. - # - # @return [Addressable::URI] - # The normalized relative URI that is equivalent to the original URI. - def route_from(uri) - uri = URI.parse(uri).normalize - normalized_self = self.normalize - if normalized_self.relative? - raise ArgumentError, "Expected absolute URI, got: #{self.to_s}" - end - if uri.relative? - raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}" - end - if normalized_self == uri - return Addressable::URI.parse("##{normalized_self.fragment}") - end - components = normalized_self.to_hash - if normalized_self.scheme == uri.scheme - components[:scheme] = nil - if normalized_self.authority == uri.authority - components[:user] = nil - components[:password] = nil - components[:host] = nil - components[:port] = nil - if normalized_self.path == uri.path - components[:path] = nil - if normalized_self.query == uri.query - components[:query] = nil - end - else - if uri.path != SLASH and components[:path] - self_splitted_path = split_path(components[:path]) - uri_splitted_path = split_path(uri.path) - self_dir = self_splitted_path.shift - uri_dir = uri_splitted_path.shift - while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir - self_dir = self_splitted_path.shift - uri_dir = uri_splitted_path.shift - end - components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH) - end - end - end - end - # Avoid network-path references. - if components[:host] != nil - components[:scheme] = normalized_self.scheme - end - return Addressable::URI.new( - :scheme => components[:scheme], - :user => components[:user], - :password => components[:password], - :host => components[:host], - :port => components[:port], - :path => components[:path], - :query => components[:query], - :fragment => components[:fragment] - ) - end - - ## - # Returns the shortest normalized relative form of the supplied URI that - # uses this URI as a base for resolution. Returns an absolute URI if - # necessary. This is effectively the opposite of route_from. - # - # @param [String, Addressable::URI, #to_str] uri The URI to route to. - # - # @return [Addressable::URI] - # The normalized relative URI that is equivalent to the supplied URI. - def route_to(uri) - return URI.parse(uri).route_from(self) - end - - ## - # Returns a normalized URI object. - # - # NOTE: This method does not attempt to fully conform to specifications. - # It exists largely to correct other people's failures to read the - # specifications, and also to deal with caching issues since several - # different URIs may represent the same resource and should not be - # cached multiple times. - # - # @return [Addressable::URI] The normalized URI. - def normalize - # This is a special exception for the frequently misused feed - # URI scheme. - if normalized_scheme == "feed" - if self.to_s =~ /^feed:\/*http:\/*/ - return URI.parse( - self.to_s[/^feed:\/*(http:\/*.*)/, 1] - ).normalize - end - end - - return self.class.new( - :scheme => normalized_scheme, - :authority => normalized_authority, - :path => normalized_path, - :query => normalized_query, - :fragment => normalized_fragment - ) - end - - ## - # Destructively normalizes this URI object. - # - # @return [Addressable::URI] The normalized URI. - # - # @see Addressable::URI#normalize - def normalize! - replace_self(self.normalize) - end - - ## - # Creates a URI suitable for display to users. If semantic attacks are - # likely, the application should try to detect these and warn the user. - # See RFC 3986, - # section 7.6 for more information. - # - # @return [Addressable::URI] A URI suitable for display purposes. - def display_uri - display_uri = self.normalize - display_uri.host = ::Addressable::IDNA.to_unicode(display_uri.host) - return display_uri - end - - ## - # Returns true if the URI objects are equal. This method - # normalizes both URIs before doing the comparison, and allows comparison - # against Strings. - # - # @param [Object] uri The URI to compare. - # - # @return [TrueClass, FalseClass] - # true if the URIs are equivalent, false - # otherwise. - def ===(uri) - if uri.respond_to?(:normalize) - uri_string = uri.normalize.to_s - else - begin - uri_string = ::Addressable::URI.parse(uri).normalize.to_s - rescue InvalidURIError, TypeError - return false - end - end - return self.normalize.to_s == uri_string - end - - ## - # Returns true if the URI objects are equal. This method - # normalizes both URIs before doing the comparison. - # - # @param [Object] uri The URI to compare. - # - # @return [TrueClass, FalseClass] - # true if the URIs are equivalent, false - # otherwise. - def ==(uri) - return false unless uri.kind_of?(URI) - return self.normalize.to_s == uri.normalize.to_s - end - - ## - # Returns true if the URI objects are equal. This method - # does NOT normalize either URI before doing the comparison. - # - # @param [Object] uri The URI to compare. - # - # @return [TrueClass, FalseClass] - # true if the URIs are equivalent, false - # otherwise. - def eql?(uri) - return false unless uri.kind_of?(URI) - return self.to_s == uri.to_s - end - - ## - # A hash value that will make a URI equivalent to its normalized - # form. - # - # @return [Integer] A hash of the URI. - def hash - @hash ||= self.to_s.hash * -1 - end - - ## - # Clones the URI object. - # - # @return [Addressable::URI] The cloned URI. - def dup - duplicated_uri = self.class.new( - :scheme => self.scheme ? self.scheme.dup : nil, - :user => self.user ? self.user.dup : nil, - :password => self.password ? self.password.dup : nil, - :host => self.host ? self.host.dup : nil, - :port => self.port, - :path => self.path ? self.path.dup : nil, - :query => self.query ? self.query.dup : nil, - :fragment => self.fragment ? self.fragment.dup : nil - ) - return duplicated_uri - end - - ## - # Omits components from a URI. - # - # @param [Symbol] *components The components to be omitted. - # - # @return [Addressable::URI] The URI with components omitted. - # - # @example - # uri = Addressable::URI.parse("http://example.com/path?query") - # #=> # - # uri.omit(:scheme, :authority) - # #=> # - def omit(*components) - invalid_components = components - [ - :scheme, :user, :password, :userinfo, :host, :port, :authority, - :path, :query, :fragment - ] - unless invalid_components.empty? - raise ArgumentError, - "Invalid component names: #{invalid_components.inspect}." - end - duplicated_uri = self.dup - duplicated_uri.defer_validation do - components.each do |component| - duplicated_uri.send((component.to_s + "=").to_sym, nil) - end - duplicated_uri.user = duplicated_uri.normalized_user - end - duplicated_uri - end - - ## - # Destructive form of omit. - # - # @param [Symbol] *components The components to be omitted. - # - # @return [Addressable::URI] The URI with components omitted. - # - # @see Addressable::URI#omit - def omit!(*components) - replace_self(self.omit(*components)) - end - - ## - # Determines if the URI is an empty string. - # - # @return [TrueClass, FalseClass] - # Returns true if empty, false otherwise. - def empty? - return self.to_s.empty? - end - - ## - # Converts the URI to a String. - # - # @return [String] The URI's String representation. - def to_s - if self.scheme == nil && self.path != nil && !self.path.empty? && - self.path =~ NORMPATH - raise InvalidURIError, - "Cannot assemble URI string with ambiguous path: '#{self.path}'" - end - @uri_string ||= begin - uri_string = String.new - uri_string << "#{self.scheme}:" if self.scheme != nil - uri_string << "//#{self.authority}" if self.authority != nil - uri_string << self.path.to_s - uri_string << "?#{self.query}" if self.query != nil - uri_string << "##{self.fragment}" if self.fragment != nil - uri_string.force_encoding(Encoding::UTF_8) - uri_string - end - end - - ## - # URI's are glorified Strings. Allow implicit conversion. - alias_method :to_str, :to_s - - ## - # Returns a Hash of the URI components. - # - # @return [Hash] The URI as a Hash of components. - def to_hash - return { - :scheme => self.scheme, - :user => self.user, - :password => self.password, - :host => self.host, - :port => self.port, - :path => self.path, - :query => self.query, - :fragment => self.fragment - } - end - - ## - # Returns a String representation of the URI object's state. - # - # @return [String] The URI object's state, as a String. - def inspect - sprintf("#<%s:%#0x URI:%s>", URI.to_s, self.object_id, self.to_s) - end - - ## - # This method allows you to make several changes to a URI simultaneously, - # which separately would cause validation errors, but in conjunction, - # are valid. The URI will be revalidated as soon as the entire block has - # been executed. - # - # @param [Proc] block - # A set of operations to perform on a given URI. - def defer_validation(&block) - raise LocalJumpError, "No block given." unless block - @validation_deferred = true - block.call() - @validation_deferred = false - validate - return nil - end - - protected - SELF_REF = '.' - PARENT = '..' - - RULE_2A = /\/\.\/|\/\.$/ - RULE_2B_2C = /\/([^\/]*)\/\.\.\/|\/([^\/]*)\/\.\.$/ - RULE_2D = /^\.\.?\/?/ - RULE_PREFIXED_PARENT = /^\/\.\.?\/|^(\/\.\.?)+\/?$/ - - ## - # Resolves paths to their simplest form. - # - # @param [String] path The path to normalize. - # - # @return [String] The normalized path. - def self.normalize_path(path) - # Section 5.2.4 of RFC 3986 - - return nil if path.nil? - normalized_path = path.dup - begin - mod = nil - mod ||= normalized_path.gsub!(RULE_2A, SLASH) - - pair = normalized_path.match(RULE_2B_2C) - parent, current = pair[1], pair[2] if pair - if pair && ((parent != SELF_REF && parent != PARENT) || - (current != SELF_REF && current != PARENT)) - mod ||= normalized_path.gsub!( - Regexp.new( - "/#{Regexp.escape(parent.to_s)}/\\.\\./|" + - "(/#{Regexp.escape(current.to_s)}/\\.\\.$)" - ), SLASH - ) - end - - mod ||= normalized_path.gsub!(RULE_2D, EMPTY_STR) - # Non-standard, removes prefixed dotted segments from path. - mod ||= normalized_path.gsub!(RULE_PREFIXED_PARENT, SLASH) - end until mod.nil? - - return normalized_path - end - - ## - # Ensures that the URI is valid. - def validate - return if !!@validation_deferred - if self.scheme != nil && self.ip_based? && - (self.host == nil || self.host.empty?) && - (self.path == nil || self.path.empty?) - raise InvalidURIError, - "Absolute URI missing hierarchical segment: '#{self.to_s}'" - end - if self.host == nil - if self.port != nil || - self.user != nil || - self.password != nil - raise InvalidURIError, "Hostname not supplied: '#{self.to_s}'" - end - end - if self.path != nil && !self.path.empty? && self.path[0..0] != SLASH && - self.authority != nil - raise InvalidURIError, - "Cannot have a relative path with an authority set: '#{self.to_s}'" - end - if self.path != nil && !self.path.empty? && - self.path[0..1] == SLASH + SLASH && self.authority == nil - raise InvalidURIError, - "Cannot have a path with two leading slashes " + - "without an authority set: '#{self.to_s}'" - end - unreserved = CharacterClasses::UNRESERVED - sub_delims = CharacterClasses::SUB_DELIMS - if !self.host.nil? && (self.host =~ /[<>{}\/\\\?\#\@"[[:space:]]]/ || - (self.host[/^\[(.*)\]$/, 1] != nil && self.host[/^\[(.*)\]$/, 1] !~ - Regexp.new("^[#{unreserved}#{sub_delims}:]*$"))) - raise InvalidURIError, "Invalid character in host: '#{self.host.to_s}'" - end - return nil - end - - ## - # Replaces the internal state of self with the specified URI's state. - # Used in destructive operations to avoid massive code repetition. - # - # @param [Addressable::URI] uri The URI to replace self with. - # - # @return [Addressable::URI] self. - def replace_self(uri) - # Reset dependent values - instance_variables.each do |var| - if instance_variable_defined?(var) && var != :@validation_deferred - remove_instance_variable(var) - end - end - - @scheme = uri.scheme - @user = uri.user - @password = uri.password - @host = uri.host - @port = uri.port - @path = uri.path - @query = uri.query - @fragment = uri.fragment - return self - end - - ## - # Splits path string with "/" (slash). - # It is considered that there is empty string after last slash when - # path ends with slash. - # - # @param [String] path The path to split. - # - # @return [Array] An array of parts of path. - def split_path(path) - splitted = path.split(SLASH) - splitted << EMPTY_STR if path.end_with? SLASH - splitted - end - - ## - # Resets composite values for the entire URI - # - # @api private - def remove_composite_values - remove_instance_variable(:@uri_string) if defined?(@uri_string) - remove_instance_variable(:@hash) if defined?(@hash) - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb deleted file mode 100644 index 4d284656a326043cd2aa251fd61e78f5e7ad4bb3..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb +++ /dev/null @@ -1,30 +0,0 @@ -# encoding:utf-8 -#-- -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#++ - - -# Used to prevent the class/module from being loaded more than once -if !defined?(Addressable::VERSION) - module Addressable - module VERSION - MAJOR = 2 - MINOR = 5 - TINY = 2 - - STRING = [MAJOR, MINOR, TINY].join('.') - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb deleted file mode 100644 index 2f47ec3f17f4efe1fb49859d2b29d93ef334fcb4..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb +++ /dev/null @@ -1,298 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -# Have to use RubyGems to load the idn gem. -require "rubygems" - -require "addressable/idna" - -shared_examples_for "converting from unicode to ASCII" do - it "should convert 'www.google.com' correctly" do - expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com") - end - - LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' - it "should convert '#{LONG}' correctly" do - expect(Addressable::IDNA.to_ascii(LONG)).to eq(LONG) - end - - it "should convert 'www.詹姆斯.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "www.詹姆斯.com" - )).to eq("www.xn--8ws00zhy3a.com") - end - - it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do - "www.Iñtërnâtiônàlizætiøn.com" - expect(Addressable::IDNA.to_ascii( - "www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" + - "n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com" - )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") - end - - it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" + - "a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com" - )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") - end - - it "should convert " + - "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + - "correctly" do - expect(Addressable::IDNA.to_ascii( - "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + - "\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" + - "\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" + - "\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" + - "\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" + - "\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" + - "\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + - "w3.mag.keio.ac.jp" - )).to eq( - "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + - "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" - ) - end - - it "should convert " + - "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + - "correctly" do - expect(Addressable::IDNA.to_ascii( - "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + - "\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" + - "\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" + - "\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" + - "\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" + - "\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" + - "\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" + - "\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + - "w3.mag.keio.ac.jp" - )).to eq( - "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + - "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" - ) - end - - it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do - expect(Addressable::IDNA.to_ascii( - "点心和烤鸭.w3.mag.keio.ac.jp" - )).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp") - end - - it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "가각갂갃간갅갆갇갈갉힢힣.com" - )).to eq("xn--o39acdefghijk5883jma.com") - end - - it "should convert " + - "'\347\242\274\346\250\231\346\272\226\350" + - "\220\254\345\234\213\347\242\274.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "\347\242\274\346\250\231\346\272\226\350" + - "\220\254\345\234\213\347\242\274.com" - )).to eq("xn--9cs565brid46mda086o.com") - end - - it "should convert 'リ宠퐱〹.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "\357\276\230\345\256\240\355\220\261\343\200\271.com" - )).to eq("xn--eek174hoxfpr4k.com") - end - - it "should convert 'リ宠퐱卄.com' correctly" do - expect(Addressable::IDNA.to_ascii( - "\343\203\252\345\256\240\355\220\261\345\215\204.com" - )).to eq("xn--eek174hoxfpr4k.com") - end - - it "should convert 'ᆵ' correctly" do - expect(Addressable::IDNA.to_ascii( - "\341\206\265" - )).to eq("xn--4ud") - end - - it "should convert 'ᆵ' correctly" do - expect(Addressable::IDNA.to_ascii( - "\357\276\257" - )).to eq("xn--4ud") - end - - it "should convert '🌹🌹🌹.ws' correctly" do - expect(Addressable::IDNA.to_ascii( - "\360\237\214\271\360\237\214\271\360\237\214\271.ws" - )).to eq("xn--2h8haa.ws") - end - - it "should handle two adjacent '.'s correctly" do - expect(Addressable::IDNA.to_ascii( - "example..host" - )).to eq("example..host") - end -end - -shared_examples_for "converting from ASCII to unicode" do - LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' - it "should convert '#{LONG}' correctly" do - expect(Addressable::IDNA.to_unicode(LONG)).to eq(LONG) - end - - it "should return the identity conversion when punycode decode fails" do - expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq( - "xn--zckp1cyg1.sblo.jp") - end - - it "should return the identity conversion when the ACE prefix has no suffix" do - expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-") - end - - it "should convert 'www.google.com' correctly" do - expect(Addressable::IDNA.to_unicode("www.google.com")).to eq( - "www.google.com") - end - - it "should convert 'www.詹姆斯.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "www.xn--8ws00zhy3a.com" - )).to eq("www.詹姆斯.com") - end - - it "should convert '詹姆斯.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--8ws00zhy3a.com" - )).to eq("詹姆斯.com") - end - - it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "www.xn--itrntinliztin-vdb0a5exd8ewcye.com" - )).to eq("www.iñtërnâtiônàlizætiøn.com") - end - - it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--itrntinliztin-vdb0a5exd8ewcye.com" - )).to eq("iñtërnâtiônàlizætiøn.com") - end - - it "should convert " + - "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + - "correctly" do - expect(Addressable::IDNA.to_unicode( - "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + - "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" - )).to eq( - "www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp" - ) - end - - it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp" - )).to eq("点心和烤鸭.w3.mag.keio.ac.jp") - end - - it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--o39acdefghijk5883jma.com" - )).to eq("가각갂갃간갅갆갇갈갉힢힣.com") - end - - it "should convert " + - "'\347\242\274\346\250\231\346\272\226\350" + - "\220\254\345\234\213\347\242\274.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--9cs565brid46mda086o.com" - )).to eq( - "\347\242\274\346\250\231\346\272\226\350" + - "\220\254\345\234\213\347\242\274.com" - ) - end - - it "should convert 'リ宠퐱卄.com' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--eek174hoxfpr4k.com" - )).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com") - end - - it "should convert 'ᆵ' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--4ud" - )).to eq("\341\206\265") - end - - it "should convert '🌹🌹🌹.ws' correctly" do - expect(Addressable::IDNA.to_unicode( - "xn--2h8haa.ws" - )).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws") - end - - it "should handle two adjacent '.'s correctly" do - expect(Addressable::IDNA.to_unicode( - "example..host" - )).to eq("example..host") - end - - it "should normalize 'string' correctly" do - expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string") - expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string") - end -end - -describe Addressable::IDNA, "when using the pure-Ruby implementation" do - before do - Addressable.send(:remove_const, :IDNA) - load "addressable/idna/pure.rb" - end - - it_should_behave_like "converting from unicode to ASCII" - it_should_behave_like "converting from ASCII to unicode" - - begin - require "fiber" - - it "should not blow up inside fibers" do - f = Fiber.new do - Addressable.send(:remove_const, :IDNA) - load "addressable/idna/pure.rb" - end - f.resume - end - rescue LoadError - # Fibers aren't supported in this version of Ruby, skip this test. - warn('Fibers unsupported.') - end -end - -begin - require "idn" - - describe Addressable::IDNA, "when using the native-code implementation" do - before do - Addressable.send(:remove_const, :IDNA) - load "addressable/idna/native.rb" - end - - it_should_behave_like "converting from unicode to ASCII" - it_should_behave_like "converting from ASCII to unicode" - end -rescue LoadError - # Cannot test the native implementation without libidn support. - warn('Could not load native IDN implementation.') -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb deleted file mode 100644 index eee3f869c1cacec4cb9726ce1c1b4fd9d1125a71..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -require "addressable/uri" -require "net/http" - -describe Net::HTTP do - it "should be compatible with Addressable" do - response_body = - Net::HTTP.get(Addressable::URI.parse('http://www.google.com/')) - expect(response_body).not_to be_nil - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb deleted file mode 100644 index 622a4abbdbd51dcf0bdbda1b5ccea94ce29289fe..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb +++ /dev/null @@ -1,104 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -require "addressable/uri" -require "addressable/template" -require "rack/mount" - -describe Rack::Mount do - let(:app_one) do - proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 1'] } - end - let(:app_two) do - proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 2'] } - end - let(:app_three) do - proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 3'] } - end - let(:routes) do - s = Rack::Mount::RouteSet.new do |set| - set.add_route(app_one, { - :request_method => 'GET', - :path_info => Addressable::Template.new('/one/{id}/') - }, {:id => 'unidentified'}, :one) - set.add_route(app_two, { - :request_method => 'GET', - :path_info => Addressable::Template.new('/two/') - }, {:id => 'unidentified'}, :two) - set.add_route(app_three, { - :request_method => 'GET', - :path_info => Addressable::Template.new('/three/{id}/').to_regexp - }, {:id => 'unidentified'}, :three) - end - s.rehash - s - end - - it "should generate from routes with Addressable::Template" do - path, _ = routes.generate(:path_info, :one, {:id => '123'}) - expect(path).to eq '/one/123/' - end - - it "should generate from routes with Addressable::Template using defaults" do - path, _ = routes.generate(:path_info, :one, {}) - expect(path).to eq '/one/unidentified/' - end - - it "should recognize routes with Addressable::Template" do - request = Rack::Request.new( - 'REQUEST_METHOD' => 'GET', - 'PATH_INFO' => '/one/123/' - ) - route, _, params = routes.recognize(request) - expect(route).not_to be_nil - expect(route.app).to eq app_one - expect(params).to eq({id: '123'}) - end - - it "should generate from routes with Addressable::Template" do - path, _ = routes.generate(:path_info, :two, {:id => '654'}) - expect(path).to eq '/two/' - end - - it "should generate from routes with Addressable::Template using defaults" do - path, _ = routes.generate(:path_info, :two, {}) - expect(path).to eq '/two/' - end - - it "should recognize routes with Addressable::Template" do - request = Rack::Request.new( - 'REQUEST_METHOD' => 'GET', - 'PATH_INFO' => '/two/' - ) - route, _, params = routes.recognize(request) - expect(route).not_to be_nil - expect(route.app).to eq app_two - expect(params).to eq({id: 'unidentified'}) - end - - it "should recognize routes with derived Regexp" do - request = Rack::Request.new( - 'REQUEST_METHOD' => 'GET', - 'PATH_INFO' => '/three/789/' - ) - route, _, params = routes.recognize(request) - expect(route).not_to be_nil - expect(route.app).to eq app_three - expect(params).to eq({id: '789'}) - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb deleted file mode 100644 index 327549416cba9b16893f29fb262f4222b0953ed9..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -require "addressable/uri" - -describe Addressable::URI, "when created with a URI known to cause crashes " + - "in certain browsers" do - it "should parse correctly" do - uri = Addressable::URI.parse('%%30%30') - expect(uri.path).to eq('%%30%30') - expect(uri.normalize.path).to eq('%2500') - end - - it "should parse correctly as a full URI" do - uri = Addressable::URI.parse('http://www.example.com/%%30%30') - expect(uri.path).to eq('/%%30%30') - expect(uri.normalize.path).to eq('/%2500') - end -end - -describe Addressable::URI, "when created with a URI known to cause crashes " + - "in certain browsers" do - it "should parse correctly" do - uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.normalize.path).to eq( - '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + - '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + - '%A3%20%E0%A5%A3%20%E5%86%97' - ) - end - - it "should parse correctly as a full URI" do - uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.normalize.path).to eq( - '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + - '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + - '%A3%20%E0%A5%A3%20%E5%86%97' - ) - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb deleted file mode 100644 index bd8ab12f570cd38c0a953c85134a8c6a2b309477..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb +++ /dev/null @@ -1,1419 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -require "bigdecimal" -require "addressable/template" - -shared_examples_for 'expands' do |tests| - tests.each do |template, expansion| - exp = expansion.is_a?(Array) ? expansion.first : expansion - it "#{template} to #{exp}" do - tmpl = Addressable::Template.new(template).expand(subject) - if expansion.is_a?(Array) - expect(expansion.any?{|i| i == tmpl.to_str}).to be true - else - expect(tmpl.to_str).to eq(expansion) - end - end - end -end - -describe "eql?" do - let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } - it 'is equal when the pattern matches' do - other_template = Addressable::Template.new('https://www.example.com/{foo}') - expect(template).to be_eql(other_template) - expect(other_template).to be_eql(template) - end - it 'is not equal when the pattern differs' do - other_template = Addressable::Template.new('https://www.example.com/{bar}') - expect(template).to_not be_eql(other_template) - expect(other_template).to_not be_eql(template) - end - it 'is not equal to non-templates' do - uri = 'https://www.example.com/foo/bar' - addressable_template = Addressable::Template.new uri - addressable_uri = Addressable::URI.parse uri - expect(addressable_template).to_not be_eql(addressable_uri) - expect(addressable_uri).to_not be_eql(addressable_template) - end -end - -describe "==" do - let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } - it 'is equal when the pattern matches' do - other_template = Addressable::Template.new('https://www.example.com/{foo}') - expect(template).to eq other_template - expect(other_template).to eq template - end - it 'is not equal when the pattern differs' do - other_template = Addressable::Template.new('https://www.example.com/{bar}') - expect(template).not_to eq other_template - expect(other_template).not_to eq template - end - it 'is not equal to non-templates' do - uri = 'https://www.example.com/foo/bar' - addressable_template = Addressable::Template.new uri - addressable_uri = Addressable::URI.parse uri - expect(addressable_template).not_to eq addressable_uri - expect(addressable_uri).not_to eq addressable_template - end -end - -describe "Type conversion" do - subject { - { - :var => true, - :hello => 1234, - :nothing => nil, - :sym => :symbolic, - :decimal => BigDecimal.new('1') - } - } - - it_behaves_like 'expands', { - '{var}' => 'true', - '{hello}' => '1234', - '{nothing}' => '', - '{sym}' => 'symbolic', - '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1' - } -end - -describe "Level 1:" do - subject { - {:var => "value", :hello => "Hello World!"} - } - it_behaves_like 'expands', { - '{var}' => 'value', - '{hello}' => 'Hello%20World%21' - } -end - -describe "Level 2" do - subject { - { - :var => "value", - :hello => "Hello World!", - :path => "/foo/bar" - } - } - context "Operator +:" do - it_behaves_like 'expands', { - '{+var}' => 'value', - '{+hello}' => 'Hello%20World!', - '{+path}/here' => '/foo/bar/here', - 'here?ref={+path}' => 'here?ref=/foo/bar' - } - end - context "Operator #:" do - it_behaves_like 'expands', { - 'X{#var}' => 'X#value', - 'X{#hello}' => 'X#Hello%20World!' - } - end -end - -describe "Level 3" do - subject { - { - :var => "value", - :hello => "Hello World!", - :empty => "", - :path => "/foo/bar", - :x => "1024", - :y => "768" - } - } - context "Operator nil (multiple vars):" do - it_behaves_like 'expands', { - 'map?{x,y}' => 'map?1024,768', - '{x,hello,y}' => '1024,Hello%20World%21,768' - } - end - context "Operator + (multiple vars):" do - it_behaves_like 'expands', { - '{+x,hello,y}' => '1024,Hello%20World!,768', - '{+path,x}/here' => '/foo/bar,1024/here' - } - end - context "Operator # (multiple vars):" do - it_behaves_like 'expands', { - '{#x,hello,y}' => '#1024,Hello%20World!,768', - '{#path,x}/here' => '#/foo/bar,1024/here' - } - end - context "Operator ." do - it_behaves_like 'expands', { - 'X{.var}' => 'X.value', - 'X{.x,y}' => 'X.1024.768' - } - end - context "Operator /" do - it_behaves_like 'expands', { - '{/var}' => '/value', - '{/var,x}/here' => '/value/1024/here' - } - end - context "Operator ;" do - it_behaves_like 'expands', { - '{;x,y}' => ';x=1024;y=768', - '{;x,y,empty}' => ';x=1024;y=768;empty' - } - end - context "Operator ?" do - it_behaves_like 'expands', { - '{?x,y}' => '?x=1024&y=768', - '{?x,y,empty}' => '?x=1024&y=768&empty=' - } - end - context "Operator &" do - it_behaves_like 'expands', { - '?fixed=yes{&x}' => '?fixed=yes&x=1024', - '{&x,y,empty}' => '&x=1024&y=768&empty=' - } - end -end - -describe "Level 4" do - subject { - { - :var => "value", - :hello => "Hello World!", - :path => "/foo/bar", - :semi => ";", - :list => %w(red green blue), - :keys => {"semi" => ';', "dot" => '.', "comma" => ','} - } - } - context "Expansion with value modifiers" do - it_behaves_like 'expands', { - '{var:3}' => 'val', - '{var:30}' => 'value', - '{list}' => 'red,green,blue', - '{list*}' => 'red,green,blue', - '{keys}' => [ - 'semi,%3B,dot,.,comma,%2C', - 'dot,.,semi,%3B,comma,%2C', - 'comma,%2C,semi,%3B,dot,.', - 'semi,%3B,comma,%2C,dot,.', - 'dot,.,comma,%2C,semi,%3B', - 'comma,%2C,dot,.,semi,%3B' - ], - '{keys*}' => [ - 'semi=%3B,dot=.,comma=%2C', - 'dot=.,semi=%3B,comma=%2C', - 'comma=%2C,semi=%3B,dot=.', - 'semi=%3B,comma=%2C,dot=.', - 'dot=.,comma=%2C,semi=%3B', - 'comma=%2C,dot=.,semi=%3B' - ] - } - end - context "Operator + with value modifiers" do - it_behaves_like 'expands', { - '{+path:6}/here' => '/foo/b/here', - '{+list}' => 'red,green,blue', - '{+list*}' => 'red,green,blue', - '{+keys}' => [ - 'semi,;,dot,.,comma,,', - 'dot,.,semi,;,comma,,', - 'comma,,,semi,;,dot,.', - 'semi,;,comma,,,dot,.', - 'dot,.,comma,,,semi,;', - 'comma,,,dot,.,semi,;' - ], - '{+keys*}' => [ - 'semi=;,dot=.,comma=,', - 'dot=.,semi=;,comma=,', - 'comma=,,semi=;,dot=.', - 'semi=;,comma=,,dot=.', - 'dot=.,comma=,,semi=;', - 'comma=,,dot=.,semi=;' - ] - } - end - context "Operator # with value modifiers" do - it_behaves_like 'expands', { - '{#path:6}/here' => '#/foo/b/here', - '{#list}' => '#red,green,blue', - '{#list*}' => '#red,green,blue', - '{#keys}' => [ - '#semi,;,dot,.,comma,,', - '#dot,.,semi,;,comma,,', - '#comma,,,semi,;,dot,.', - '#semi,;,comma,,,dot,.', - '#dot,.,comma,,,semi,;', - '#comma,,,dot,.,semi,;' - ], - '{#keys*}' => [ - '#semi=;,dot=.,comma=,', - '#dot=.,semi=;,comma=,', - '#comma=,,semi=;,dot=.', - '#semi=;,comma=,,dot=.', - '#dot=.,comma=,,semi=;', - '#comma=,,dot=.,semi=;' - ] - } - end - context "Operator . with value modifiers" do - it_behaves_like 'expands', { - 'X{.var:3}' => 'X.val', - 'X{.list}' => 'X.red,green,blue', - 'X{.list*}' => 'X.red.green.blue', - 'X{.keys}' => [ - 'X.semi,%3B,dot,.,comma,%2C', - 'X.dot,.,semi,%3B,comma,%2C', - 'X.comma,%2C,semi,%3B,dot,.', - 'X.semi,%3B,comma,%2C,dot,.', - 'X.dot,.,comma,%2C,semi,%3B', - 'X.comma,%2C,dot,.,semi,%3B' - ], - 'X{.keys*}' => [ - 'X.semi=%3B.dot=..comma=%2C', - 'X.dot=..semi=%3B.comma=%2C', - 'X.comma=%2C.semi=%3B.dot=.', - 'X.semi=%3B.comma=%2C.dot=.', - 'X.dot=..comma=%2C.semi=%3B', - 'X.comma=%2C.dot=..semi=%3B' - ] - } - end - context "Operator / with value modifiers" do - it_behaves_like 'expands', { - '{/var:1,var}' => '/v/value', - '{/list}' => '/red,green,blue', - '{/list*}' => '/red/green/blue', - '{/list*,path:4}' => '/red/green/blue/%2Ffoo', - '{/keys}' => [ - '/semi,%3B,dot,.,comma,%2C', - '/dot,.,semi,%3B,comma,%2C', - '/comma,%2C,semi,%3B,dot,.', - '/semi,%3B,comma,%2C,dot,.', - '/dot,.,comma,%2C,semi,%3B', - '/comma,%2C,dot,.,semi,%3B' - ], - '{/keys*}' => [ - '/semi=%3B/dot=./comma=%2C', - '/dot=./semi=%3B/comma=%2C', - '/comma=%2C/semi=%3B/dot=.', - '/semi=%3B/comma=%2C/dot=.', - '/dot=./comma=%2C/semi=%3B', - '/comma=%2C/dot=./semi=%3B' - ] - } - end - context "Operator ; with value modifiers" do - it_behaves_like 'expands', { - '{;hello:5}' => ';hello=Hello', - '{;list}' => ';list=red,green,blue', - '{;list*}' => ';list=red;list=green;list=blue', - '{;keys}' => [ - ';keys=semi,%3B,dot,.,comma,%2C', - ';keys=dot,.,semi,%3B,comma,%2C', - ';keys=comma,%2C,semi,%3B,dot,.', - ';keys=semi,%3B,comma,%2C,dot,.', - ';keys=dot,.,comma,%2C,semi,%3B', - ';keys=comma,%2C,dot,.,semi,%3B' - ], - '{;keys*}' => [ - ';semi=%3B;dot=.;comma=%2C', - ';dot=.;semi=%3B;comma=%2C', - ';comma=%2C;semi=%3B;dot=.', - ';semi=%3B;comma=%2C;dot=.', - ';dot=.;comma=%2C;semi=%3B', - ';comma=%2C;dot=.;semi=%3B' - ] - } - end - context "Operator ? with value modifiers" do - it_behaves_like 'expands', { - '{?var:3}' => '?var=val', - '{?list}' => '?list=red,green,blue', - '{?list*}' => '?list=red&list=green&list=blue', - '{?keys}' => [ - '?keys=semi,%3B,dot,.,comma,%2C', - '?keys=dot,.,semi,%3B,comma,%2C', - '?keys=comma,%2C,semi,%3B,dot,.', - '?keys=semi,%3B,comma,%2C,dot,.', - '?keys=dot,.,comma,%2C,semi,%3B', - '?keys=comma,%2C,dot,.,semi,%3B' - ], - '{?keys*}' => [ - '?semi=%3B&dot=.&comma=%2C', - '?dot=.&semi=%3B&comma=%2C', - '?comma=%2C&semi=%3B&dot=.', - '?semi=%3B&comma=%2C&dot=.', - '?dot=.&comma=%2C&semi=%3B', - '?comma=%2C&dot=.&semi=%3B' - ] - } - end - context "Operator & with value modifiers" do - it_behaves_like 'expands', { - '{&var:3}' => '&var=val', - '{&list}' => '&list=red,green,blue', - '{&list*}' => '&list=red&list=green&list=blue', - '{&keys}' => [ - '&keys=semi,%3B,dot,.,comma,%2C', - '&keys=dot,.,semi,%3B,comma,%2C', - '&keys=comma,%2C,semi,%3B,dot,.', - '&keys=semi,%3B,comma,%2C,dot,.', - '&keys=dot,.,comma,%2C,semi,%3B', - '&keys=comma,%2C,dot,.,semi,%3B' - ], - '{&keys*}' => [ - '&semi=%3B&dot=.&comma=%2C', - '&dot=.&semi=%3B&comma=%2C', - '&comma=%2C&semi=%3B&dot=.', - '&semi=%3B&comma=%2C&dot=.', - '&dot=.&comma=%2C&semi=%3B', - '&comma=%2C&dot=.&semi=%3B' - ] - } - end -end -describe "Modifiers" do - subject { - { - :var => "value", - :semi => ";", - :year => %w(1965 2000 2012), - :dom => %w(example com) - } - } - context "length" do - it_behaves_like 'expands', { - '{var:3}' => 'val', - '{var:30}' => 'value', - '{var}' => 'value', - '{semi}' => '%3B', - '{semi:2}' => '%3B' - } - end - context "explode" do - it_behaves_like 'expands', { - 'find{?year*}' => 'find?year=1965&year=2000&year=2012', - 'www{.dom*}' => 'www.example.com', - } - end -end -describe "Expansion" do - subject { - { - :count => ["one", "two", "three"], - :dom => ["example", "com"], - :dub => "me/too", - :hello => "Hello World!", - :half => "50%", - :var => "value", - :who => "fred", - :base => "http://example.com/home/", - :path => "/foo/bar", - :list => ["red", "green", "blue"], - :keys => {"semi" => ";","dot" => ".","comma" => ","}, - :v => "6", - :x => "1024", - :y => "768", - :empty => "", - :empty_keys => {}, - :undef => nil - } - } - context "concatenation" do - it_behaves_like 'expands', { - '{count}' => 'one,two,three', - '{count*}' => 'one,two,three', - '{/count}' => '/one,two,three', - '{/count*}' => '/one/two/three', - '{;count}' => ';count=one,two,three', - '{;count*}' => ';count=one;count=two;count=three', - '{?count}' => '?count=one,two,three', - '{?count*}' => '?count=one&count=two&count=three', - '{&count*}' => '&count=one&count=two&count=three' - } - end - context "simple expansion" do - it_behaves_like 'expands', { - '{var}' => 'value', - '{hello}' => 'Hello%20World%21', - '{half}' => '50%25', - 'O{empty}X' => 'OX', - 'O{undef}X' => 'OX', - '{x,y}' => '1024,768', - '{x,hello,y}' => '1024,Hello%20World%21,768', - '?{x,empty}' => '?1024,', - '?{x,undef}' => '?1024', - '?{undef,y}' => '?768', - '{var:3}' => 'val', - '{var:30}' => 'value', - '{list}' => 'red,green,blue', - '{list*}' => 'red,green,blue', - '{keys}' => [ - 'semi,%3B,dot,.,comma,%2C', - 'dot,.,semi,%3B,comma,%2C', - 'comma,%2C,semi,%3B,dot,.', - 'semi,%3B,comma,%2C,dot,.', - 'dot,.,comma,%2C,semi,%3B', - 'comma,%2C,dot,.,semi,%3B' - ], - '{keys*}' => [ - 'semi=%3B,dot=.,comma=%2C', - 'dot=.,semi=%3B,comma=%2C', - 'comma=%2C,semi=%3B,dot=.', - 'semi=%3B,comma=%2C,dot=.', - 'dot=.,comma=%2C,semi=%3B', - 'comma=%2C,dot=.,semi=%3B' - ] - } - end - context "reserved expansion (+)" do - it_behaves_like 'expands', { - '{+var}' => 'value', - '{+hello}' => 'Hello%20World!', - '{+half}' => '50%25', - '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex', - '{+base}index' => 'http://example.com/home/index', - 'O{+empty}X' => 'OX', - 'O{+undef}X' => 'OX', - '{+path}/here' => '/foo/bar/here', - 'here?ref={+path}' => 'here?ref=/foo/bar', - 'up{+path}{var}/here' => 'up/foo/barvalue/here', - '{+x,hello,y}' => '1024,Hello%20World!,768', - '{+path,x}/here' => '/foo/bar,1024/here', - '{+path:6}/here' => '/foo/b/here', - '{+list}' => 'red,green,blue', - '{+list*}' => 'red,green,blue', - '{+keys}' => [ - 'semi,;,dot,.,comma,,', - 'dot,.,semi,;,comma,,', - 'comma,,,semi,;,dot,.', - 'semi,;,comma,,,dot,.', - 'dot,.,comma,,,semi,;', - 'comma,,,dot,.,semi,;' - ], - '{+keys*}' => [ - 'semi=;,dot=.,comma=,', - 'dot=.,semi=;,comma=,', - 'comma=,,semi=;,dot=.', - 'semi=;,comma=,,dot=.', - 'dot=.,comma=,,semi=;', - 'comma=,,dot=.,semi=;' - ] - } - end - context "fragment expansion (#)" do - it_behaves_like 'expands', { - '{#var}' => '#value', - '{#hello}' => '#Hello%20World!', - '{#half}' => '#50%25', - 'foo{#empty}' => 'foo#', - 'foo{#undef}' => 'foo', - '{#x,hello,y}' => '#1024,Hello%20World!,768', - '{#path,x}/here' => '#/foo/bar,1024/here', - '{#path:6}/here' => '#/foo/b/here', - '{#list}' => '#red,green,blue', - '{#list*}' => '#red,green,blue', - '{#keys}' => [ - '#semi,;,dot,.,comma,,', - '#dot,.,semi,;,comma,,', - '#comma,,,semi,;,dot,.', - '#semi,;,comma,,,dot,.', - '#dot,.,comma,,,semi,;', - '#comma,,,dot,.,semi,;' - ], - '{#keys*}' => [ - '#semi=;,dot=.,comma=,', - '#dot=.,semi=;,comma=,', - '#comma=,,semi=;,dot=.', - '#semi=;,comma=,,dot=.', - '#dot=.,comma=,,semi=;', - '#comma=,,dot=.,semi=;' - ] - } - end - context "label expansion (.)" do - it_behaves_like 'expands', { - '{.who}' => '.fred', - '{.who,who}' => '.fred.fred', - '{.half,who}' => '.50%25.fred', - 'www{.dom*}' => 'www.example.com', - 'X{.var}' => 'X.value', - 'X{.empty}' => 'X.', - 'X{.undef}' => 'X', - 'X{.var:3}' => 'X.val', - 'X{.list}' => 'X.red,green,blue', - 'X{.list*}' => 'X.red.green.blue', - 'X{.keys}' => [ - 'X.semi,%3B,dot,.,comma,%2C', - 'X.dot,.,semi,%3B,comma,%2C', - 'X.comma,%2C,semi,%3B,dot,.', - 'X.semi,%3B,comma,%2C,dot,.', - 'X.dot,.,comma,%2C,semi,%3B', - 'X.comma,%2C,dot,.,semi,%3B' - ], - 'X{.keys*}' => [ - 'X.semi=%3B.dot=..comma=%2C', - 'X.dot=..semi=%3B.comma=%2C', - 'X.comma=%2C.semi=%3B.dot=.', - 'X.semi=%3B.comma=%2C.dot=.', - 'X.dot=..comma=%2C.semi=%3B', - 'X.comma=%2C.dot=..semi=%3B' - ], - 'X{.empty_keys}' => 'X', - 'X{.empty_keys*}' => 'X' - } - end - context "path expansion (/)" do - it_behaves_like 'expands', { - '{/who}' => '/fred', - '{/who,who}' => '/fred/fred', - '{/half,who}' => '/50%25/fred', - '{/who,dub}' => '/fred/me%2Ftoo', - '{/var}' => '/value', - '{/var,empty}' => '/value/', - '{/var,undef}' => '/value', - '{/var,x}/here' => '/value/1024/here', - '{/var:1,var}' => '/v/value', - '{/list}' => '/red,green,blue', - '{/list*}' => '/red/green/blue', - '{/list*,path:4}' => '/red/green/blue/%2Ffoo', - '{/keys}' => [ - '/semi,%3B,dot,.,comma,%2C', - '/dot,.,semi,%3B,comma,%2C', - '/comma,%2C,semi,%3B,dot,.', - '/semi,%3B,comma,%2C,dot,.', - '/dot,.,comma,%2C,semi,%3B', - '/comma,%2C,dot,.,semi,%3B' - ], - '{/keys*}' => [ - '/semi=%3B/dot=./comma=%2C', - '/dot=./semi=%3B/comma=%2C', - '/comma=%2C/semi=%3B/dot=.', - '/semi=%3B/comma=%2C/dot=.', - '/dot=./comma=%2C/semi=%3B', - '/comma=%2C/dot=./semi=%3B' - ] - } - end - context "path-style expansion (;)" do - it_behaves_like 'expands', { - '{;who}' => ';who=fred', - '{;half}' => ';half=50%25', - '{;empty}' => ';empty', - '{;v,empty,who}' => ';v=6;empty;who=fred', - '{;v,bar,who}' => ';v=6;who=fred', - '{;x,y}' => ';x=1024;y=768', - '{;x,y,empty}' => ';x=1024;y=768;empty', - '{;x,y,undef}' => ';x=1024;y=768', - '{;hello:5}' => ';hello=Hello', - '{;list}' => ';list=red,green,blue', - '{;list*}' => ';list=red;list=green;list=blue', - '{;keys}' => [ - ';keys=semi,%3B,dot,.,comma,%2C', - ';keys=dot,.,semi,%3B,comma,%2C', - ';keys=comma,%2C,semi,%3B,dot,.', - ';keys=semi,%3B,comma,%2C,dot,.', - ';keys=dot,.,comma,%2C,semi,%3B', - ';keys=comma,%2C,dot,.,semi,%3B' - ], - '{;keys*}' => [ - ';semi=%3B;dot=.;comma=%2C', - ';dot=.;semi=%3B;comma=%2C', - ';comma=%2C;semi=%3B;dot=.', - ';semi=%3B;comma=%2C;dot=.', - ';dot=.;comma=%2C;semi=%3B', - ';comma=%2C;dot=.;semi=%3B' - ] - } - end - context "form query expansion (?)" do - it_behaves_like 'expands', { - '{?who}' => '?who=fred', - '{?half}' => '?half=50%25', - '{?x,y}' => '?x=1024&y=768', - '{?x,y,empty}' => '?x=1024&y=768&empty=', - '{?x,y,undef}' => '?x=1024&y=768', - '{?var:3}' => '?var=val', - '{?list}' => '?list=red,green,blue', - '{?list*}' => '?list=red&list=green&list=blue', - '{?keys}' => [ - '?keys=semi,%3B,dot,.,comma,%2C', - '?keys=dot,.,semi,%3B,comma,%2C', - '?keys=comma,%2C,semi,%3B,dot,.', - '?keys=semi,%3B,comma,%2C,dot,.', - '?keys=dot,.,comma,%2C,semi,%3B', - '?keys=comma,%2C,dot,.,semi,%3B' - ], - '{?keys*}' => [ - '?semi=%3B&dot=.&comma=%2C', - '?dot=.&semi=%3B&comma=%2C', - '?comma=%2C&semi=%3B&dot=.', - '?semi=%3B&comma=%2C&dot=.', - '?dot=.&comma=%2C&semi=%3B', - '?comma=%2C&dot=.&semi=%3B' - ] - } - end - context "form query expansion (&)" do - it_behaves_like 'expands', { - '{&who}' => '&who=fred', - '{&half}' => '&half=50%25', - '?fixed=yes{&x}' => '?fixed=yes&x=1024', - '{&x,y,empty}' => '&x=1024&y=768&empty=', - '{&x,y,undef}' => '&x=1024&y=768', - '{&var:3}' => '&var=val', - '{&list}' => '&list=red,green,blue', - '{&list*}' => '&list=red&list=green&list=blue', - '{&keys}' => [ - '&keys=semi,%3B,dot,.,comma,%2C', - '&keys=dot,.,semi,%3B,comma,%2C', - '&keys=comma,%2C,semi,%3B,dot,.', - '&keys=semi,%3B,comma,%2C,dot,.', - '&keys=dot,.,comma,%2C,semi,%3B', - '&keys=comma,%2C,dot,.,semi,%3B' - ], - '{&keys*}' => [ - '&semi=%3B&dot=.&comma=%2C', - '&dot=.&semi=%3B&comma=%2C', - '&comma=%2C&semi=%3B&dot=.', - '&semi=%3B&comma=%2C&dot=.', - '&dot=.&comma=%2C&semi=%3B', - '&comma=%2C&dot=.&semi=%3B' - ] - } - end - context "non-string key in match data" do - subject {Addressable::Template.new("http://example.com/{one}")} - - it "raises TypeError" do - expect { subject.expand(Object.new => "1") }.to raise_error TypeError - end - end -end - -class ExampleTwoProcessor - def self.restore(name, value) - return value.gsub(/-/, " ") if name == "query" - return value - end - - def self.match(name) - return ".*?" if name == "first" - return ".*" - end - def self.validate(name, value) - return !!(value =~ /^[\w ]+$/) if name == "query" - return true - end - - def self.transform(name, value) - return value.gsub(/ /, "+") if name == "query" - return value - end -end - -class DumbProcessor - def self.match(name) - return ".*?" if name == "first" - end -end - -describe Addressable::Template do - describe 'initialize' do - context 'with a non-string' do - it 'raises a TypeError' do - expect { Addressable::Template.new(nil) }.to raise_error(TypeError) - end - end - end - - describe 'freeze' do - subject { Addressable::Template.new("http://example.com/{first}/{+second}/") } - it 'freezes the template' do - expect(subject.freeze).to be_frozen - end - end - - describe "Matching" do - let(:uri){ - Addressable::URI.parse( - "http://example.com/search/an-example-search-query/" - ) - } - let(:uri2){ - Addressable::URI.parse("http://example.com/a/b/c/") - } - let(:uri3){ - Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo") - } - let(:uri4){ - Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo") - } - let(:uri5){ - "http://example.com/foo" - } - context "first uri with ExampleTwoProcessor" do - subject { - Addressable::Template.new( - "http://example.com/search/{query}/" - ).match(uri, ExampleTwoProcessor) - } - its(:variables){ should == ["query"] } - its(:captures){ should == ["an example search query"] } - end - - context "second uri with ExampleTwoProcessor" do - subject { - Addressable::Template.new( - "http://example.com/{first}/{+second}/" - ).match(uri2, ExampleTwoProcessor) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", "b/c"] } - end - - context "second uri with DumbProcessor" do - subject { - Addressable::Template.new( - "http://example.com/{first}/{+second}/" - ).match(uri2, DumbProcessor) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", "b/c"] } - end - - context "second uri" do - subject { - Addressable::Template.new( - "http://example.com/{first}{/second*}/" - ).match(uri2) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", ["b","c"]] } - end - context "third uri" do - subject { - Addressable::Template.new( - "http://example.com/{;hash*,first}" - ).match(uri3) - } - its(:variables){ should == ["hash", "first"] } - its(:captures){ should == [ - {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] } - end - # Note that this expansion is impossible to revert deterministically - the - # * operator means first could have been a key of hash or a separate key. - # Semantically, a separate key is more likely, but both are possible. - context "fourth uri" do - subject { - Addressable::Template.new( - "http://example.com/{?hash*,first}" - ).match(uri4) - } - its(:variables){ should == ["hash", "first"] } - its(:captures){ should == [ - {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] } - end - context "fifth uri" do - subject { - Addressable::Template.new( - "http://example.com/{path}{?hash*,first}" - ).match(uri5) - } - its(:variables){ should == ["path", "hash", "first"] } - its(:captures){ should == ["foo", nil, nil] } - end - end - - describe 'match' do - subject { Addressable::Template.new('http://example.com/first/second/') } - context 'when the URI is the same as the template' do - it 'returns the match data itself with an empty mapping' do - uri = Addressable::URI.parse('http://example.com/first/second/') - match_data = subject.match(uri) - expect(match_data).to be_an Addressable::Template::MatchData - expect(match_data.uri).to eq(uri) - expect(match_data.template).to eq(subject) - expect(match_data.mapping).to be_empty - expect(match_data.inspect).to be_an String - end - end - end - - describe "extract" do - let(:template) { - Addressable::Template.new( - "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" - ) - } - let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" } - let(:uri2){ "http://example.com/a/b/c/#foo" } - it "should be able to extract with queries" do - expect(template.extract(uri)).to eq({ - "host" => "example.com", - "segments" => %w(a b c), - "one" => "1", - "bogus" => nil, - "two" => "2", - "fragment" => "foo" - }) - end - it "should be able to extract without queries" do - expect(template.extract(uri2)).to eq({ - "host" => "example.com", - "segments" => %w(a b c), - "one" => nil, - "bogus" => nil, - "two" => nil, - "fragment" => "foo" - }) - end - - context "issue #137" do - subject { Addressable::Template.new('/path{?page,per_page}') } - - it "can match empty" do - data = subject.extract("/path") - expect(data["page"]).to eq(nil) - expect(data["per_page"]).to eq(nil) - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match first var" do - data = subject.extract("/path?page=1") - expect(data["page"]).to eq("1") - expect(data["per_page"]).to eq(nil) - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match second var" do - data = subject.extract("/path?per_page=1") - expect(data["page"]).to eq(nil) - expect(data["per_page"]).to eq("1") - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match both vars" do - data = subject.extract("/path?page=2&per_page=1") - expect(data["page"]).to eq("2") - expect(data["per_page"]).to eq("1") - expect(data.keys.sort).to eq(['page', 'per_page']) - end - end - end - - describe "Partial expand with symbols" do - context "partial_expand with two simple values" do - subject { - Addressable::Template.new("http://example.com/{one}/{two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/1/{two}/" - ) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand form style query with missing param at beginning" do - subject { - Addressable::Template.new("http://example.com/{?one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:two => "2").pattern).to eq( - "http://example.com/?two=2{&one}/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - context "partial expand with unicode values" do - subject do - Addressable::Template.new("http://example.com/{resource}/{query}/") - end - it "normalizes unicode by default" do - template = subject.partial_expand("query" => "Cafe\u0301") - expect(template.pattern).to eq( - "http://example.com/{resource}/Caf%C3%A9/" - ) - end - - it "does not normalize unicode when byte semantics requested" do - template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false) - expect(template.pattern).to eq( - "http://example.com/{resource}/Cafe%CC%81/" - ) - end - end - end - describe "Partial expand with strings" do - context "partial_expand with two simple values" do - subject { - Addressable::Template.new("http://example.com/{one}/{two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1/{two}/" - ) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - end - describe "Expand" do - context "expand with unicode values" do - subject do - Addressable::Template.new("http://example.com/search/{query}/") - end - it "normalizes unicode by default" do - uri = subject.expand("query" => "Cafe\u0301").to_str - expect(uri).to eq("http://example.com/search/Caf%C3%A9/") - end - - it "does not normalize unicode when byte semantics requested" do - uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str - expect(uri).to eq("http://example.com/search/Cafe%CC%81/") - end - end - context "expand with a processor" do - subject { - Addressable::Template.new("http://example.com/search/{query}/") - } - it "processes spaces" do - expect(subject.expand({"query" => "an example search query"}, - ExampleTwoProcessor).to_str).to eq( - "http://example.com/search/an+example+search+query/" - ) - end - it "validates" do - expect{ - subject.expand({"query" => "Bogus!"}, - ExampleTwoProcessor).to_str - }.to raise_error(Addressable::Template::InvalidTemplateValueError) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - end - context "Matching with operators" do - describe "Level 1:" do - subject { Addressable::Template.new("foo{foo}/{bar}baz") } - it "can match" do - data = subject.match("foofoo/bananabaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("banana") - end - it "can fail" do - expect(subject.match("bar/foo")).to be_nil - expect(subject.match("foobaz")).to be_nil - end - it "can match empty" do - data = subject.match("foo/baz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq(nil) - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - - describe "Level 2:" do - subject { Addressable::Template.new("foo{+foo}{#bar}baz") } - it "can match" do - data = subject.match("foo/test/banana#bazbaz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq("baz") - end - it "can match empty level 2 #" do - data = subject.match("foo/test/bananabaz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq(nil) - data = subject.match("foo/test/banana#baz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq("") - end - it "can match empty level 2 +" do - data = subject.match("foobaz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq(nil) - data = subject.match("foo#barbaz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - - describe "Level 3:" do - context "no operator" do - subject { Addressable::Template.new("foo{foo,bar}baz") } - it "can match" do - data = subject.match("foofoo,barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "+ operator" do - subject { Addressable::Template.new("foo{+foo,bar}baz") } - it "can match" do - data = subject.match("foofoo/bar,barbaz") - expect(data.mapping["bar"]).to eq("foo/bar,bar") - expect(data.mapping["foo"]).to eq("") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context ". operator" do - subject { Addressable::Template.new("foo{.foo,bar}baz") } - it "can match" do - data = subject.match("foo.foo.barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "/ operator" do - subject { Addressable::Template.new("foo{/foo,bar}baz") } - it "can match" do - data = subject.match("foo/foo/barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "; operator" do - subject { Addressable::Template.new("foo{;foo,bar,baz}baz") } - it "can match" do - data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - expect(data.mapping["baz"]).to eq("") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar baz)) - end - end - context "? operator" do - context "test" do - subject { Addressable::Template.new("foo{?foo,bar}baz") } - it "can match" do - data = subject.match("foo?foo=bar%20baz&bar=foobaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar)) - end - end - - context "issue #137" do - subject { Addressable::Template.new('/path{?page,per_page}') } - - it "can match empty" do - data = subject.match("/path") - expect(data.mapping["page"]).to eq(nil) - expect(data.mapping["per_page"]).to eq(nil) - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match first var" do - data = subject.match("/path?page=1") - expect(data.mapping["page"]).to eq("1") - expect(data.mapping["per_page"]).to eq(nil) - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match second var" do - data = subject.match("/path?per_page=1") - expect(data.mapping["page"]).to eq(nil) - expect(data.mapping["per_page"]).to eq("1") - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match both vars" do - data = subject.match("/path?page=2&per_page=1") - expect(data.mapping["page"]).to eq("2") - expect(data.mapping["per_page"]).to eq("1") - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - end - - context "issue #71" do - subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") } - it "can match" do - data = subject.match("http://cyberscore.dev/api/users?username=foobaz") - expect(data.mapping["username"]).to eq("foobaz") - end - it "lists vars" do - expect(subject.variables).to eq(%w(username)) - expect(subject.keys).to eq(%w(username)) - end - end - end - context "& operator" do - subject { Addressable::Template.new("foo{&foo,bar}baz") } - it "can match" do - data = subject.match("foo&foo=bar%20baz&bar=foobaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar)) - end - end - end - end - - context "support regexes:" do - context "EXPRESSION" do - subject { Addressable::Template::EXPRESSION } - it "should be able to match an expression" do - expect(subject).to match("{foo}") - expect(subject).to match("{foo,9}") - expect(subject).to match("{foo.bar,baz}") - expect(subject).to match("{+foo.bar,baz}") - expect(subject).to match("{foo,foo%20bar}") - expect(subject).to match("{#foo:20,baz*}") - expect(subject).to match("stuff{#foo:20,baz*}things") - end - it "should fail on non vars" do - expect(subject).not_to match("!{foo") - expect(subject).not_to match("{foo.bar.}") - expect(subject).not_to match("!{}") - end - end - context "VARNAME" do - subject { Addressable::Template::VARNAME } - it "should be able to match a variable" do - expect(subject).to match("foo") - expect(subject).to match("9") - expect(subject).to match("foo.bar") - expect(subject).to match("foo_bar") - expect(subject).to match("foo_bar.baz") - expect(subject).to match("foo%20bar") - expect(subject).to match("foo%20bar.baz") - end - it "should fail on non vars" do - expect(subject).not_to match("!foo") - expect(subject).not_to match("foo.bar.") - expect(subject).not_to match("foo%2%00bar") - expect(subject).not_to match("foo_ba%r") - expect(subject).not_to match("foo_bar*") - expect(subject).not_to match("foo_bar:20") - end - end - context "VARIABLE_LIST" do - subject { Addressable::Template::VARIABLE_LIST } - it "should be able to match a variable list" do - expect(subject).to match("foo,bar") - expect(subject).to match("foo") - expect(subject).to match("foo,bar*,baz") - expect(subject).to match("foo.bar,bar_baz*,baz:12") - end - it "should fail on non vars" do - expect(subject).not_to match(",foo,bar*,baz") - expect(subject).not_to match("foo,*bar,baz") - expect(subject).not_to match("foo,,bar*,baz") - end - end - context "VARSPEC" do - subject { Addressable::Template::VARSPEC } - it "should be able to match a variable with modifier" do - expect(subject).to match("9:8") - expect(subject).to match("foo.bar*") - expect(subject).to match("foo_bar:12") - expect(subject).to match("foo_bar.baz*") - expect(subject).to match("foo%20bar:12") - expect(subject).to match("foo%20bar.baz*") - end - it "should fail on non vars" do - expect(subject).not_to match("!foo") - expect(subject).not_to match("*foo") - expect(subject).not_to match("fo*o") - expect(subject).not_to match("fo:o") - expect(subject).not_to match("foo:") - end - end - end -end - -describe Addressable::Template::MatchData do - let(:template) { Addressable::Template.new('{foo}/{bar}') } - subject(:its) { template.match('ab/cd') } - its(:uri) { should == Addressable::URI.parse('ab/cd') } - its(:template) { should == template } - its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } } - its(:variables) { should == ['foo', 'bar'] } - its(:keys) { should == ['foo', 'bar'] } - its(:names) { should == ['foo', 'bar'] } - its(:values) { should == ['ab', 'cd'] } - its(:captures) { should == ['ab', 'cd'] } - its(:to_a) { should == ['ab/cd', 'ab', 'cd'] } - its(:to_s) { should == 'ab/cd' } - its(:string) { should == its.to_s } - its(:pre_match) { should == "" } - its(:post_match) { should == "" } - - describe 'values_at' do - it 'returns an array with the values' do - expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd']) - end - it 'allows mixing integer an string keys' do - expect(its.values_at('foo', 1)).to eq(['ab', 'ab']) - end - it 'accepts unknown keys' do - expect(its.values_at('baz', 'foo')).to eq([nil, 'ab']) - end - end - - describe '[]' do - context 'string key' do - it 'returns the corresponding capture' do - expect(its['foo']).to eq('ab') - expect(its['bar']).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its['baz']).to be_nil - end - end - context 'symbol key' do - it 'returns the corresponding capture' do - expect(its[:foo]).to eq('ab') - expect(its[:bar]).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its[:baz]).to be_nil - end - end - context 'integer key' do - it 'returns the full URI for index 0' do - expect(its[0]).to eq('ab/cd') - end - it 'returns the corresponding capture' do - expect(its[1]).to eq('ab') - expect(its[2]).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its[3]).to be_nil - end - end - context 'other key' do - it 'raises an exception' do - expect { its[Object.new] }.to raise_error(TypeError) - end - end - context 'with length' do - it 'returns an array starting at index with given length' do - expect(its[0, 2]).to eq(['ab/cd', 'ab']) - expect(its[2, 1]).to eq(['cd']) - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb deleted file mode 100644 index 9a15c28bb06f711423afbf127b4c16f1504aca65..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb +++ /dev/null @@ -1,6468 +0,0 @@ -# coding: utf-8 -# Copyright (C) Bob Aman -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require "spec_helper" - -require "addressable/uri" -require "uri" -require "ipaddr" - -if !"".respond_to?("force_encoding") - class String - def force_encoding(encoding) - @encoding = encoding - end - - def encoding - @encoding ||= Encoding::ASCII_8BIT - end - end - - class Encoding - def initialize(name) - @name = name - end - - def to_s - return @name - end - - UTF_8 = Encoding.new("UTF-8") - ASCII_8BIT = Encoding.new("US-ASCII") - end -end - -module Fake - module URI - class HTTP - def initialize(uri) - @uri = uri - end - - def to_s - return @uri.to_s - end - - alias :to_str :to_s - end - end -end - -describe Addressable::URI, "when created with a non-numeric port number" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:port => "bogus") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a invalid encoded port number" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:port => "%eb") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a non-string scheme" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:scheme => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string user" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:user => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string password" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:password => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string userinfo" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:userinfo => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string host" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:host => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string authority" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:authority => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string path" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:path => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string query" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:query => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string fragment" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:fragment => :bogus) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a scheme but no hierarchical " + - "segment" do - it "should raise an error" do - expect(lambda do - Addressable::URI.parse("http:") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "quote handling" do - describe 'in host name' do - it "should raise an error for single quote" do - expect(lambda do - Addressable::URI.parse("http://local\"host/") - end).to raise_error(Addressable::URI::InvalidURIError) - end - end -end - -describe Addressable::URI, "newline normalization" do - it "should not accept newlines in scheme" do - expect(lambda do - Addressable::URI.parse("ht%0atp://localhost/") - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not unescape newline in path" do - uri = Addressable::URI.parse("http://localhost/%0a").normalize - expect(uri.to_s).to eq("http://localhost/%0A") - end - - it "should not unescape newline in hostname" do - uri = Addressable::URI.parse("http://local%0ahost/").normalize - expect(uri.to_s).to eq("http://local%0Ahost/") - end - - it "should not unescape newline in username" do - uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize - expect(uri.to_s).to eq("http://foo%0Abar@localhost/") - end - - it "should not unescape newline in username" do - uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize - expect(uri.to_s).to eq("http://example:foo%0Abar@example/") - end - - it "should not accept newline in hostname" do - uri = Addressable::URI.parse("http://localhost/") - expect(lambda do - uri.host = "local\nhost" - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with ambiguous path" do - it "should raise an error" do - expect(lambda do - Addressable::URI.parse("::http") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with an invalid host" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:host => "") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host consisting of " + - "sub-delims characters" do - it "should not raise an error" do - expect(lambda do - Addressable::URI.new( - :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '') - ) - end).not_to raise_error - end -end - -describe Addressable::URI, "when created with a host consisting of " + - "unreserved characters" do - it "should not raise an error" do - expect(lambda do - Addressable::URI.new( - :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '') - ) - end).not_to raise_error - end -end - -describe Addressable::URI, "when created from nil components" do - before do - @uri = Addressable::URI.new - end - - it "should have a nil site value" do - expect(@uri.site).to eq(nil) - end - - it "should have an empty path" do - expect(@uri.path).to eq("") - end - - it "should be an empty uri" do - expect(@uri.to_s).to eq("") - end - - it "should have a nil default port" do - expect(@uri.default_port).to eq(nil) - end - - it "should be empty" do - expect(@uri).to be_empty - end - - it "should raise an error if the scheme is set to whitespace" do - expect(lambda do - @uri.scheme = "\t \n" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme is set to all digits" do - expect(lambda do - @uri.scheme = "123" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme begins with a digit" do - expect(lambda do - @uri.scheme = "1scheme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme begins with a plus" do - expect(lambda do - @uri.scheme = "+scheme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme begins with a dot" do - expect(lambda do - @uri.scheme = ".scheme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme begins with a dash" do - expect(lambda do - @uri.scheme = "-scheme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme contains an illegal character" do - expect(lambda do - @uri.scheme = "scheme!" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme contains whitespace" do - expect(lambda do - @uri.scheme = "sch eme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if the scheme contains a newline" do - expect(lambda do - @uri.scheme = "sch\neme" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect(lambda do - @uri.user = "user" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect(lambda do - @uri.password = "pass" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect(lambda do - @uri.scheme = "http" - @uri.fragment = "fragment" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect(lambda do - @uri.fragment = "fragment" - @uri.scheme = "http" - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when initialized from individual components" do - before do - @uri = Addressable::URI.new( - :scheme => "http", - :user => "user", - :password => "password", - :host => "example.com", - :port => 8080, - :path => "/path", - :query => "query=value", - :fragment => "fragment" - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'com' for #tld" do - expect(@uri.tld).to eq("com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when initialized from " + - "frozen individual components" do - before do - @uri = Addressable::URI.new( - :scheme => "http".freeze, - :user => "user".freeze, - :password => "password".freeze, - :host => "example.com".freeze, - :port => "8080".freeze, - :path => "/path".freeze, - :query => "query=value".freeze, - :fragment => "fragment".freeze - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when parsed from a frozen string" do - before do - @uri = Addressable::URI.parse( - "http://user:password@example.com:8080/path?query=value#fragment".freeze - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when frozen" do - before do - @uri = Addressable::URI.new.freeze - end - - it "returns nil for #scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "returns nil for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq(nil) - end - - it "returns nil for #user" do - expect(@uri.user).to eq(nil) - end - - it "returns nil for #normalized_user" do - expect(@uri.normalized_user).to eq(nil) - end - - it "returns nil for #password" do - expect(@uri.password).to eq(nil) - end - - it "returns nil for #normalized_password" do - expect(@uri.normalized_password).to eq(nil) - end - - it "returns nil for #userinfo" do - expect(@uri.userinfo).to eq(nil) - end - - it "returns nil for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "returns nil for #host" do - expect(@uri.host).to eq(nil) - end - - it "returns nil for #normalized_host" do - expect(@uri.normalized_host).to eq(nil) - end - - it "returns nil for #authority" do - expect(@uri.authority).to eq(nil) - end - - it "returns nil for #normalized_authority" do - expect(@uri.normalized_authority).to eq(nil) - end - - it "returns nil for #port" do - expect(@uri.port).to eq(nil) - end - - it "returns nil for #normalized_port" do - expect(@uri.normalized_port).to eq(nil) - end - - it "returns nil for #default_port" do - expect(@uri.default_port).to eq(nil) - end - - it "returns nil for #site" do - expect(@uri.site).to eq(nil) - end - - it "returns nil for #normalized_site" do - expect(@uri.normalized_site).to eq(nil) - end - - it "returns '' for #path" do - expect(@uri.path).to eq('') - end - - it "returns '' for #normalized_path" do - expect(@uri.normalized_path).to eq('') - end - - it "returns nil for #query" do - expect(@uri.query).to eq(nil) - end - - it "returns nil for #normalized_query" do - expect(@uri.normalized_query).to eq(nil) - end - - it "returns nil for #fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "returns nil for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq(nil) - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq('') - end - - it "should be empty" do - expect(@uri).to be_empty - end - - it "should be frozen" do - expect(@uri).to be_frozen - end - - it "should not be frozen after duping" do - expect(@uri.dup).not_to be_frozen - end - - it "should not allow destructive operations" do - expect { @uri.normalize! }.to raise_error { |error| - expect(error.message).to match(/can't modify frozen/) - expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } - } - end -end - -describe Addressable::URI, "when frozen" do - before do - @uri = Addressable::URI.parse( - "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323" - ).freeze - end - - it "returns 'HTTP' for #scheme" do - expect(@uri.scheme).to eq("HTTP") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - expect(@uri.normalize.scheme).to eq("http") - end - - it "returns nil for #user" do - expect(@uri.user).to eq(nil) - end - - it "returns nil for #normalized_user" do - expect(@uri.normalized_user).to eq(nil) - end - - it "returns nil for #password" do - expect(@uri.password).to eq(nil) - end - - it "returns nil for #normalized_password" do - expect(@uri.normalized_password).to eq(nil) - end - - it "returns nil for #userinfo" do - expect(@uri.userinfo).to eq(nil) - end - - it "returns nil for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "returns 'example.com.' for #host" do - expect(@uri.host).to eq("example.com.") - end - - it "returns nil for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - expect(@uri.normalize.host).to eq("example.com") - end - - it "returns 'example.com.:80' for #authority" do - expect(@uri.authority).to eq("example.com.:80") - end - - it "returns 'example.com:80' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("example.com") - expect(@uri.normalize.authority).to eq("example.com") - end - - it "returns 80 for #port" do - expect(@uri.port).to eq(80) - end - - it "returns nil for #normalized_port" do - expect(@uri.normalized_port).to eq(nil) - expect(@uri.normalize.port).to eq(nil) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'HTTP://example.com.:80' for #site" do - expect(@uri.site).to eq("HTTP://example.com.:80") - end - - it "returns 'http://example.com' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://example.com") - expect(@uri.normalize.site).to eq("http://example.com") - end - - it "returns '/%70a%74%68' for #path" do - expect(@uri.path).to eq("/%70a%74%68") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - expect(@uri.normalize.path).to eq("/path") - end - - it "returns 'a=%31' for #query" do - expect(@uri.query).to eq("a=%31") - end - - it "returns 'a=1' for #normalized_query" do - expect(@uri.normalized_query).to eq("a=1") - expect(@uri.normalize.query).to eq("a=1") - end - - it "returns '/%70a%74%68?a=%31' for #request_uri" do - expect(@uri.request_uri).to eq("/%70a%74%68?a=%31") - end - - it "returns '1%323' for #fragment" do - expect(@uri.fragment).to eq("1%323") - end - - it "returns '123' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("123") - expect(@uri.normalize.fragment).to eq("123") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323') - expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123') - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should be frozen" do - expect(@uri).to be_frozen - end - - it "should not be frozen after duping" do - expect(@uri.dup).not_to be_frozen - end - - it "should not allow destructive operations" do - expect { @uri.normalize! }.to raise_error { |error| - expect(error.message).to match(/can't modify frozen/) - expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } - } - end -end - -describe Addressable::URI, "when created from string components" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :host => "example.com" - ) - end - - it "should have a site value of 'http://example.com'" do - expect(@uri.site).to eq("http://example.com") - end - - it "should be equal to the equivalent parsed URI" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should raise an error if invalid components omitted" do - expect(lambda do - @uri.omit(:bogus) - end).to raise_error(ArgumentError) - expect(lambda do - @uri.omit(:scheme, :bogus, :path) - end).to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with a nil host but " + - "non-nil authority components" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:user => "user", :password => "pass", :port => 80) - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with both an authority and a user" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new( - :user => "user", :authority => "user@example.com:80" - ) - end).to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with an authority and no port" do - before do - @uri = Addressable::URI.new(:authority => "user@example.com") - end - - it "should not infer a port" do - expect(@uri.port).to eq(nil) - expect(@uri.default_port).to eq(nil) - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a site value of '//user@example.com'" do - expect(@uri.site).to eq("//user@example.com") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when created with a host with trailing dots" do - before do - @uri = Addressable::URI.new(:authority => "example...") - end - - it "should have a stable normalized form" do - expect(@uri.normalize.normalize.normalize.host).to eq( - @uri.normalize.host - ) - end -end - -describe Addressable::URI, "when created with a host with a backslash" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:authority => "example\\example") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host with a slash" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:authority => "example/example") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host with a space" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:authority => "example example") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with both a userinfo and a user" do - it "should raise an error" do - expect(lambda do - Addressable::URI.new(:user => "user", :userinfo => "user:pass") - end).to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with a path that hasn't been " + - "prefixed with a '/' but a host specified" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :host => "example.com", :path => "path" - ) - end - - it "should prefix a '/' to the path" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/path")) - end - - it "should have a site value of 'http://example.com'" do - expect(@uri.site).to eq("http://example.com") - end - - it "should have an origin of 'http://example.com" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when created with a path that hasn't been " + - "prefixed with a '/' but no host specified" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :path => "path" - ) - end - - it "should not prefix a '/' to the path" do - expect(@uri).to eq(Addressable::URI.parse("http:path")) - end - - it "should have a site value of 'http:'" do - expect(@uri.site).to eq("http:") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from an Addressable::URI object" do - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.parse(original_uri) - new_uri.host = 'www.example.com' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('http://www.example.com/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.heuristic_parse(original_uri) - new_uri.host = 'www.example.com' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('http://www.example.com/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.parse(original_uri) - new_uri.origin = 'https://www.example.com:8080' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('https://www.example.com:8080/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.heuristic_parse(original_uri) - new_uri.origin = 'https://www.example.com:8080' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('https://www.example.com:8080/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end -end - -describe Addressable::URI, "when parsed from something that looks " + - "like a URI object" do - it "should parse without error" do - uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/")) - expect(lambda do - Addressable::URI.parse(uri) - end).not_to raise_error - end -end - -describe Addressable::URI, "when parsed from a standard library URI object" do - it "should parse without error" do - uri = Addressable::URI.parse(URI.parse("http://example.com/")) - expect(lambda do - Addressable::URI.parse(uri) - end).not_to raise_error - end -end - -describe Addressable::URI, "when parsed from ''" do - before do - @uri = Addressable::URI.parse("") - end - - it "should have no scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do - before do - @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt") - end - - it "should use the 'ftp' scheme" do - expect(@uri.scheme).to eq("ftp") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of 'ftp.is.co.za'" do - expect(@uri.host).to eq("ftp.is.co.za") - end - - it "should have inferred_port of 21" do - expect(@uri.inferred_port).to eq(21) - end - - it "should have a path of '/rfc/rfc1808.txt'" do - expect(@uri.path).to eq("/rfc/rfc1808.txt") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'ftp://ftp.is.co.za'" do - expect(@uri.origin).to eq('ftp://ftp.is.co.za') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'http://www.ietf.org/rfc/rfc2396.txt'" do - before do - @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of 'www.ietf.org'" do - expect(@uri.host).to eq("www.ietf.org") - end - - it "should have inferred_port of 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/rfc/rfc2396.txt'" do - expect(@uri.path).to eq("/rfc/rfc2396.txt") - end - - it "should have a request URI of '/rfc/rfc2396.txt'" do - expect(@uri.request_uri).to eq("/rfc/rfc2396.txt") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should correctly omit components" do - expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") - expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org") - end - - it "should correctly omit components destructively" do - @uri.omit!(:scheme) - expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") - end - - it "should have an origin of 'http://www.ietf.org'" do - expect(@uri.origin).to eq('http://www.ietf.org') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do - before do - @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one") - end - - it "should use the 'ldap' scheme" do - expect(@uri.scheme).to eq("ldap") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of '[2001:db8::7]'" do - expect(@uri.host).to eq("[2001:db8::7]") - end - - it "should have inferred_port of 389" do - expect(@uri.inferred_port).to eq(389) - end - - it "should have a path of '/c=GB'" do - expect(@uri.path).to eq("/c=GB") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should not allow request URI assignment" do - expect(lambda do - @uri.request_uri = "/" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should have a query of 'objectClass?one'" do - expect(@uri.query).to eq("objectClass?one") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should correctly omit components" do - expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one") - expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one") - end - - it "should correctly omit components destructively" do - @uri.omit!(:scheme, :authority) - expect(@uri.to_s).to eq("/c=GB?objectClass?one") - end - - it "should raise an error if omission would create an invalid URI" do - expect(lambda do - @uri.omit(:authority, :path) - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should have an origin of 'ldap://[2001:db8::7]'" do - expect(@uri.origin).to eq('ldap://[2001:db8::7]') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'mailto:John.Doe@example.com'" do - before do - @uri = Addressable::URI.parse("mailto:John.Doe@example.com") - end - - it "should use the 'mailto' scheme" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of 'John.Doe@example.com'" do - expect(@uri.path).to eq("John.Doe@example.com") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 2 of RFC 6068 -describe Addressable::URI, "when parsed from " + - "'mailto:?to=addr1@an.example,addr2@an.example'" do - before do - @uri = Addressable::URI.parse( - "mailto:?to=addr1@an.example,addr2@an.example" - ) - end - - it "should use the 'mailto' scheme" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should have the To: field value parameterized" do - expect(@uri.query_values(Hash)["to"]).to eq( - "addr1@an.example,addr2@an.example" - ) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'news:comp.infosystems.www.servers.unix'" do - before do - @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix") - end - - it "should use the 'news' scheme" do - expect(@uri.scheme).to eq("news") - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of 'comp.infosystems.www.servers.unix'" do - expect(@uri.path).to eq("comp.infosystems.www.servers.unix") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'tel:+1-816-555-1212'" do - before do - @uri = Addressable::URI.parse("tel:+1-816-555-1212") - end - - it "should use the 'tel' scheme" do - expect(@uri.scheme).to eq("tel") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of '+1-816-555-1212'" do - expect(@uri.path).to eq("+1-816-555-1212") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'telnet://192.0.2.16:80/'" do - before do - @uri = Addressable::URI.parse("telnet://192.0.2.16:80/") - end - - it "should use the 'telnet' scheme" do - expect(@uri.scheme).to eq("telnet") - end - - it "should have a host of '192.0.2.16'" do - expect(@uri.host).to eq("192.0.2.16") - end - - it "should have a port of 80" do - expect(@uri.port).to eq(80) - end - - it "should have a inferred_port of 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a default_port of 23" do - expect(@uri.default_port).to eq(23) - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'telnet://192.0.2.16:80'" do - expect(@uri.origin).to eq('telnet://192.0.2.16:80') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do - before do - @uri = Addressable::URI.parse( - "urn:oasis:names:specification:docbook:dtd:xml:4.1.2") - end - - it "should use the 'urn' scheme" do - expect(@uri.scheme).to eq("urn") - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of " + - "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do - expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when heuristically parsed from " + - "'192.0.2.16:8000/path'" do - before do - @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a host of '192.0.2.16'" do - expect(@uri.host).to eq("192.0.2.16") - end - - it "should have a port of '8000'" do - expect(@uri.port).to eq(8000) - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/path'" do - expect(@uri.path).to eq("/path") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'http://192.0.2.16:8000'" do - expect(@uri.origin).to eq('http://192.0.2.16:8000') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com'" do - before do - @uri = Addressable::URI.parse("http://example.com") - end - - it "when inspected, should have the correct URI" do - expect(@uri.inspect).to include("http://example.com") - end - - it "when inspected, should have the correct class name" do - expect(@uri.inspect).to include("Addressable::URI") - end - - it "when inspected, should have the correct object id" do - expect(@uri.inspect).to include("%#0x" % @uri.object_id) - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should be considered ip-based" do - expect(@uri).to be_ip_based - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not have a specified port" do - expect(@uri.port).to eq(nil) - end - - it "should have an empty path" do - expect(@uri.path).to eq("") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - expect(@uri.query_values).to eq(nil) - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should not be exactly equal to 42" do - expect(@uri.eql?(42)).to eq(false) - end - - it "should not be equal to 42" do - expect(@uri == 42).to eq(false) - end - - it "should not be roughly equal to 42" do - expect(@uri === 42).to eq(false) - end - - it "should be exactly equal to http://example.com" do - expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true) - end - - it "should be roughly equal to http://example.com/" do - expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) - end - - it "should be roughly equal to the string 'http://example.com/'" do - expect(@uri === "http://example.com/").to eq(true) - end - - it "should not be roughly equal to the string " + - "'http://example.com:bogus/'" do - expect(lambda do - expect(@uri === "http://example.com:bogus/").to eq(false) - end).not_to raise_error - end - - it "should result in itself when joined with itself" do - expect(@uri.join(@uri).to_s).to eq("http://example.com") - expect(@uri.join!(@uri).to_s).to eq("http://example.com") - end - - it "should be equivalent to http://EXAMPLE.com" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) - end - - it "should be equivalent to http://EXAMPLE.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) - end - - it "should have the same hash as http://example.com" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have the same hash as http://EXAMPLE.com after assignment" do - @uri.origin = "http://EXAMPLE.com" - expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) - end - - it "should have a different hash from http://EXAMPLE.com" do - expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) - end - - it "should not allow origin assignment without scheme" do - expect(lambda do - @uri.origin = "example.com" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow origin assignment without host" do - expect(lambda do - @uri.origin = "http://" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow origin assignment with bogus type" do - expect(lambda do - @uri.origin = :bogus - end).to raise_error(TypeError) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Section 6.2.2.1 of RFC 3986 - it "should be equivalent to http://EXAMPLE.COM/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) - end - - it "should have a route of '/path/' to 'http://example.com/path/'" do - expect(@uri.route_to("http://example.com/path/")).to eq( - Addressable::URI.parse("/path/") - ) - end - - it "should have a route of '..' from 'http://example.com/path/'" do - expect(@uri.route_from("http://example.com/path/")).to eq( - Addressable::URI.parse("..") - ) - end - - it "should have a route of '#' to 'http://example.com/'" do - expect(@uri.route_to("http://example.com/")).to eq( - Addressable::URI.parse("#") - ) - end - - it "should have a route of 'http://elsewhere.com/' to " + - "'http://elsewhere.com/'" do - expect(@uri.route_to("http://elsewhere.com/")).to eq( - Addressable::URI.parse("http://elsewhere.com/") - ) - end - - it "when joined with 'relative/path' should be " + - "'http://example.com/relative/path'" do - expect(@uri.join('relative/path')).to eq( - Addressable::URI.parse("http://example.com/relative/path") - ) - end - - it "when joined with a bogus object a TypeError should be raised" do - expect(lambda do - @uri.join(42) - end).to raise_error(TypeError) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should have the correct username after assignment" do - @uri.user = "user@123!" - expect(@uri.user).to eq("user@123!") - expect(@uri.normalized_user).to eq("user%40123%21") - expect(@uri.password).to eq(nil) - expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "#secret@123!" - expect(@uri.password).to eq("#secret@123!") - expect(@uri.normalized_password).to eq("%23secret%40123%21") - expect(@uri.user).to eq("") - expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/") - expect(@uri.omit(:password).to_s).to eq("http://example.com") - end - - it "should have the correct user/pass after repeated assignment" do - @uri.user = nil - expect(@uri.user).to eq(nil) - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - # Username cannot be nil if the password is set - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = nil - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = "" - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - @uri.user = nil - # Username cannot be nil if the password is set - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct user/pass after userinfo assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - @uri.userinfo = nil - expect(@uri.userinfo).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -# Section 5.1.2 of RFC 2616 -describe Addressable::URI, "when parsed from " + - "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do - before do - @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html") - end - - it "should have the correct request URI" do - expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html") - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "/some/where/else.html?query?string" - expect(@uri.request_uri).to eq("/some/where/else.html?query?string") - expect(@uri.path).to eq("/some/where/else.html") - expect(@uri.query).to eq("query?string") - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "?x=y" - expect(@uri.request_uri).to eq("/?x=y") - expect(@uri.path).to eq("/") - expect(@uri.query).to eq("x=y") - end - - it "should raise an error if the site value is set to something bogus" do - expect(lambda do - @uri.site = 42 - end).to raise_error(TypeError) - end - - it "should raise an error if the request URI is set to something bogus" do - expect(lambda do - @uri.request_uri = 42 - end).to raise_error(TypeError) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "HTTP", - :user => nil, - :password => nil, - :host => "www.w3.org", - :port => nil, - :path => "/pub/WWW/TheProject.html", - :query => nil, - :fragment => nil - }) - end - - it "should have an origin of 'http://www.w3.org'" do - expect(@uri.origin).to eq('http://www.w3.org') - end -end - -describe Addressable::URI, "when parsing IPv6 addresses" do - it "should not raise an error for " + - "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[fe80::200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[::1]/'" do - Addressable::URI.parse("http://[::1]/") - end - - it "should not raise an error for " + - "'http://[fe80::1]/'" do - Addressable::URI.parse("http://[fe80::1]/") - end - - it "should raise an error for " + - "'http://[]/'" do - expect(lambda do - Addressable::URI.parse("http://[]/") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsing IPv6 address" do - subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") } - its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' } - its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' } -end - -describe Addressable::URI, "when assigning IPv6 address" do - it "should allow to set bare IPv6 address as hostname" do - uri = Addressable::URI.parse("http://[::1]/") - uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' - expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') - end - - it "should allow to set bare IPv6 address as hostname with IPAddr object" do - uri = Addressable::URI.parse("http://[::1]/") - uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf') - expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') - end - - it "should not allow to set bare IPv6 address as host" do - uri = Addressable::URI.parse("http://[::1]/") - skip "not checked" - expect(lambda do - uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsing IPvFuture addresses" do - it "should not raise an error for " + - "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[va0.::1]/'" do - Addressable::URI.parse("http://[va0.::1]/") - end - - it "should not raise an error for " + - "'http://[v255.fe80::1]/'" do - Addressable::URI.parse("http://[v255.fe80::1]/") - end - - it "should raise an error for " + - "'http://[v0.]/'" do - expect(lambda do - Addressable::URI.parse("http://[v0.]/") - end).to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/'" do - before do - @uri = Addressable::URI.parse("http://example.com/") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to HTTP://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://Example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://Example.com/")) - end - - it "should have the correct username after assignment" do - @uri.user = nil - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should have the correct password after assignment" do - @uri.password = nil - expect(@uri.password).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have the same hash as its duplicate" do - expect(@uri.hash).to eq(@uri.dup.hash) - end - - it "should have a different hash from its equivalent String value" do - expect(@uri.hash).not_to eq(@uri.to_s.hash) - end - - it "should have the same hash as an equal URI" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) - end - - it "should be equivalent to http://EXAMPLE.com" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) - end - - it "should be equivalent to http://EXAMPLE.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) - end - - it "should have the same hash as http://example.com/" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) - end - - it "should have the same hash as http://example.com after assignment" do - @uri.path = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have the same hash as http://example.com/? after assignment" do - @uri.query = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) - end - - it "should have the same hash as http://example.com/? after assignment" do - @uri.query_values = {} - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) - end - - it "should have the same hash as http://example.com/# after assignment" do - @uri.fragment = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash) - end - - it "should have a different hash from http://example.com" do - expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com?#'" do - before do - @uri = Addressable::URI.parse("http://example.com?#") - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "", - :query => "", - :fragment => "" - }) - end - - it "should have a request URI of '/?'" do - expect(@uri.request_uri).to eq("/?") - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq("http://example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://@example.com/'" do - before do - @uri = Addressable::URI.parse("http://@example.com/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => "", - :password => nil, - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com./'" do - before do - @uri = Addressable::URI.parse("http://example.com./") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:@example.com/'" do - before do - @uri = Addressable::URI.parse("http://:@example.com/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => "", - :password => "", - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'HTTP://EXAMPLE.COM/'" do - before do - @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "HTTP", - :user => nil, - :password => nil, - :host => "EXAMPLE.COM", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end - - it "should have a tld of 'com'" do - expect(@uri.tld).to eq('com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.example.co.uk/'" do - before do - @uri = Addressable::URI.parse("http://www.example.co.uk/") - end - - it "should have an origin of 'http://www.example.co.uk'" do - expect(@uri.origin).to eq('http://www.example.co.uk') - end - - it "should have a tld of 'co.uk'" do - expect(@uri.tld).to eq('co.uk') - end - - it "should have a domain of 'example.co.uk'" do - expect(@uri.domain).to eq('example.co.uk') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://sub_domain.blogspot.com/'" do - before do - @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/") - end - - it "should have an origin of 'http://sub_domain.blogspot.com'" do - expect(@uri.origin).to eq('http://sub_domain.blogspot.com') - end - - it "should have a tld of 'com'" do - expect(@uri.tld).to eq('com') - end - - it "should have a domain of 'blogspot.com'" do - expect(@uri.domain).to eq('blogspot.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/~smith/'" do - before do - @uri = Addressable::URI.parse("http://example.com/~smith/") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com/%7Esmith/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com/%7esmith/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/")) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%E8'" do - before do - @uri = Addressable::URI.parse("http://example.com/%E8") - end - - it "should not raise an exception when normalized" do - expect(lambda do - @uri.normalize - end).not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/%E8" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/%E8" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path%2Fsegment/'" do - before do - @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should be equal to 'http://example.com/path%2Fsegment/'" do - expect(@uri.normalize).to be_eql( - Addressable::URI.parse("http://example.com/path%2Fsegment/") - ) - end - - it "should not be equal to 'http://example.com/path/segment/'" do - expect(@uri).not_to eq( - Addressable::URI.parse("http://example.com/path/segment/") - ) - end - - it "should not be equal to 'http://example.com/path/segment/'" do - expect(@uri.normalize).not_to be_eql( - Addressable::URI.parse("http://example.com/path/segment/") - ) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?%F6'" do - before do - @uri = Addressable::URI.parse("http://example.com/?%F6") - end - - it "should not raise an exception when normalized" do - expect(lambda do - @uri.normalize - end).not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/?%F6" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/?%F6" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/#%F6'" do - before do - @uri = Addressable::URI.parse("http://example.com/#%F6") - end - - it "should not raise an exception when normalized" do - expect(lambda do - @uri.normalize - end).not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/#%F6" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/#%F6" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%C3%87'" do - before do - @uri = Addressable::URI.parse("http://example.com/%C3%87") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to 'http://example.com/C%CC%A7'" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7")) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/%C3%87" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/%C3%87" - end - - it "should raise an error if encoding with an unexpected return type" do - expect(lambda do - Addressable::URI.normalized_encode(@uri, Integer) - end).to raise_error(TypeError) - end - - it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do - expect(Addressable::URI.encode(@uri).to_s).to eq( - "http://example.com/%25C3%2587" - ) - end - - it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do - expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq( - Addressable::URI.parse("http://example.com/%25C3%2587") - ) - end - - it "should raise an error if encoding with an unexpected return type" do - expect(lambda do - Addressable::URI.encode(@uri, Integer) - end).to raise_error(TypeError) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=string'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=string") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have a query string of 'q=string'" do - expect(@uri.query).to eq("q=string") - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:80/'" do - before do - @uri = Addressable::URI.parse("http://example.com:80/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com:80'" do - expect(@uri.authority).to eq("example.com:80") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have explicit port 80" do - expect(@uri.port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:80/" do - expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true) - end - - it "should be roughly equal to http://example.com/" do - expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) - end - - it "should be roughly equal to the string 'http://example.com/'" do - expect(@uri === "http://example.com/").to eq(true) - end - - it "should not be roughly equal to the string " + - "'http://example.com:bogus/'" do - expect(lambda do - expect(@uri === "http://example.com:bogus/").to eq(false) - end).not_to raise_error - end - - it "should result in itself when joined with itself" do - expect(@uri.join(@uri).to_s).to eq("http://example.com:80/") - expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/") - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Section 6.2.2.1 of RFC 3986 - it "should be equal to http://EXAMPLE.COM/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => 80, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com:80/" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com:80/" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:8080/'" do - before do - @uri = Addressable::URI.parse("http://example.com:8080/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com:8080'" do - expect(@uri.authority).to eq("example.com:8080") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 8080" do - expect(@uri.inferred_port).to eq(8080) - end - - it "should have explicit port 8080" do - expect(@uri.port).to eq(8080) - end - - it "should have default port 80" do - expect(@uri.default_port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:8080/" do - expect(@uri.eql?(Addressable::URI.parse( - "http://example.com:8080/"))).to eq(true) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://example.com/path/to/'" do - expect(@uri.route_from("http://example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://example.com:80/path/to/'" do - expect(@uri.route_from("http://example.com:80/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should have a route of '../../' from " + - "'http://example.com:8080/path/to/'" do - expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( - Addressable::URI.parse("../../") - ) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://user:pass@example.com/path/to/'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => 8080, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com:8080'" do - expect(@uri.origin).to eq('http://example.com:8080') - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com:8080/" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com:8080/" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:%38%30/'" do - before do - @uri = Addressable::URI.parse("http://example.com:%38%30/") - end - - it "should have the correct port" do - expect(@uri.port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%2E/'" do - before do - @uri = Addressable::URI.parse("http://example.com/%2E/") - end - - it "should be considered to be in normal form" do - skip( - 'path segment normalization should happen before ' + - 'percent escaping normalization' - ) - @uri.normalize.should be_eql(@uri) - end - - it "should normalize to 'http://example.com/%2E/'" do - skip( - 'path segment normalization should happen before ' + - 'percent escaping normalization' - ) - expect(@uri.normalize).to eq("http://example.com/%2E/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/../..'" do - before do - @uri = Addressable::URI.parse("http://example.com/../..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path(/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/path(/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/(path)/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/(path)/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path(/../'" do - before do - @uri = Addressable::URI.parse("http://example.com/path(/../") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/(path)/../'" do - before do - @uri = Addressable::URI.parse("http://example.com/(path)/../") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'/..//example.com'" do - before do - @uri = Addressable::URI.parse("/..//example.com") - end - - it "should become invalid when normalized" do - expect(lambda do - @uri.normalize - end).to raise_error(Addressable::URI::InvalidURIError, /authority/) - end - - it "should have a path of '/..//example.com'" do - expect(@uri.path).to eq("/..//example.com") - end -end - -describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do - before do - @uri = Addressable::URI.parse("/a/b/c/./../../g") - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - # Section 5.2.4 of RFC 3986 - it "should normalize to '/a/g'" do - expect(@uri.normalize.to_s).to eq("/a/g") - end -end - -describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do - before do - @uri = Addressable::URI.parse("mid/content=5/../6") - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - # Section 5.2.4 of RFC 3986 - it "should normalize to 'mid/6'" do - expect(@uri.normalize.to_s).to eq("mid/6") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.example.com///../'" do - before do - @uri = Addressable::URI.parse('http://www.example.com///../') - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://www.example.com//'" do - expect(@uri.normalize.to_s).to eq("http://www.example.com//") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path/to/resource/'" do - before do - @uri = Addressable::URI.parse("http://example.com/path/to/resource/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/path/to/resource/'" do - expect(@uri.path).to eq("/path/to/resource/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:8080/" do - expect(@uri.eql?(Addressable::URI.parse( - "http://example.com/path/to/resource/"))).to eq(true) - end - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/'" do - expect(@uri.route_from("http://example.com/path/to/")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of '../' from " + - "'http://example.com/path/to/resource/sub'" do - expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq( - Addressable::URI.parse("../") - ) - end - - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/another'" do - expect(@uri.route_from("http://example.com/path/to/another")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/res'" do - expect(@uri.route_from("http://example.com/path/to/res")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'resource/' from " + - "'http://example.com:80/path/to/'" do - expect(@uri.route_from("http://example.com:80/path/to/")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'http://example.com/path/to/' from " + - "'http://example.com:8080/path/to/'" do - expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( - Addressable::URI.parse("http://example.com/path/to/resource/") - ) - end - - it "should have a route of 'http://example.com/path/to/' from " + - "'http://user:pass@example.com/path/to/'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com/path/to/resource/") - ) - end - - it "should have a route of '../../path/to/resource/' from " + - "'http://example.com/to/resource/'" do - expect(@uri.route_from("http://example.com/to/resource/")).to eq( - Addressable::URI.parse("../../path/to/resource/") - ) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "/path/to/resource/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'relative/path/to/resource'" do - before do - @uri = Addressable::URI.parse("relative/path/to/resource") - end - - it "should not have a scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an authority segment" do - expect(@uri.authority).to eq(nil) - end - - it "should not have a host" do - expect(@uri.host).to eq(nil) - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not have a port" do - expect(@uri.port).to eq(nil) - end - - it "should have a path of 'relative/path/to/resource'" do - expect(@uri.path).to eq("relative/path/to/resource") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should not be considered absolute" do - expect(@uri).not_to be_absolute - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should raise an error if routing is attempted" do - expect(lambda do - @uri.route_to("http://example.com/") - end).to raise_error(ArgumentError, /relative\/path\/to\/resource/) - expect(lambda do - @uri.route_from("http://example.com/") - end).to raise_error(ArgumentError, /relative\/path\/to\/resource/) - end - - it "when joined with 'another/relative/path' should be " + - "'relative/path/to/another/relative/path'" do - expect(@uri.join('another/relative/path')).to eq( - Addressable::URI.parse("relative/path/to/another/relative/path") - ) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'relative_path_with_no_slashes'" do - before do - @uri = Addressable::URI.parse("relative_path_with_no_slashes") - end - - it "should not have a scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an authority segment" do - expect(@uri.authority).to eq(nil) - end - - it "should not have a host" do - expect(@uri.host).to eq(nil) - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not have a port" do - expect(@uri.port).to eq(nil) - end - - it "should have a path of 'relative_path_with_no_slashes'" do - expect(@uri.path).to eq("relative_path_with_no_slashes") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should not be considered absolute" do - expect(@uri).not_to be_absolute - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "when joined with 'another_relative_path' should be " + - "'another_relative_path'" do - expect(@uri.join('another_relative_path')).to eq( - Addressable::URI.parse("another_relative_path") - ) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt'" do - expect(@uri.path).to eq("/file.txt") - end - - it "should have a basename of 'file.txt'" do - expect(@uri.basename).to eq("file.txt") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt;parameter'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt;parameter") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt;parameter'" do - expect(@uri.path).to eq("/file.txt;parameter") - end - - it "should have a basename of 'file.txt'" do - expect(@uri.basename).to eq("file.txt") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt;x=y'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt;x=y") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt;x=y'" do - expect(@uri.path).to eq("/file.txt;x=y") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'svn+ssh://developername@rubyforge.org/var/svn/project'" do - before do - @uri = Addressable::URI.parse( - "svn+ssh://developername@rubyforge.org/var/svn/project" - ) - end - - it "should have a scheme of 'svn+ssh'" do - expect(@uri.scheme).to eq("svn+ssh") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/var/svn/project'" do - expect(@uri.path).to eq("/var/svn/project") - end - - it "should have a username of 'developername'" do - expect(@uri.user).to eq("developername") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do - before do - @uri = Addressable::URI.parse( - "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project" - ) - end - - it "should have a scheme of 'ssh+svn'" do - expect(@uri.scheme).to eq("ssh+svn") - end - - it "should have a normalized scheme of 'svn+ssh'" do - expect(@uri.normalized_scheme).to eq("svn+ssh") - end - - it "should have a normalized site of 'svn+ssh'" do - expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of '/var/svn/project'" do - expect(@uri.path).to eq("/var/svn/project") - end - - it "should have a username of 'developername'" do - expect(@uri.user).to eq("developername") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'mailto:user@example.com'" do - before do - @uri = Addressable::URI.parse("mailto:user@example.com") - end - - it "should have a scheme of 'mailto'" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of 'user@example.com'" do - expect(@uri.path).to eq("user@example.com") - end - - it "should have no user" do - expect(@uri.user).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'tag:example.com,2006-08-18:/path/to/something'" do - before do - @uri = Addressable::URI.parse( - "tag:example.com,2006-08-18:/path/to/something") - end - - it "should have a scheme of 'tag'" do - expect(@uri.scheme).to eq("tag") - end - - it "should be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of " + - "'example.com,2006-08-18:/path/to/something'" do - expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something") - end - - it "should have no user" do - expect(@uri.user).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/x;y/'" do - before do - @uri = Addressable::URI.parse("http://example.com/x;y/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?x=1&y=2'" do - before do - @uri = Addressable::URI.parse("http://example.com/?x=1&y=2") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'view-source:http://example.com/'" do - before do - @uri = Addressable::URI.parse("view-source:http://example.com/") - end - - it "should have a scheme of 'view-source'" do - expect(@uri.scheme).to eq("view-source") - end - - it "should have a path of 'http://example.com/'" do - expect(@uri.path).to eq("http://example.com/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do - before do - @uri = Addressable::URI.parse( - "http://user:pass@example.com/path/to/resource?query=x#fragment") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'user:pass@example.com'" do - expect(@uri.authority).to eq("user:pass@example.com") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have a password of 'pass'" do - expect(@uri.password).to eq("pass") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/path/to/resource'" do - expect(@uri.path).to eq("/path/to/resource") - end - - it "should have a query string of 'query=x'" do - expect(@uri.query).to eq("query=x") - end - - it "should have a fragment of 'fragment'" do - expect(@uri.fragment).to eq("fragment") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a route of '../../' to " + - "'http://user:pass@example.com/path/'" do - expect(@uri.route_to("http://user:pass@example.com/path/")).to eq( - Addressable::URI.parse("../../") - ) - end - - it "should have a route of 'to/resource?query=x#fragment' " + - "from 'http://user:pass@example.com/path/'" do - expect(@uri.route_from("http://user:pass@example.com/path/")).to eq( - Addressable::URI.parse("to/resource?query=x#fragment") - ) - end - - it "should have a route of '?query=x#fragment' " + - "from 'http://user:pass@example.com/path/to/resource'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq( - Addressable::URI.parse("?query=x#fragment") - ) - end - - it "should have a route of '#fragment' " + - "from 'http://user:pass@example.com/path/to/resource?query=x'" do - expect(@uri.route_from( - "http://user:pass@example.com/path/to/resource?query=x")).to eq( - Addressable::URI.parse("#fragment") - ) - end - - it "should have a route of '#fragment' from " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do - expect(@uri.route_from( - "http://user:pass@example.com/path/to/resource?query=x#fragment" - )).to eq(Addressable::URI.parse("#fragment")) - end - - it "should have a route of 'http://elsewhere.com/' to " + - "'http://elsewhere.com/'" do - expect(@uri.route_to("http://elsewhere.com/")).to eq( - Addressable::URI.parse("http://elsewhere.com/") - ) - end - - it "should have a route of " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment' " + - "from 'http://example.com/path/to/'" do - expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq( - Addressable::URI.parse( - "http://user:pass@example.com/path/to/resource?query=x#fragment") - ) - end - - it "should have the correct scheme after assignment" do - @uri.scheme = "ftp" - expect(@uri.scheme).to eq("ftp") - expect(@uri.to_s).to eq( - "ftp://user:pass@example.com/path/to/resource?query=x#fragment" - ) - expect(@uri.to_str).to eq( - "ftp://user:pass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct site segment after assignment" do - @uri.site = "https://newuser:newpass@example.com:443" - expect(@uri.scheme).to eq("https") - expect(@uri.authority).to eq("newuser:newpass@example.com:443") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.normalized_userinfo).to eq("newuser:newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(443) - expect(@uri.inferred_port).to eq(443) - expect(@uri.to_s).to eq( - "https://newuser:newpass@example.com:443" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser:newpass@example.com:80" - expect(@uri.authority).to eq("newuser:newpass@example.com:80") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.normalized_userinfo).to eq("newuser:newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(80) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq( - "http://newuser:newpass@example.com:80" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct userinfo segment after assignment" do - @uri.userinfo = "newuser:newpass" - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.authority).to eq("newuser:newpass@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq( - "http://newuser:newpass@example.com" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.authority).to eq("newuser:pass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.authority).to eq("user:newpass@example.com") - end - - it "should have the correct host after assignment" do - @uri.host = "newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.authority).to eq("user:pass@newexample.com") - end - - it "should have the correct host after assignment" do - @uri.hostname = "newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.hostname).to eq("newexample.com") - expect(@uri.authority).to eq("user:pass@newexample.com") - end - - it "should raise an error if assigning a bogus object to the hostname" do - expect(lambda do - @uri.hostname = Object.new - end).to raise_error - end - - it "should have the correct port after assignment" do - @uri.port = 8080 - expect(@uri.port).to eq(8080) - expect(@uri.authority).to eq("user:pass@example.com:8080") - end - - it "should have the correct origin after assignment" do - @uri.origin = "http://newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.authority).to eq("newexample.com") - end - - it "should have the correct path after assignment" do - @uri.path = "/newpath/to/resource" - expect(@uri.path).to eq("/newpath/to/resource") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/newpath/to/resource?query=x#fragment" - ) - end - - it "should have the correct scheme and authority after nil assignment" do - @uri.site = nil - expect(@uri.scheme).to eq(nil) - expect(@uri.authority).to eq(nil) - expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment") - end - - it "should have the correct scheme and authority after assignment" do - @uri.site = "file://" - expect(@uri.scheme).to eq("file") - expect(@uri.authority).to eq("") - expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment") - end - - it "should have the correct path after nil assignment" do - @uri.path = nil - expect(@uri.path).to eq("") - expect(@uri.to_s).to eq( - "http://user:pass@example.com?query=x#fragment" - ) - end - - it "should have the correct query string after assignment" do - @uri.query = "newquery=x" - expect(@uri.query).to eq("newquery=x") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?newquery=x#fragment" - ) - @uri.query = nil - expect(@uri.query).to eq(nil) - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource#fragment" - ) - end - - it "should have the correct query string after hash assignment" do - @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"} - expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign") - expect(@uri.query.split("&")).to include("hello=g%C3%BCnther") - expect(@uri.query_values).to eq({ - "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther" - }) - end - - it "should have the correct query string after flag hash assignment" do - @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil} - expect(@uri.query.split("&")).to include("flag%3F1") - expect(@uri.query.split("&")).to include("fl%3Dag2") - expect(@uri.query.split("&")).to include("flag3") - expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]]) - expect(@uri.query_values(Hash)).to eq({ - 'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil - }) - end - - it "should raise an error if query values are set to a bogus type" do - expect(lambda do - @uri.query_values = "bogus" - end).to raise_error(TypeError) - end - - it "should have the correct fragment after assignment" do - @uri.fragment = "newfragment" - expect(@uri.fragment).to eq("newfragment") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#newfragment" - ) - - @uri.fragment = nil - expect(@uri.fragment).to eq(nil) - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:fragment => "newfragment").to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#newfragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:fragment => nil).to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq( - "http://newuser:newpass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:userinfo => nil).to_s).to eq( - "http://example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:path => "newpath").to_s).to eq( - "http://user:pass@example.com/newpath?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq( - "http://user:pass@example.com:42/newpath?#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq( - "http://foo:bar@baz:42/path/to/resource?query=x#fragment" - ) - # Ensure the operation was not destructive - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a destructive merge" do - @uri.merge!(:authority => "foo:bar@baz:42") - # Ensure the operation was destructive - expect(@uri.to_s).to eq( - "http://foo:bar@baz:42/path/to/resource?query=x#fragment" - ) - end - - it "should fail to merge with bogus values" do - expect(lambda do - @uri.merge(:port => "bogus") - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should fail to merge with bogus values" do - expect(lambda do - @uri.merge(:authority => "bar@baz:bogus") - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should fail to merge with bogus parameters" do - expect(lambda do - @uri.merge(42) - end).to raise_error(TypeError) - end - - it "should fail to merge with bogus parameters" do - expect(lambda do - @uri.merge("http://example.com/") - end).to raise_error(TypeError) - end - - it "should fail to merge with both authority and subcomponents" do - expect(lambda do - @uri.merge(:authority => "foo:bar@baz:42", :port => "42") - end).to raise_error(ArgumentError) - end - - it "should fail to merge with both userinfo and subcomponents" do - expect(lambda do - @uri.merge(:userinfo => "foo:bar", :user => "foo") - end).to raise_error(ArgumentError) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/search?q=Q%26A'" do - - before do - @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A") - end - - it "should have a query of 'q=Q%26A'" do - expect(@uri.query).to eq("q=Q%26A") - end - - it "should have query_values of {'q' => 'Q&A'}" do - expect(@uri.query_values).to eq({ 'q' => 'Q&A' }) - end - - it "should normalize to the original uri " + - "(with the ampersand properly percent-encoded)" do - expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?&x=b") - end - - it "should have a query of '&x=b'" do - expect(@uri.query).to eq("&x=b") - end - - it "should have query_values of {'x' => 'b'}" do - expect(@uri.query_values).to eq({'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q='one;two'&x=1'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1") - end - - it "should have a query of 'q='one;two'&x=1'" do - expect(@uri.query).to eq("q='one;two'&x=1") - end - - it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do - expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"}) - end - - it "should escape the ';' character when normalizing to avoid ambiguity " + - "with the W3C HTML 4.01 specification" do - # HTML 4.01 Section B.2.2 - expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?&&x=b") - end - - it "should have a query of '&&x=b'" do - expect(@uri.query).to eq("&&x=b") - end - - it "should have query_values of {'x' => 'b'}" do - expect(@uri.query_values).to eq({'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b") - end - - it "should have a query of 'q=a&&x=b'" do - expect(@uri.query).to eq("q=a&&x=b") - end - - it "should have query_values of {'q' => 'a, 'x' => 'b'}" do - expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q&&x=b") - end - - it "should have a query of 'q&&x=b'" do - expect(@uri.query).to eq("q&&x=b") - end - - it "should have query_values of {'q' => true, 'x' => 'b'}" do - expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a+b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a+b") - end - - it "should have a query of 'q=a+b'" do - expect(@uri.query).to eq("q=a+b") - end - - it "should have query_values of {'q' => 'a b'}" do - expect(@uri.query_values).to eq({'q' => 'a b'}) - end - - it "should have a normalized query of 'q=a+b'" do - expect(@uri.normalized_query).to eq("q=a+b") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a%2bb'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a%2bb") - end - - it "should have a query of 'q=a+b'" do - expect(@uri.query).to eq("q=a%2bb") - end - - it "should have query_values of {'q' => 'a+b'}" do - expect(@uri.query_values).to eq({'q' => 'a+b'}) - end - - it "should have a normalized query of 'q=a%2Bb'" do - expect(@uri.normalized_query).to eq("q=a%2Bb") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do - before do - @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7") - end - - it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do - expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do - before do - @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7") - end - - it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do - expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/sound%2bvision'" do - before do - @uri = Addressable::URI.parse("http://example.com/sound%2bvision") - end - - it "should have a normalized path of '/sound+vision'" do - expect(@uri.normalized_path).to eq('/sound+vision') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q='" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=") - end - - it "should have a query of 'q='" do - expect(@uri.query).to eq("q=") - end - - it "should have query_values of {'q' => ''}" do - expect(@uri.query_values).to eq({'q' => ''}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user@example.com'" do - before do - @uri = Addressable::URI.parse("http://user@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should have a userinfo of 'user'" do - expect(@uri.userinfo).to eq("user") - end - - it "should have a normalized userinfo of 'user'" do - expect(@uri.normalized_userinfo).to eq("user") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have default_port 80" do - expect(@uri.default_port).to eq(80) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.to_s).to eq("http://user:newpass@example.com") - end - - it "should have the correct userinfo segment after assignment" do - @uri.userinfo = "newuser:newpass" - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser:newpass@example.com") - end - - it "should have the correct userinfo segment after nil assignment" do - @uri.userinfo = nil - expect(@uri.userinfo).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser@example.com" - expect(@uri.authority).to eq("newuser@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should raise an error after nil assignment of authority segment" do - expect(lambda do - # This would create an invalid URI - @uri.authority = nil - end).to raise_error - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user:@example.com'" do - before do - @uri = Addressable::URI.parse("http://user:@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have a password of ''" do - expect(@uri.password).to eq("") - end - - it "should have a normalized userinfo of 'user:'" do - expect(@uri.normalized_userinfo).to eq("user:") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.to_s).to eq("http://user:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser:@example.com" - expect(@uri.authority).to eq("newuser:@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser:@example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:pass@example.com'" do - before do - @uri = Addressable::URI.parse("http://:pass@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of ''" do - expect(@uri.user).to eq("") - end - - it "should have a password of 'pass'" do - expect(@uri.password).to eq("pass") - end - - it "should have a userinfo of ':pass'" do - expect(@uri.userinfo).to eq(":pass") - end - - it "should have a normalized userinfo of ':pass'" do - expect(@uri.normalized_userinfo).to eq(":pass") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("pass") - expect(@uri.to_s).to eq("http://newuser:pass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = ":newpass@example.com" - expect(@uri.authority).to eq(":newpass@example.com") - expect(@uri.user).to eq("") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://:newpass@example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:@example.com'" do - before do - @uri = Addressable::URI.parse("http://:@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of ''" do - expect(@uri.user).to eq("") - end - - it "should have a password of ''" do - expect(@uri.password).to eq("") - end - - it "should have a normalized userinfo of nil" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = ":@newexample.com" - expect(@uri.authority).to eq(":@newexample.com") - expect(@uri.user).to eq("") - expect(@uri.password).to eq("") - expect(@uri.host).to eq("newexample.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://:@newexample.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'#example'" do - before do - @uri = Addressable::URI.parse("#example") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have a host of nil" do - expect(@uri.host).to eq(nil) - end - - it "should have a site of nil" do - expect(@uri.site).to eq(nil) - end - - it "should have a normalized_site of nil" do - expect(@uri.normalized_site).to eq(nil) - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should have a query string of nil" do - expect(@uri.query).to eq(nil) - end - - it "should have a fragment of 'example'" do - expect(@uri.fragment).to eq("example") - end -end - -describe Addressable::URI, "when parsed from " + - "the network-path reference '//example.com/'" do - before do - @uri = Addressable::URI.parse("//example.com/") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should raise an error if routing is attempted" do - expect(lambda do - @uri.route_to("http://example.com/") - end).to raise_error(ArgumentError, /\/\/example.com\//) - expect(lambda do - @uri.route_from("http://example.com/") - end).to raise_error(ArgumentError, /\/\/example.com\//) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'feed://http://example.com/'" do - before do - @uri = Addressable::URI.parse("feed://http://example.com/") - end - - it "should have a host of 'http'" do - expect(@uri.host).to eq("http") - end - - it "should have a path of '//example.com/'" do - expect(@uri.path).to eq("//example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'feed:http://example.com/'" do - before do - @uri = Addressable::URI.parse("feed:http://example.com/") - end - - it "should have a path of 'http://example.com/'" do - expect(@uri.path).to eq("http://example.com/") - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - expect(@uri.normalize!.to_s).to eq("http://example.com/") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'example://a/b/c/%7Bfoo%7D'" do - before do - @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D") - end - - # Section 6.2.2 of RFC 3986 - it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do - expect(@uri).to eq( - Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d") - ) - end - - it "should have an origin of 'example://a'" do - expect(@uri.origin).to eq('example://a') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/indirect/path/./to/../resource/'" do - before do - @uri = Addressable::URI.parse( - "http://example.com/indirect/path/./to/../resource/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/indirect/path/./to/../resource/'" do - expect(@uri.path).to eq("/indirect/path/./to/../resource/") - end - - # Section 6.2.2.3 of RFC 3986 - it "should have a normalized path of '/indirect/path/resource/'" do - expect(@uri.normalize.path).to eq("/indirect/path/resource/") - expect(@uri.normalize!.path).to eq("/indirect/path/resource/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://under_score.example.com/'" do - it "should not cause an error" do - expect(lambda do - Addressable::URI.parse("http://under_score.example.com/") - end).not_to raise_error - end -end - -describe Addressable::URI, "when parsed from " + - "'./this:that'" do - before do - @uri = Addressable::URI.parse("./this:that") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have no scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'this:that'" do - before do - @uri = Addressable::URI.parse("this:that") - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should have a scheme of 'this'" do - expect(@uri.scheme).to eq("this") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?'" do - before do - @uri = Addressable::URI.parse("?") - end - - it "should normalize to ''" do - expect(@uri.normalize.to_s).to eq("") - end - - it "should have the correct return type" do - expect(@uri.query_values).to eq({}) - expect(@uri.query_values(Hash)).to eq({}) - expect(@uri.query_values(Array)).to eq([]) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do - before do - @uri = Addressable::URI.parse("?one=1&two=2&three=3") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"}) - end - - it "should raise an error for invalid return type values" do - expect(lambda do - @uri.query_values(Fixnum) - end).to raise_error(ArgumentError) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one", "1"], ["two", "2"], ["three", "3"] - ]) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do - before do - @uri = Addressable::URI.parse("?one=1=uno&two=2=dos") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"}) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one", "1=uno"], ["two", "2=dos"] - ]) - end -end - -describe Addressable::URI, "when parsed from '?one[two][three]=four'" do - before do - @uri = Addressable::URI.parse("?one[two][three]=four") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one[two][three]" => "four"}) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three]", "four"] - ]) - end -end - -describe Addressable::URI, "when parsed from '?one.two.three=four'" do - before do - @uri = Addressable::URI.parse("?one.two.three=four") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one.two.three" => "four" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one.two.three", "four"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three]=four&one[two][five]=six'" do - before do - @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three]" => "four", "one[two][five]" => "six" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three]", "four"], ["one[two][five]", "six"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one.two.three=four&one.two.five=six'" do - before do - @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one.two.three" => "four", "one.two.five" => "six" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one.two.three", "four"], ["one.two.five", "six"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one=two&one=three'" do - before do - @uri = Addressable::URI.parse( - "?one=two&one=three&one=four" - ) - end - - it "should have correct array query values" do - expect(@uri.query_values(Array)).to eq( - [['one', 'two'], ['one', 'three'], ['one', 'four']] - ) - end - - it "should have correct hash query values" do - skip("This is probably more desirable behavior.") - expect(@uri.query_values(Hash)).to eq( - {'one' => ['two', 'three', 'four']} - ) - end - - it "should handle assignment with keys of mixed type" do - @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'}) - expect(@uri.query_values(Hash)).to eq({'one' => 'three'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][]=four&one[two][three][]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][]=four&one[two][three][]=five" - ) - end - - it "should have correct query values" do - expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"}) - end - - it "should have correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three][]", "four"], ["one[two][three][]", "five"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][0]=four&one[two][three][1]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][0]=four&one[two][three][1]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][0]" => "four", "one[two][three][1]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][1]=four&one[two][three][0]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][1]=four&one[two][three][0]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][1]" => "four", "one[two][three][0]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][2]=four&one[two][three][1]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][2]=four&one[two][three][1]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][2]" => "four", "one[two][three][1]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/") - end - - it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do - expect(@uri).to eq( - Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") - ) - end - - it "should not have domain name encoded during normalization" do - expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( - "http://www.詹姆斯.com/" - ) - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/ some spaces /'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /") - end - - it "should be equivalent to " + - "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do - expect(@uri).to eq( - Addressable::URI.parse( - "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/") - ) - end - - it "should not have domain name encoded during normalization" do - expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( - "http://www.詹姆斯.com/%20some%20spaces%20/" - ) - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.xn--8ws00zhy3a.com/'" do - before do - @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") - end - - it "should be displayed as http://www.詹姆斯.com/" do - expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/") - end - - it "should properly force the encoding" do - display_string = @uri.display_uri.to_str - expect(display_string).to eq("http://www.詹姆斯.com/") - if display_string.respond_to?(:encoding) - expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s) - end - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html") - end - - it "should normalize to " + - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do - expect(@uri.normalize.to_s).to eq( - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" - ) - expect(@uri.normalize!.to_s).to eq( - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" - ) - end -end - -describe Addressable::URI, "when parsed from a percent-encoded IRI" do - before do - @uri = Addressable::URI.parse( - "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" + - "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" + - "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" + - "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" + - "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" + - "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp" - ) - end - - it "should normalize to something sane" do - expect(@uri.normalize.to_s).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" - ) - expect(@uri.normalize!.to_s).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" - ) - end - - it "should have the correct origin" do - expect(@uri.origin).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" - ) - end -end - -describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do - before do - @uri = Addressable::URI.parse("http://a/b/c/d;p?q") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g:h' should resolve to g:h" do - expect((@uri + "g:h").to_s).to eq("g:h") - expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g' should resolve to http://a/b/c/g" do - expect((@uri + "g").to_s).to eq("http://a/b/c/g") - expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with './g' should resolve to http://a/b/c/g" do - expect((@uri + "./g").to_s).to eq("http://a/b/c/g") - expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g/' should resolve to http://a/b/c/g/" do - expect((@uri + "g/").to_s).to eq("http://a/b/c/g/") - expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '/g' should resolve to http://a/g" do - expect((@uri + "/g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '//g' should resolve to http://g" do - expect((@uri + "//g").to_s).to eq("http://g") - expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do - expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y") - expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do - expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y") - expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do - expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s") - expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq( - "http://a/b/c/d;p?q#s" - ) - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do - expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s") - expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do - expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s") - expect(Addressable::URI.join( - @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with ';x' should resolve to http://a/b/c/;x" do - expect((@uri + ";x").to_s).to eq("http://a/b/c/;x") - expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do - expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x") - expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do - expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") - expect(Addressable::URI.join( - @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '' should resolve to http://a/b/c/d;p?q" do - expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q") - expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '.' should resolve to http://a/b/c/" do - expect((@uri + ".").to_s).to eq("http://a/b/c/") - expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with './' should resolve to http://a/b/c/" do - expect((@uri + "./").to_s).to eq("http://a/b/c/") - expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '..' should resolve to http://a/b/" do - expect((@uri + "..").to_s).to eq("http://a/b/") - expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../' should resolve to http://a/b/" do - expect((@uri + "../").to_s).to eq("http://a/b/") - expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../g' should resolve to http://a/b/g" do - expect((@uri + "../g").to_s).to eq("http://a/b/g") - expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../..' should resolve to http://a/" do - expect((@uri + "../..").to_s).to eq("http://a/") - expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../../' should resolve to http://a/" do - expect((@uri + "../../").to_s).to eq("http://a/") - expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../../g' should resolve to http://a/g" do - expect((@uri + "../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '../../../g' should resolve to http://a/g" do - expect((@uri + "../../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g") - end - - it "when joined with '../.././../g' should resolve to http://a/g" do - expect((@uri + "../.././../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq( - "http://a/g" - ) - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '../../../../g' should resolve to http://a/g" do - expect((@uri + "../../../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join( - @uri.to_s, "../../../../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '/./g' should resolve to http://a/g" do - expect((@uri + "/./g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '/../g' should resolve to http://a/g" do - expect((@uri + "/../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g.' should resolve to http://a/b/c/g." do - expect((@uri + "g.").to_s).to eq("http://a/b/c/g.") - expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '.g' should resolve to http://a/b/c/.g" do - expect((@uri + ".g").to_s).to eq("http://a/b/c/.g") - expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g..' should resolve to http://a/b/c/g.." do - expect((@uri + "g..").to_s).to eq("http://a/b/c/g..") - expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '..g' should resolve to http://a/b/c/..g" do - expect((@uri + "..g").to_s).to eq("http://a/b/c/..g") - expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with './../g' should resolve to http://a/b/g" do - expect((@uri + "./../g").to_s).to eq("http://a/b/g") - expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with './g/.' should resolve to http://a/b/c/g/" do - expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/") - expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do - expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h") - expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g/../h' should resolve to http://a/b/c/h" do - expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h") - expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g;x=1/./y' " + - "should resolve to http://a/b/c/g;x=1/y" do - expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") - expect(Addressable::URI.join( - @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do - expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y") - expect(Addressable::URI.join( - @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g?y/./x' " + - "should resolve to http://a/b/c/g?y/./x" do - expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") - expect(Addressable::URI.join( - @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g?y/../x' " + - "should resolve to http://a/b/c/g?y/../x" do - expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") - expect(Addressable::URI.join( - @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g#s/./x' " + - "should resolve to http://a/b/c/g#s/./x" do - expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") - expect(Addressable::URI.join( - @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g#s/../x' " + - "should resolve to http://a/b/c/g#s/../x" do - expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") - expect(Addressable::URI.join( - @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'http:g' should resolve to http:g" do - expect((@uri + "http:g").to_s).to eq("http:g") - expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g") - end - - # Edge case to be sure - it "when joined with '//example.com/' should " + - "resolve to http://example.com/" do - expect((@uri + "//example.com/").to_s).to eq("http://example.com/") - expect(Addressable::URI.join( - @uri.to_s, "//example.com/").to_s).to eq("http://example.com/") - end - - it "when joined with a bogus object a TypeError should be raised" do - expect(lambda do - Addressable::URI.join(@uri, 42) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when converting the path " + - "'relative/path/to/something'" do - before do - @path = 'relative/path/to/something' - end - - it "should convert to " + - "\'relative/path/to/something\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("relative/path/to/something") - end - - it "should join with an absolute file path correctly" do - @base = Addressable::URI.convert_path("/absolute/path/") - @uri = Addressable::URI.convert_path(@path) - expect((@base + @uri).to_str).to eq( - "file:///absolute/path/relative/path/to/something" - ) - end -end - -describe Addressable::URI, "when converting a bogus path" do - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.convert_path(42) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when given a UNIX root directory" do - before do - @path = "/" - end - - it "should convert to \'file:///\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given a Windows root directory" do - before do - @path = "C:\\" - end - - it "should convert to \'file:///c:/\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path '/one/two/'" do - before do - @path = '/one/two/' - end - - it "should convert to " + - "\'file:///one/two/\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///one/two/") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file://c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file:c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do - before do - @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given an http protocol URI" do - before do - @path = "http://example.com/" - end - - it "should not do any conversion at all" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("http://example.com/") - end -end - -class SuperString - def initialize(string) - @string = string.to_s - end - - def to_str - return @string - end -end - -describe Addressable::URI, "when parsing a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.parse(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.parse(42) - end).to raise_error(TypeError) - end - - it "should correctly parse heuristically anything with a 'to_str' method" do - Addressable::URI.heuristic_parse(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.heuristic_parse(42) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when form encoding a hash" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - [["&one", "/1"], ["=two", "?2"], [":three", "#3"]] - )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"q" => "one two three"} - )).to eq("q=one+two+three") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"key" => nil} - )).to eq("key=") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"q" => ["one", "two", "three"]} - )).to eq("q=one&q=two&q=three") - end - - it "should result in correctly encoded newlines" do - expect(Addressable::URI.form_encode( - {"text" => "one\ntwo\rthree\r\nfour\n\r"} - )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A") - end - - it "should result in a sorted percent encoded sequence" do - expect(Addressable::URI.form_encode( - [["a", "1"], ["dup", "3"], ["dup", "2"]], true - )).to eq("a=1&dup=2&dup=3") - end -end - -describe Addressable::URI, "when form encoding a non-Array object" do - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.form_encode(42) - end).to raise_error(TypeError) - end -end - -# See https://tools.ietf.org/html/rfc6749#appendix-B -describe Addressable::URI, "when form encoding the example value from OAuth 2" do - it "should result in correct values" do - expect(Addressable::URI.form_encode( - {"value" => " %&+£€"} - )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC") - end -end - -# See https://tools.ietf.org/html/rfc6749#appendix-B -describe Addressable::URI, "when form unencoding the example value from OAuth 2" do - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "value=+%25%26%2B%C2%A3%E2%82%AC" - )).to eq([["value", " %&+£€"]]) - end -end - -describe Addressable::URI, "when form unencoding a string" do - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233" - )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "q=one+two+three" - )).to eq([["q", "one two three"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A" - )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "a=1&dup=2&dup=3" - )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "key" - )).to eq([["key", nil]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq( - [["GivenName", "René"]] - ) - end -end - -describe Addressable::URI, "when form unencoding a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.form_unencode(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.form_unencode(42) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when normalizing a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.normalize_component(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.normalize_component(42) - end).to raise_error(TypeError) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect(lambda do - Addressable::URI.normalize_component("component", 42) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when normalizing a path with an encoded slash" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq( - "/path%2Fsegment/" - ) - end -end - -describe Addressable::URI, "when normalizing a partially encoded string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "partially % encoded%21" - )).to eq("partially%20%25%20encoded!") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "partially %25 encoded!" - )).to eq("partially%20%25%20encoded!") - end -end - -describe Addressable::URI, "when normalizing a unicode sequence" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "/C%CC%A7" - )).to eq("/%C3%87") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "/%C3%87" - )).to eq("/%C3%87") - end -end - -describe Addressable::URI, "when normalizing a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("günther")).to eq( - "g%C3%BCnther" - ) - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq( - "g%C3%BCnther" - ) - end -end - -describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq( - "XX%59Y%5A%5A" - ) - end - - it "should not modify the character class" do - character_class = "0-9a-zXY" - - character_class_copy = character_class.dup - - Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y") - - expect(character_class).to eq(character_class_copy) - end -end - -describe Addressable::URI, "when encoding a string with existing encodings to upcase" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C") - end -end - -describe Addressable::URI, "when encoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component( - "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ - )).to eq("g%C3%BCnther") - end -end - -describe Addressable::URI, "when form encoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq( - "GivenName=Ren%C3%A9" - ) - end -end - -describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component( - "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ - )).to eq("one%0Atwo") - end -end - -describe Addressable::URI, "when unencoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther") - end - - it "should consistently use UTF-8 internally" do - expect(Addressable::URI.unencode_component("ski=%BA%DAɫ")).to eq("ski=\xBA\xDAɫ") - end - - it "should result in correct percent encoded sequence as a URI" do - expect(Addressable::URI.unencode( - "/path?g%C3%BCnther", ::Addressable::URI - )).to eq(Addressable::URI.new( - :path => "/path", :query => "günther" - )) - end -end - -describe Addressable::URI, "when partially unencoding a string" do - it "should unencode all characters by default" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++') - end - - it "should unencode characters not in leave_encoded" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++') - end - - it "should leave characters in leave_encoded alone" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b') - end -end - -describe Addressable::URI, "when unencoding a bogus object" do - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.unencode_component(42) - end).to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.unencode("/path?g%C3%BCnther", Integer) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when encoding a bogus object" do - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.encode(Object.new) - end).to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.normalized_encode(Object.new) - end).to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.encode_component("günther", Object.new) - end).to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect(lambda do - Addressable::URI.encode_component(Object.new) - end).to raise_error(TypeError) - end -end - -describe Addressable::URI, "when given the input " + - "'http://example.com/'" do - before do - @input = "http://example.com/" - end - - it "should heuristically parse to 'http://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should not raise error when frozen" do - expect(lambda do - Addressable::URI.heuristic_parse(@input).freeze.to_s - end).not_to raise_error - end -end - -describe Addressable::URI, "when given the input " + - "'https://example.com/'" do - before do - @input = "https://example.com/" - end - - it "should heuristically parse to 'https://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("https://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http:example.com/'" do - before do - @input = "http:example.com/" - end - - it "should heuristically parse to 'http://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should heuristically parse to 'http://example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'https:example.com/'" do - before do - @input = "https:example.com/" - end - - it "should heuristically parse to 'https://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("https://example.com/") - end - - it "should heuristically parse to 'https://example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("https://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://example.com/example.com/'" do - before do - @input = "http://example.com/example.com/" - end - - it "should heuristically parse to 'http://example.com/example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix\\.example.com/'" do - before do - @input = "http://prefix\\.example.com/" - end - - it "should heuristically parse to 'http://prefix/.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix") - expect(@uri.to_s).to eq("http://prefix/.example.com/") - end - - it "should heuristically parse to 'http://prefix/.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix/.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p:\\/'" do - before do - @input = "http://p:\\/" - end - - it "should heuristically parse to 'http://p//'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//") - end - - it "should heuristically parse to 'http://p//' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p://'" do - before do - @input = "http://p://" - end - - it "should heuristically parse to 'http://p//'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//") - end - - it "should heuristically parse to 'http://p//' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p://p'" do - before do - @input = "http://p://p" - end - - it "should heuristically parse to 'http://p//p'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//p") - end - - it "should heuristically parse to 'http://p//p' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//p") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix .example.com/'" do - before do - @input = "http://prefix .example.com/" - end - - # Justification here being that no browser actually tries to resolve this. - # They all treat this as a web search. - it "should heuristically parse to 'http://prefix%20.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix%20.example.com") - expect(@uri.to_s).to eq("http://prefix%20.example.com/") - end - - it "should heuristically parse to 'http://prefix%20.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix%20.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "' http://www.example.com/ '" do - before do - @input = " http://www.example.com/ " - end - - it "should heuristically parse to 'http://prefix%20.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.scheme).to eq("http") - expect(@uri.path).to eq("/") - expect(@uri.to_s).to eq("http://www.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix%2F.example.com/'" do - before do - @input = "http://prefix%2F.example.com/" - end - - it "should heuristically parse to 'http://prefix%2F.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix%2F.example.com") - expect(@uri.to_s).to eq("http://prefix%2F.example.com/") - end - - it "should heuristically parse to 'http://prefix%2F.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix%2F.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'/path/to/resource'" do - before do - @input = "/path/to/resource" - end - - it "should heuristically parse to '/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'relative/path/to/resource'" do - before do - @input = "relative/path/to/resource" - end - - it "should heuristically parse to 'relative/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("relative/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com'" do - before do - @input = "example.com" - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com' and a scheme hint of 'ftp'" do - before do - @input = "example.com" - @hints = {:scheme => 'ftp'} - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input, @hints) - expect(@uri.to_s).to eq("ftp://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com:21' and a scheme hint of 'ftp'" do - before do - @input = "example.com:21" - @hints = {:scheme => 'ftp'} - end - - it "should heuristically parse to 'http://example.com:21'" do - @uri = Addressable::URI.heuristic_parse(@input, @hints) - expect(@uri.to_s).to eq("ftp://example.com:21") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com/path/to/resource'" do - before do - @input = "example.com/path/to/resource" - end - - it "should heuristically parse to 'http://example.com/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'http:///example.com'" do - before do - @input = "http:///example.com" - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'feed:///example.com'" do - before do - @input = "feed:///example.com" - end - - it "should heuristically parse to 'feed://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("feed://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'file://path/to/resource/'" do - before do - @input = "file://path/to/resource/" - end - - it "should heuristically parse to 'file:///path/to/resource/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("file:///path/to/resource/") - end -end - -describe Addressable::URI, "when given the input " + - "'feed://http://example.com'" do - before do - @input = "feed://http://example.com" - end - - it "should heuristically parse to 'feed:http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("feed:http://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "::URI.parse('http://example.com')" do - before do - @input = ::URI.parse('http://example.com') - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when assigning query values" do - before do - @uri = Addressable::URI.new - end - - it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do - @uri.query_values = {:a => "a", :b => ["c", "d", "e"]} - expect(@uri.query).to eq("a=a&b=c&b=d&b=e") - end - - it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do - expect(lambda do - @uri.query_values = { 'a' => {'b' => ['c'] } } - end).to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:b => '2', :a => {:c => '1'}}" do - expect(lambda do - @uri.query_values = {:b => '2', :a => {:c => '1'}} - end).to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " + - "{:e => 'e', :f => 'f'}]}" do - expect(lambda do - @uri.query_values = { - :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}] - } - end).to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => [{:c => true, :d => 'd'}, " + - "{:e => 'e', :f => 'f'}]}" do - expect(lambda do - @uri.query_values = { - :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}] - } - end).to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => {:c => true, :d => 'd'}}" do - expect(lambda do - @uri.query_values = { - :a => 'a', :b => {:c => true, :d => 'd'} - } - end).to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => {:c => true, :d => 'd'}}" do - expect(lambda do - @uri.query_values = { - :a => 'a', :b => {:c => true, :d => 'd'} - } - end).to raise_error(TypeError) - end - - it "should correctly assign {:a => 1, :b => 1.5}" do - @uri.query_values = { :a => 1, :b => 1.5 } - expect(@uri.query).to eq("a=1&b=1.5") - end - - it "should raise an error attempting to assign " + - "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " + - ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do - expect(lambda do - @uri.query_values = { - :z => 1, - :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ], - :a => { :b => ['c', 'd'], :e => true, :y => 0.5 } - } - end).to raise_error(TypeError) - end - - it "should correctly assign {}" do - @uri.query_values = {} - expect(@uri.query).to eq('') - end - - it "should correctly assign nil" do - @uri.query_values = nil - expect(@uri.query).to eq(nil) - end - - it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do - @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'} - expect(@uri.query).to eq("a=x&ab=a&ab=c") - end - - it "should correctly assign " + - "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do - # Order can be guaranteed in this format, so preserve it. - @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']] - expect(@uri.query).to eq("b=c&b=a&a=a") - end - - it "should preserve query string order" do - query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&") - @uri.query = query_string - original_uri = @uri.to_s - @uri.query_values = @uri.query_values(Array) - expect(@uri.to_s).to eq(original_uri) - end - - describe 'when a hash with mixed types is assigned to query_values' do - it 'should not raise an error' do - skip 'Issue #94' - expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error - end - end -end - -describe Addressable::URI, "when assigning path values" do - before do - @uri = Addressable::URI.new - end - - it "should correctly assign paths containing colons" do - @uri.path = "acct:bob@sporkmonger.com" - expect(@uri.path).to eq("acct:bob@sporkmonger.com") - expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com") - expect(lambda { @uri.to_s }).to raise_error( - Addressable::URI::InvalidURIError - ) - end - - it "should correctly assign paths containing colons" do - @uri.path = "/acct:bob@sporkmonger.com" - @uri.authority = "example.com" - expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com") - end - - it "should correctly assign paths containing colons" do - @uri.path = "acct:bob@sporkmonger.com" - @uri.scheme = "something" - expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com") - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect(lambda do - @uri.scheme = "http" - @uri.host = "example.com" - @uri.path = "acct:bob@sporkmonger.com" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect(lambda do - @uri.path = "acct:bob@sporkmonger.com" - @uri.scheme = "http" - @uri.host = "example.com" - end).to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect(lambda do - @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12" - @uri.scheme = "urn" - end).not_to raise_error - end -end - -describe Addressable::URI, "when initializing a subclass of Addressable::URI" do - before do - @uri = Class.new(Addressable::URI).new - end - - it "should have the same class after being parsed" do - expect(@uri.class).to eq(Addressable::URI.parse(@uri).class) - end - - it "should have the same class as its duplicate" do - expect(@uri.class).to eq(@uri.dup.class) - end - - it "should have the same class after being normalized" do - expect(@uri.class).to eq(@uri.normalize.class) - end - - it "should have the same class after being merged" do - expect(@uri.class).to eq(@uri.merge(:path => 'path').class) - end - - it "should have the same class after being joined" do - expect(@uri.class).to eq(@uri.join('path').class) - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb deleted file mode 100644 index 0b538298eca6aa2a440f16eb9997bc0115d46fd3..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'bundler/setup' -require 'rspec/its' - -begin - require 'coveralls' - Coveralls.wear! do - add_filter "spec/" - add_filter "vendor/" - end -rescue LoadError - warn "warning: coveralls gem not found; skipping Coveralls" - require 'simplecov' - SimpleCov.start do - add_filter "spec/" - add_filter "vendor/" - end -end - -RSpec.configure do |config| - config.warnings = true -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake deleted file mode 100644 index 093ce817b932b24c6f29340272c786f9c614f4d7..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake +++ /dev/null @@ -1,2 +0,0 @@ -desc "Remove all build products" -task "clobber" diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake deleted file mode 100644 index b4052c04f7a4e50a1a342c9987fb643abc18c630..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake +++ /dev/null @@ -1,91 +0,0 @@ -require "rubygems/package_task" - -namespace :gem do - GEM_SPEC = Gem::Specification.new do |s| - s.name = PKG_NAME - s.version = PKG_VERSION - s.summary = PKG_SUMMARY - s.description = PKG_DESCRIPTION - - s.files = PKG_FILES.to_a - - s.has_rdoc = true - s.extra_rdoc_files = %w( README.md ) - s.rdoc_options.concat ["--main", "README.md"] - - if !s.respond_to?(:add_development_dependency) - puts "Cannot build Gem with this version of RubyGems." - exit(1) - end - - s.required_ruby_version = '>= 2.0' - - s.add_runtime_dependency 'public_suffix', '>= 2.0.2', '< 4.0' - s.add_development_dependency 'bundler', '~> 1.0' - - s.require_path = "lib" - - s.author = "Bob Aman" - s.email = "bob@sporkmonger.com" - s.homepage = "https://github.com/sporkmonger/addressable" - s.license = "Apache-2.0" - end - - Gem::PackageTask.new(GEM_SPEC) do |p| - p.gem_spec = GEM_SPEC - p.need_tar = true - p.need_zip = true - end - - desc "Generates .gemspec file" - task :gemspec do - spec_string = GEM_SPEC.to_ruby - File.open("#{GEM_SPEC.name}.gemspec", 'w') do |file| - file.write spec_string - end - end - - desc "Show information about the gem" - task :debug do - puts GEM_SPEC.to_ruby - end - - desc "Install the gem" - task :install => ["clobber", "gem:package"] do - sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" - end - - desc "Uninstall the gem" - task :uninstall do - installed_list = Gem.source_index.find_name(PKG_NAME) - if installed_list && - (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) - sh( - "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + - "--ignore-dependencies --executables #{PKG_NAME}" - ) - end - end - - desc "Reinstall the gem" - task :reinstall => [:uninstall, :install] - - desc 'Package for release' - task :release => ["gem:package", "gem:gemspec"] do |t| - v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z' - abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION - pkg = "pkg/#{GEM_SPEC.full_name}" - - changelog = File.open("CHANGELOG.md") { |file| file.read } - - puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}" - Rake::Task["git:tag:create"].invoke - end -end - -desc "Alias to gem:package" -task "gem" => "gem:package" - -task "gem:release" => "gem:gemspec" - -task "clobber" => ["gem:clobber_package"] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake deleted file mode 100644 index 74ec2fd2fbd1947d920e1b9d03d5e506feba73c1..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake +++ /dev/null @@ -1,45 +0,0 @@ -namespace :git do - namespace :tag do - desc "List tags from the Git repository" - task :list do - tags = `git tag -l` - tags.gsub!("\r", "") - tags = tags.split("\n").sort {|a, b| b <=> a } - puts tags.join("\n") - end - - desc "Create a new tag in the Git repository" - task :create do - changelog = File.open("CHANGELOG.md", "r") { |file| file.read } - puts "-" * 80 - puts changelog - puts "-" * 80 - puts - - v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" - abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION - - git_status = `git status` - if git_status !~ /^nothing to commit/ - abort "Working directory isn't clean." - end - - tag = "#{PKG_NAME}-#{PKG_VERSION}" - msg = "Release #{PKG_NAME}-#{PKG_VERSION}" - - existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n') - if existing_tags.include?(tag) - warn("Tag already exists, deleting...") - unless system "git tag -d #{tag}" - abort "Tag deletion failed." - end - end - puts "Creating git tag '#{tag}'..." - unless system "git tag -a -m \"#{msg}\" #{tag}" - abort "Tag creation failed." - end - end - end -end - -task "gem:release" => "git:tag:create" diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake deleted file mode 100644 index 41fc5c2b98ed8b99d3eb191e813d6686ae292629..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake +++ /dev/null @@ -1,22 +0,0 @@ -namespace :metrics do - task :lines do - lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 - for file_name in FileList["lib/**/*.rb"] - f = File.open(file_name) - while line = f.gets - lines += 1 - next if line =~ /^\s*$/ - next if line =~ /^\s*#/ - codelines += 1 - end - puts "L: #{sprintf("%4d", lines)}, " + - "LOC #{sprintf("%4d", codelines)} | #{file_name}" - total_lines += lines - total_codelines += codelines - - lines, codelines = 0, 0 - end - - puts "Total: Lines #{total_lines}, LOC #{total_codelines}" - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake deleted file mode 100644 index e74a6c8d4182906dad590771544de00c8fd7f7a5..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake +++ /dev/null @@ -1,21 +0,0 @@ -require "rspec/core/rake_task" - -namespace :spec do - RSpec::Core::RakeTask.new(:simplecov) do |t| - t.pattern = FileList['spec/**/*_spec.rb'] - t.rspec_opts = ['--color', '--format', 'documentation'] - end - - namespace :simplecov do - desc "Browse the code coverage report." - task :browse => "spec:simplecov" do - require "launchy" - Launchy.open("coverage/index.html") - end - end -end - -desc "Alias to spec:simplecov" -task "spec" => "spec:simplecov" - -task "clobber" => ["spec:clobber_simplecov"] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake deleted file mode 100644 index 68e449100c763347e8adc0d20cbf92be52c26386..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake +++ /dev/null @@ -1,27 +0,0 @@ -require "rake" - -begin - require "yard" - require "yard/rake/yardoc_task" - - namespace :doc do - desc "Generate Yardoc documentation" - YARD::Rake::YardocTask.new do |yardoc| - yardoc.name = "yard" - yardoc.options = ["--verbose", "--markup", "markdown"] - yardoc.files = FileList[ - "lib/**/*.rb", "ext/**/*.c", - "README.md", "CHANGELOG.md", "LICENSE.txt" - ].exclude(/idna/) - end - end - - task "clobber" => ["doc:clobber_yard"] - - desc "Alias to doc:yard" - task "doc" => "doc:yard" -rescue LoadError - # If yard isn't available, it's not the end of the world - desc "Alias to doc:rdoc" - task "doc" => "doc:rdoc" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile deleted file mode 100644 index 044fba3b070651d888fa06f9e39388a9b6f4d64f..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -source "https://rubygems.org" -gemspec - -gem "rake" -group :development do - gem "rspec-helpers", :require => false - gem "luna-rspec-formatters", :require => false - gem "pry", :require => false unless ENV[ - "CI" - ] -end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown deleted file mode 100644 index bac427043da7a16d2c8da6f18e032662aa848d17..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown +++ /dev/null @@ -1,25 +0,0 @@ -## 1.1.0 / 2016-06-28 - -### Minor Enhancements - -* Support jruby (#8) - -## 1.0.0 / 2016-04-28 - -### Major enhancements - -- Merge Simple::ANSI and Colorator. (#7) - -### Minor Enhancements - -- Delete unnecessary `Symbol#to_sym` (#2) -- Change argument name of `Enumerator#each` for better code legibility (#3) - -### Development Fixes - -- Convert to new RSpec expectation syntax (#1) -- Fix `String#blue` result in README (#4) - -## 0.1 / 2013-04-13 - -Birthday! diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE deleted file mode 100644 index b3b6be9ae11cc54788f127527527fb0d05549f93..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) Parker Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown deleted file mode 100644 index 9cf886dee40445a8db8154fd6621f4dfda0d0ce5..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown +++ /dev/null @@ -1,47 +0,0 @@ -# colorator - -Colorize your text for the terminal - -[![Build Status](https://travis-ci.org/octopress/colorator.png?branch=master)](https://travis-ci.org/octopress/colorator) - -## Example - -```ruby -"this string".red -# => \e[31mthis string\e[0m -"my string".blue -# => \e[34mmy string\e[0m -# etc... -``` - -## Supported Colors - -- `red` -- `black` -- `green` -- `yellow` -- `magenta` -- `white` -- `blue` -- `cyan` -- `bold` - -## Other supported Ansi methods - -- `clear_line` -- `has_ansi?`, `has_color?` -- `strip_ansi`, `strip_color` -- `reset_ansi`, `reset_color` -- `clear_screen` -- `ansi_jump` - -## Why - -There are a bunch of gems that provide functionality like this, but none have -as simple an API as this. Just call `"string".color` and your text will be -colorized. - -## License - -MIT. Written as a single Ruby file by Brandon Mathis, converted into a gem by -Parker Moore. diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile deleted file mode 100644 index b7e9ed549be37412bd2f7e90f0b33165e3052ceb..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -require "bundler/gem_tasks" -require "rspec/core/rake_task" - -RSpec::Core::RakeTask.new(:spec) - -task :default => :spec diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec deleted file mode 100644 index a4bd0cd04160af082121a7608663695709d2bb2d..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -# coding: utf-8 - -require File.expand_path('lib/colorator.rb', __dir__) - -Gem::Specification.new do |spec| - spec.name = "colorator" - spec.summary = "Colorize your text in the terminal." - spec.version = Colorator::VERSION - spec.authors = ["Parker Moore", "Brandon Mathis"] - spec.email = ["parkrmoore@gmail.com", "brandon@imathis.com"] - spec.homepage = "https://github.com/octopress/colorator" - spec.licenses = ["MIT"] - - all = `git ls-files -z`.split("\x0").reject { |f| f.start_with?(".") } - spec.files = all.select { |f| File.basename(f) == f || f =~ %r{^(bin|lib)/} } - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] - - spec.extra_rdoc_files = ["README.markdown", "LICENSE"] - spec.rdoc_options = ["--charset=UTF-8"] - - spec.add_development_dependency "rspec", "~> 3.1" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb deleted file mode 100644 index 107f6e3a7d499dbb3f08b0b07ab0b86cc2052a25..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb +++ /dev/null @@ -1,111 +0,0 @@ -$:.unshift File.dirname(__FILE__) - -module Colorator - module_function - VERSION = "1.1.0" - - # -------------------------------------------------------------------------- - - ANSI_MATCHR = /\x1b.*?[jkmsuABGKH]/ - ANSI_COLORS = { - :black => 30, - :red => 31, - :green => 32, - :yellow => 33, - :blue => 34, - :magenta => 35, - :cyan => 36, - :white => 37, - :bold => 1 - } - - # -------------------------------------------------------------------------- - # Allows you to check if a string currently has ansi. - # -------------------------------------------------------------------------- - - def has_ansi?(str) - str.match(ANSI_MATCHR).is_a?( - MatchData - ) - end - - # -------------------------------------------------------------------------- - # Jump the cursor, moving it up and then back down to it's spot, allowing - # you to do fancy things like multiple output (downloads) the way that Docker - # does them in an async way without breaking term. - # -------------------------------------------------------------------------- - - def ansi_jump(str, num) - "\x1b[#{num}A#{clear_line(str)}\x1b[#{ - num - }B" - end - - # -------------------------------------------------------------------------- - - def reset_ansi(str = "") - "\x1b[0m#{ - str - }" - end - - # -------------------------------------------------------------------------- - - def clear_line(str = "") - "\x1b[2K\r#{ - str - }" - end - - # -------------------------------------------------------------------------- - # Strip ANSI from the current string, making it just a normal string. - # -------------------------------------------------------------------------- - - def strip_ansi(str) - str.gsub( - ANSI_MATCHR, "" - ) - end - - # -------------------------------------------------------------------------- - # Clear the screen's current view, so the user gets a clean output. - # -------------------------------------------------------------------------- - - def clear_screen(str = "") - "\x1b[H\x1b[2J#{ - str - }" - end - - # -------------------------------------------------------------------------- - - def colorize(str = "", color) - "\x1b[#{color}m#{str}\x1b[0m" - end - - # -------------------------------------------------------------------------- - - Colorator::ANSI_COLORS.each do |color, code| - define_singleton_method color do |str| - colorize( - str, code - ) - end - end - - # -------------------------------------------------------------------------- - - class << self - alias reset_color reset_ansi - alias strip_color strip_ansi - alias has_color? has_ansi? - end - - # -------------------------------------------------------------------------- - - CORE_METHODS = ( - public_methods - Object.methods - ) -end - -require "colorator/core_ext" diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb deleted file mode 100644 index f2e0bf0d9411c664c9bf075664879f70690ac282..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb +++ /dev/null @@ -1,9 +0,0 @@ -class String - Colorator::CORE_METHODS.each do |method| - define_method method do |*args| - Colorator.public_send(method, - self, *args - ) - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore deleted file mode 100644 index 8a552812ad399e58f71bba5b29c684aead91e0b4..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -doc/ -bin/ -.yardoc -*.orig -nbproject/private -pkg -*.orig -*.rej -*.patch -*.diff -build -*.so -*.[oa] -core -lib/ffi/types.conf -lib/ffi_c.bundle -lib/ffi_c.so -vendor -.bundle -Gemfile.lock -types_log -*.gem diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules deleted file mode 100644 index fd11f34a2e13131a17e318800740fbf740eccacd..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "ext/ffi_c/libffi"] - path = ext/ffi_c/libffi - url = https://github.com/libffi/libffi.git diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml deleted file mode 100644 index f2537efb7a9fc8bd4c48eb058922aaea72bc7c0e..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml +++ /dev/null @@ -1,52 +0,0 @@ -dist: trusty -sudo: false -group: beta -language: ruby -before_install: - - gem install bundler -script: - - bundle exec rake compile || bundle exec rake compile - - bundle exec rake test -os: - - linux - - osx -rvm: - - 1.9.3 - - 2.0.0 - - 2.1 - - 2.2.8 - - 2.3.5 - - 2.4.3 - - 2.5.0 - - ruby-head - - rbx - - system -env: - - CC=gcc - - CC=clang -matrix: - allow_failures: - - rvm: system - - os: osx - rvm: 2.0.0 - - os: osx - rvm: ruby-head - - rvm: rbx - - rvm: rbx-head - - rvm: 1.9.3 - exclude: # ruby 2.4.2 needs build with xcode9 or later on osx - - os: osx - rvm: 2.4.2 - include: - - os: osx - osx_image: xcode9.1 - rvm: 2.4.2 - env: - - CC=gcc - - os: osx - osx_image: xcode9.1 - rvm: 2.4.2 - env: - - CC=clang -after_failure: - - "find build -name mkmf.log | xargs cat" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts deleted file mode 100644 index 8ef32b9f34e36ab0bd6569595d1d9ec4f675c2cb..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts +++ /dev/null @@ -1,5 +0,0 @@ ---title "Ruby FFI" ---charset UTF-8 ---private -lib/**/*.rb -ext/**/*.c \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md deleted file mode 100644 index 1fabe5a28557f2fdc2122fad584867c7007b4ab8..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -1.9.25 / 2018-06-03 -------------------- - -Changed: -* Revert closures via libffi. - This re-adds ClosurePool and fixes compat with SELinux enabled systems. #621 - - -1.9.24 / 2018-06-02 -------------------- - -Added: -* Added a CHANGELOG file -* Add mips64(eb) support, and mips r6 support. (#601) - -Changed: -* Update libffi to latest changes on master. -* Don't search in hardcoded /usr paths on Windows. -* Don't treat Symbol args different to Strings in ffi_lib. -* Make sure size_t is defined in Thread.c. Fixes #609 - - -1.9.23 / 2018-02-25 -------------------- - -Changed: -* Fix unnecessary rebuild of configure in darwin multi arch. Fixes #605 - - -1.9.22 / 2018-02-22 -------------------- - -Changed: -* Update libffi to latest changes on master. -* Update detection of system libffi to match new requirements. Fixes #617 -* Prefer bundled libffi over system libffi on Mac OS. -* Do closures via libffi. This removes ClosurePool and fixes compat with PaX. #540 -* Use a more deterministic gem packaging. -* Fix unnecessary update of autoconf files at gem install. - - -1.9.21 / 2018-02-06 -------------------- - -Added: -* Ruby-2.5 support by Windows binary gems. Fixes #598 -* Add missing win64 types. -* Added support for Bitmask. (#573) -* Add support for MSYS2 (#572) and Sparc64 Linux. (#574) - -Changed: -* Fix read_string to not throw an error on length 0. -* Don't use absolute paths for sh and env. Fixes usage on Adroid #528 -* Use Ruby implementation for `which` for better compat with Windows. Fixes #315 -* Fix compatibility with PPC64LE platform. (#577) -* Normalize sparc64 to sparcv9. (#575) - -Removed: -* Drop Ruby 1.8.7 support (#480) - - -1.9.18 / 2017-03-03 -------------------- - -Added: -* Add compatibility with Ruby-2.4. - -Changed: -* Add missing shlwapi.h include to fix Windows build. -* Avoid undefined behaviour of LoadLibrary() on Windows. #553 - - -1.9.17 / 2017-01-13 -------------------- diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING deleted file mode 100644 index 76223189f706c66b14382ac0c8d237b0572198b5..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING +++ /dev/null @@ -1,49 +0,0 @@ -Copyright (c) 2008-2013, Ruby FFI project contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Ruby FFI project nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -libffi, used by this project, is licensed under the MIT license: - -libffi - Copyright (c) 1996-2011 Anthony Green, Red Hat, Inc and others. -See source files for details. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile deleted file mode 100644 index bb6c30abc36ed0fd6f707aa860cb36751289e68d..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile +++ /dev/null @@ -1,15 +0,0 @@ -source 'https://rubygems.org' - -group :development do - gem 'rake', '~> 10.1' - gem 'rake-compiler', '~> 1.0.3' - gem 'rake-compiler-dock', '~> 0.6.2' - gem 'rspec', '~> 3.0' - gem 'rubygems-tasks', '~> 0.2.4', :require => 'rubygems/tasks' - gem "rubysl", "~> 2.0", :platforms => 'rbx' -end - -group :doc do - gem 'kramdown' - gem 'yard', '~> 0.9' -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE deleted file mode 100644 index 20185fd4f5d90efeedc7aa99cc72c5b019b01a85..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2008-2016, Ruby FFI project contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Ruby FFI project nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS deleted file mode 100644 index 5c9ffcee31b6b6fa8ed69c529df9cd815ae48a08..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2008-2012 Ruby-FFI contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md deleted file mode 100644 index be3053c7e83226627b8cb43c3530652f6bdb6008..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# ruby-ffi https://wiki.github.com/ffi/ffi [![Build Status](https://travis-ci.org/ffi/ffi.png?branch=master)](https://travis-ci.org/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master) - -## Description - -Ruby-FFI is a ruby extension for programmatically loading dynamic -libraries, binding functions within them, and calling those functions -from Ruby code. Moreover, a Ruby-FFI extension works without changes -on Ruby and JRuby. [Discover why you should write your next extension -using Ruby-FFI](https://wiki.github.com/ffi/ffi/why-use-ffi). - -## Features/problems - -* Intuitive DSL -* Supports all C native types -* C structs (also nested), enums and global variables -* Callbacks from C to ruby -* Automatic garbage collection of native memory - -## Synopsis - -```ruby -require 'ffi' - -module MyLib - extend FFI::Library - ffi_lib 'c' - attach_function :puts, [ :string ], :int -end - -MyLib.puts 'Hello, World using libc!' -``` - -For less minimalistic and more sane examples you may look at: - -* the samples/ folder -* the examples on the [wiki](https://wiki.github.com/ffi/ffi) -* the projects using FFI listed on this page (https://wiki.github.com/ffi/ffi/projects-using-ffi) - -## Requirements - -You need a sane building environment in order to compile the extension. -At a minimum, you will need: -* A C compiler (e.g. Xcode on OSX, gcc on everything else) -* libffi development library - this is commonly in the libffi-dev or libffi-devel - -On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.) FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found. - -## Installation - -From rubygems: - - [sudo] gem install ffi - -or from the git repository on github: - - git clone git://github.com/ffi/ffi.git - git submodule update --init --recursive - cd ffi - rake install - -## License - -The ffi library is covered by the BSD license, also see the LICENSE file. -The specs are shared with Rubyspec and are licensed by the same license -as Rubyspec, see the LICENSE.SPECS file. - -## Credits - -The following people have submitted code, bug reports, or otherwise contributed to the success of this project: - -* Alban Peignier -* Aman Gupta -* Andrea Fazzi -* Andreas Niederl -* Andrew Cholakian -* Antonio Terceiro -* Brian Candler -* Brian D. Burns -* Bryan Kearney -* Charlie Savage -* Chikanaga Tomoyuki -* Hongli Lai -* Ian MacLeod -* Jake Douglas -* Jean-Dominique Morani -* Jeremy Hinegardner -* Jesús García Sáez -* Joe Khoobyar -* Jurij Smakov -* KISHIMOTO, Makoto -* Kim Burgestrand -* Lars Kanis -* Luc Heinrich -* Luis Lavena -* Matijs van Zuijlen -* Matthew King -* Mike Dalessio -* NARUSE, Yui -* Park Heesob -* Shin Yee -* Stephen Bannasch -* Suraj N. Kurapati -* Sylvain Daubert -* Victor Costan -* beoran@gmail.com -* ctide -* emboss -* hobophobe -* meh -* postmodern -* wycats@gmail.com -* Wayne Meissner diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile deleted file mode 100644 index 4f7c07486b322c7612f079129986eb9600f825f9..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile +++ /dev/null @@ -1,268 +0,0 @@ -require 'rubygems/tasks' -require 'rbconfig' -require 'rake/clean' -require File.expand_path("./lib/ffi/version") - -USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true -if USE_RAKE_COMPILER - require 'rake/extensiontask' -end - -require 'date' -require 'fileutils' -require 'rbconfig' -require 'rspec/core/rake_task' -require 'rubygems/package_task' - -LIBEXT = case RbConfig::CONFIG['host_os'].downcase - when /darwin/ - "dylib" - when /mswin|mingw/ - "dll" - else - RbConfig::CONFIG['DLEXT'] - end - -CPU = case RbConfig::CONFIG['host_cpu'].downcase - when /i[3456]86/ - # Darwin always reports i686, even when running in 64bit mode - if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum) - "x86_64" - else - "i386" - end - - when /amd64|x86_64/ - "x86_64" - - when /ppc64|powerpc64/ - "powerpc64" - - when /ppc|powerpc/ - "powerpc" - - when /^arm/ - "arm" - - else - RbConfig::CONFIG['host_cpu'] - end - -OS = case RbConfig::CONFIG['host_os'].downcase - when /linux/ - "linux" - when /darwin/ - "darwin" - when /freebsd/ - "freebsd" - when /openbsd/ - "openbsd" - when /sunos|solaris/ - "solaris" - when /mswin|mingw/ - "win32" - else - RbConfig::CONFIG['host_os'].downcase - end - -def which(name) - exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] - ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| - exts.each do |ext| - app = File.join(path, name+ext) - return app if File.executable? app - end - end - nil -end - -GMAKE = which('gmake').nil? ? 'make' : 'gmake' - -LIBTEST = "build/libtest.#{LIBEXT}" -BUILD_DIR = "build" -BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION) - -def gem_spec - @gem_spec ||= Gem::Specification.load('ffi.gemspec') -end - -TEST_DEPS = [ LIBTEST ] -if RUBY_PLATFORM == "java" - RSpec::Core::RakeTask.new(:spec) do |config| - config.rspec_opts = YAML.load_file 'spec/spec.opts' - end -else - RSpec::Core::RakeTask.new(:spec => :compile) do |config| - config.rspec_opts = YAML.load_file 'spec/spec.opts' - end - - TEST_DEPS.unshift :compile -end - -desc "Build all packages" -task :package => %w[ gem:java gem:windows ] - -CLOBBER.include 'lib/ffi/types.conf' -CLOBBER.include 'pkg' -CLOBBER.include 'log' - -CLEAN.include 'build' -CLEAN.include 'conftest.dSYM' -CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}' -CLEAN.include 'spec/ffi/fixtures/*.o' -CLEAN.include "pkg/ffi-*-{mingw32,java}" -CLEAN.include 'lib/1.*' -CLEAN.include 'lib/2.*' -CLEAN.include 'bin' - -task :distclean => :clobber - -desc "Build the native test lib" -file "build/libtest.#{LIBEXT}" => FileList['libtest/**/*.[ch]'] do - sh %{#{GMAKE} -f libtest/GNUmakefile CPU=#{CPU} OS=#{OS} } -end - - -desc "Build test helper lib" -task :libtest => "build/libtest.#{LIBEXT}" - -desc "Test the extension" -task :test => [ :spec ] - - -namespace :bench do - ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000 - bench_libs = "-Ilib -I#{BUILD_DIR}" unless RUBY_PLATFORM == "java" - bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench_helper.rb" } - bench_files.each do |bench| - task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do - sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}} - end - end - task :all => TEST_DEPS do - bench_files.each do |bench| - sh %{#{Gem.ruby} #{bench_libs} #{bench}} - end - end -end - -task 'spec:run' => TEST_DEPS -task 'spec:specdoc' => TEST_DEPS - -task :default => :spec - -namespace 'java' do - - java_gem_spec = Gem::Specification.new do |s| - s.name = gem_spec.name - s.version = gem_spec.version - s.author = gem_spec.author - s.email = gem_spec.email - s.homepage = gem_spec.homepage - s.summary = gem_spec.summary - s.description = gem_spec.description - s.files = %w(LICENSE COPYING README.md CHANGELOG.md Rakefile) - s.has_rdoc = false - s.license = gem_spec.license - s.platform = 'java' - end - - Gem::PackageTask.new(java_gem_spec) do |pkg| - pkg.need_zip = true - pkg.need_tar = true - pkg.package_dir = 'pkg' - end -end - -task 'gem:java' => 'java:gem' - - -if USE_RAKE_COMPILER - Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext| - ext.name = 'ffi_c' # indicate the name of the extension. - # ext.lib_dir = BUILD_DIR # put binaries into this folder. - ext.tmp_dir = BUILD_DIR # temporary folder used during compilation. - ext.cross_compile = true # enable cross compilation (requires cross compile toolchain) - ext.cross_platform = %w[i386-mingw32 x64-mingw32] # forces the Windows platform instead of the default one - ext.cross_compiling do |spec| - spec.files.reject! { |path| File.fnmatch?('ext/*', path) } - end - end - - # To reduce the gem file size strip mingw32 dlls before packaging - ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version| - task "build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| - sh "i686-w64-mingw32-strip -S build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" - end - - task "build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| - sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" - end - end - - desc "build a windows gem without all the ceremony." - task "gem:windows" do - require "rake_compiler_dock" - RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle && rake cross native gem MAKE='nice make -j`nproc`'" - end -end - -directory "ext/ffi_c/libffi" -file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do - warn "Downloading libffi ..." - sh "git submodule update --init --recursive" -end - -LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") - -# Generate files in gemspec but not in libffi's git repo by running autogen.sh -gem_spec.files.select do |f| - f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1) -end.each do |f| - file f => "ext/ffi_c/libffi/autogen.sh" do - chdir "ext/ffi_c/libffi" do - sh "sh ./autogen.sh" - end - touch f - if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files - warn "gemspec files have changed -> Please restart rake!" - exit 1 - end - end -end - -$LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib') -require 'ffi/platform' -types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) -logfile = File.join(File.dirname(__FILE__), 'types_log') - -file types_conf => File.join("lib", "ffi", "version.rb") do |task| - require 'fileutils' - require 'ffi/tools/types_generator' - options = {} - FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 }) - File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| - f.puts FFI::TypesGenerator.generate(options) - end - File.open(logfile, 'w') do |log| - log.puts(types_conf) - end -end - -task :types_conf => types_conf do -end - -Gem::Tasks.new do |t| - t.scm.tag.format = '%s' -end - -begin - require 'yard' - - namespace :doc do - YARD::Rake::YardocTask.new do |yard| - end - end -rescue LoadError - warn "[warn] YARD unavailable" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml deleted file mode 100644 index e5ab1533087a7a088c91620bad382d53a3f76e18..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml +++ /dev/null @@ -1,22 +0,0 @@ -install: - - SET PATH=C:\Ruby%RUBYVER%\bin;%PATH% - - SET RAKEOPT=-rdevkit - - ps: | - if ($env:RUBYVER -like "*head*") { - $(new-object net.webclient).DownloadFile("https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-$env:RUBYVER.exe", "$pwd/ruby-setup.exe") - cmd /c ruby-setup.exe /verysilent /dir=C:/Ruby$env:RUBYVER - } - - ridk version - - gem --version - - gem install bundler --quiet --no-ri --no-rdoc - - bundle install -build: off -build_script: - - bundle exec rake compile || bundle exec rake compile -test_script: - - bundle exec rake test -environment: - matrix: - - RUBYVER: "head-x64" - - RUBYVER: 24 - - RUBYVER: 25-x64 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c deleted file mode 100644 index 684907bb6ffc66f4851bbb1c036a5e2dd0d66429..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c +++ /dev/null @@ -1,1109 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Jake Douglas - * Copyright (C) 2008 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifndef _MSC_VER -# include -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif - -#include -#include - -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Function.h" -#include "LongDouble.h" - -#ifdef PRIsVALUE -# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) -# define RB_OBJ_STRING(obj) (obj) -#else -# define PRIsVALUE "s" -# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj) -# define RB_OBJ_STRING(obj) StringValueCStr(obj) -#endif - -static inline char* memory_address(VALUE self); -VALUE rbffi_AbstractMemoryClass = Qnil; -static VALUE NullPointerErrorClass = Qnil; -static ID id_to_ptr = 0, id_plus = 0, id_call = 0; - -static VALUE -memory_allocate(VALUE klass) -{ - AbstractMemory* memory; - VALUE obj; - obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory); - memory->flags = MEM_RD | MEM_WR; - - return obj; -} -#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x)) - -#define NUM_OP(name, type, toNative, fromNative, swap) \ -static void memory_op_put_##name(AbstractMemory* memory, long off, VALUE value); \ -static void \ -memory_op_put_##name(AbstractMemory* memory, long off, VALUE value) \ -{ \ - type tmp = (type) VAL(toNative(value), swap); \ - checkWrite(memory); \ - checkBounds(memory, off, sizeof(type)); \ - memcpy(memory->address + off, &tmp, sizeof(tmp)); \ -} \ -static VALUE memory_put_##name(VALUE self, VALUE offset, VALUE value); \ -static VALUE \ -memory_put_##name(VALUE self, VALUE offset, VALUE value) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - memory_op_put_##name(memory, NUM2LONG(offset), value); \ - return self; \ -} \ -static VALUE memory_write_##name(VALUE self, VALUE value); \ -static VALUE \ -memory_write_##name(VALUE self, VALUE value) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - memory_op_put_##name(memory, 0, value); \ - return self; \ -} \ -static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \ -static VALUE \ -memory_op_get_##name(AbstractMemory* memory, long off) \ -{ \ - type tmp; \ - checkRead(memory); \ - checkBounds(memory, off, sizeof(type)); \ - memcpy(&tmp, memory->address + off, sizeof(tmp)); \ - return fromNative(VAL(tmp, swap)); \ -} \ -static VALUE memory_get_##name(VALUE self, VALUE offset); \ -static VALUE \ -memory_get_##name(VALUE self, VALUE offset) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - return memory_op_get_##name(memory, NUM2LONG(offset)); \ -} \ -static VALUE memory_read_##name(VALUE self); \ -static VALUE \ -memory_read_##name(VALUE self) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - return memory_op_get_##name(memory, 0); \ -} \ -static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \ -\ -static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \ -static VALUE \ -memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \ -{ \ - long count = RARRAY_LEN(ary); \ - long off = NUM2LONG(offset); \ - AbstractMemory* memory = MEMORY(self); \ - long i; \ - checkWrite(memory); \ - checkBounds(memory, off, count * sizeof(type)); \ - for (i = 0; i < count; i++) { \ - type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \ - memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \ - } \ - return self; \ -} \ -static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \ -static VALUE \ -memory_write_array_of_##name(VALUE self, VALUE ary) \ -{ \ - return memory_put_array_of_##name(self, INT2FIX(0), ary); \ -} \ -static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \ -static VALUE \ -memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \ -{ \ - long count = NUM2LONG(length); \ - long off = NUM2LONG(offset); \ - AbstractMemory* memory = MEMORY(self); \ - VALUE retVal = rb_ary_new2(count); \ - long i; \ - checkRead(memory); \ - checkBounds(memory, off, count * sizeof(type)); \ - for (i = 0; i < count; ++i) { \ - type tmp; \ - memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \ - rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \ - } \ - return retVal; \ -} \ -static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \ -static VALUE \ -memory_read_array_of_##name(VALUE self, VALUE length) \ -{ \ - return memory_get_array_of_##name(self, INT2FIX(0), length); \ -} - -#define NOSWAP(x) (x) -#define bswap16(x) (((x) >> 8) & 0xff) | (((x) << 8) & 0xff00); -static inline int16_t -SWAPS16(int16_t x) -{ - return bswap16(x); -} - -static inline uint16_t -SWAPU16(uint16_t x) -{ - return bswap16(x); -} - -#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) -#define bswap32(x) \ - (((x << 24) & 0xff000000) | \ - ((x << 8) & 0x00ff0000) | \ - ((x >> 8) & 0x0000ff00) | \ - ((x >> 24) & 0x000000ff)) - -#define bswap64(x) \ - (((x << 56) & 0xff00000000000000ULL) | \ - ((x << 40) & 0x00ff000000000000ULL) | \ - ((x << 24) & 0x0000ff0000000000ULL) | \ - ((x << 8) & 0x000000ff00000000ULL) | \ - ((x >> 8) & 0x00000000ff000000ULL) | \ - ((x >> 24) & 0x0000000000ff0000ULL) | \ - ((x >> 40) & 0x000000000000ff00ULL) | \ - ((x >> 56) & 0x00000000000000ffULL)) - -static inline int32_t -SWAPS32(int32_t x) -{ - return bswap32(x); -} - -static inline uint32_t -SWAPU32(uint32_t x) -{ - return bswap32(x); -} - -static inline int64_t -SWAPS64(int64_t x) -{ - return bswap64(x); -} - -static inline uint64_t -SWAPU64(uint64_t x) -{ - return bswap64(x); -} - -#else -# define SWAPS32(x) ((int32_t) __builtin_bswap32(x)) -# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x)) -# define SWAPS64(x) ((int64_t) __builtin_bswap64(x)) -# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x)) -#endif - -#if LONG_MAX > INT_MAX -# define SWAPSLONG SWAPS64 -# define SWAPULONG SWAPU64 -#else -# define SWAPSLONG SWAPS32 -# define SWAPULONG SWAPU32 -#endif - -NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP); -NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP); -NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16); -NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16); -NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32); -NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32); -NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64); -NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64); -NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG); -NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG); -NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP); -NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP); -NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP); - -static inline void* -get_pointer_value(VALUE value) -{ - const int type = TYPE(value); - if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_PointerClass)) { - return memory_address(value); - } else if (type == T_NIL) { - return NULL; - } else if (type == T_FIXNUM) { - return (void *) (uintptr_t) FIX2ULONG(value); - } else if (type == T_BIGNUM) { - return (void *) (uintptr_t) NUM2ULL(value); - } else if (rb_respond_to(value, id_to_ptr)) { - return MEMORY_PTR(rb_funcall2(value, id_to_ptr, 0, NULL)); - } else { - rb_raise(rb_eArgError, "value is not a pointer"); - return NULL; - } -} - -NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP); - -static inline uint8_t -rbffi_bool_value(VALUE value) -{ - return RTEST(value); -} - -static inline VALUE -rbffi_bool_new(uint8_t value) -{ - return (value & 1) != 0 ? Qtrue : Qfalse; -} - -NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP); - - -/* - * call-seq: memory.clear - * Set the memory to all-zero. - * @return [self] - */ -static VALUE -memory_clear(VALUE self) -{ - AbstractMemory* ptr = MEMORY(self); - memset(ptr->address, 0, ptr->size); - return self; -} - -/* - * call-seq: memory.size - * Return memory size in bytes (alias: #total) - * @return [Numeric] - */ -static VALUE -memory_size(VALUE self) -{ - AbstractMemory* ptr; - - Data_Get_Struct(self, AbstractMemory, ptr); - - return LONG2NUM(ptr->size); -} - -/* - * call-seq: memory.get(type, offset) - * Return data of given type contained in memory. - * @param [Symbol, Type] type_name type of data to get - * @param [Numeric] offset point in buffer to start from - * @return [Object] - * @raise {ArgumentError} if type is not supported - */ -static VALUE -memory_get(VALUE self, VALUE type_name, VALUE offset) -{ - AbstractMemory* ptr; - VALUE nType; - Type *type; - - nType = rbffi_Type_Lookup(type_name); - if(NIL_P(nType)) goto undefined_type; - - Data_Get_Struct(self, AbstractMemory, ptr); - Data_Get_Struct(nType, Type, type); - - MemoryOp *op = get_memory_op(type); - if(op == NULL) goto undefined_type; - - return op->get(ptr, NUM2LONG(offset)); - -undefined_type: { - VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name); - rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); - return Qnil; - } -} - -/* - * call-seq: memory.put(type, offset, value) - * @param [Symbol, Type] type_name type of data to put - * @param [Numeric] offset point in buffer to start from - * @return [nil] - * @raise {ArgumentError} if type is not supported - */ -static VALUE -memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value) -{ - AbstractMemory* ptr; - VALUE nType; - Type *type; - - nType = rbffi_Type_Lookup(type_name); - if(NIL_P(nType)) goto undefined_type; - - Data_Get_Struct(self, AbstractMemory, ptr); - Data_Get_Struct(nType, Type, type); - - MemoryOp *op = get_memory_op(type); - if(op == NULL) goto undefined_type; - - op->put(ptr, NUM2LONG(offset), value); - return Qnil; - -undefined_type: { - VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name); - rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); - return Qnil; - } -} - -/* - * call-seq: memory.get_string(offset, length=nil) - * Return string contained in memory. - * @param [Numeric] offset point in buffer to start from - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [String] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_string(int argc, VALUE* argv, VALUE self) -{ - VALUE length = Qnil, offset = Qnil; - AbstractMemory* ptr = MEMORY(self); - long off, len; - char* end; - int nargs = rb_scan_args(argc, argv, "11", &offset, &length); - - off = NUM2LONG(offset); - len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off); - checkRead(ptr); - checkBounds(ptr, off, len); - - end = memchr(ptr->address + off, 0, len); - return rb_tainted_str_new((char *) ptr->address + off, - (end != NULL ? end - ptr->address - off : len)); -} - -/* - * call-seq: memory.get_array_of_string(offset, count=nil) - * Return an array of strings contained in memory. - * @param [Numeric] offset point in memory to start from - * @param [Numeric] count number of strings to get. If nil, return all strings - * @return [Array] - * @raise {IndexError} if +offset+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_array_of_string(int argc, VALUE* argv, VALUE self) -{ - VALUE offset = Qnil, countnum = Qnil, retVal = Qnil; - AbstractMemory* ptr; - long off; - int count; - - rb_scan_args(argc, argv, "11", &offset, &countnum); - off = NUM2LONG(offset); - count = (countnum == Qnil ? 0 : NUM2INT(countnum)); - retVal = rb_ary_new2(count); - - Data_Get_Struct(self, AbstractMemory, ptr); - checkRead(ptr); - - if (countnum != Qnil) { - int i; - - checkBounds(ptr, off, count * sizeof (char*)); - - for (i = 0; i < count; ++i) { - const char* strptr = *((const char**) (ptr->address + off) + i); - rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_tainted_str_new2(strptr))); - } - - } else { - checkBounds(ptr, off, sizeof (char*)); - for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) { - const char* strptr = *(const char**) (ptr->address + off); - if (strptr == NULL) { - break; - } - rb_ary_push(retVal, rb_tainted_str_new2(strptr)); - } - } - - return retVal; -} - -/* - * call-seq: memory.read_array_of_string(count=nil) - * Return an array of strings contained in memory. Same as: - * memory.get_array_of_string(0, count) - * @param [Numeric] count number of strings to get. If nil, return all strings - * @return [Array] - */ -static VALUE -memory_read_array_of_string(int argc, VALUE* argv, VALUE self) -{ - VALUE* rargv = ALLOCA_N(VALUE, argc + 1); - int i; - - rargv[0] = INT2FIX(0); - for (i = 0; i < argc; i++) { - rargv[i + 1] = argv[i]; - } - - return memory_get_array_of_string(argc + 1, rargv, self); -} - - -/* - * call-seq: memory.put_string(offset, str) - * @param [Numeric] offset - * @param [String] str - * @return [self] - * @raise {SecurityError} when writing unsafe string to memory - * @raise {IndexError} if +offset+ is too great - * @raise {NullPointerError} if memory not initialized - * Put a string in memory. - */ -static VALUE -memory_put_string(VALUE self, VALUE offset, VALUE str) -{ - AbstractMemory* ptr = MEMORY(self); - long off, len; - - Check_Type(str, T_STRING); - off = NUM2LONG(offset); - len = RSTRING_LEN(str); - - checkWrite(ptr); - checkBounds(ptr, off, len + 1); - - memcpy(ptr->address + off, RSTRING_PTR(str), len); - *((char *) ptr->address + off + len) = '\0'; - - return self; -} - -/* - * call-seq: memory.get_bytes(offset, length) - * Return string contained in memory. - * @param [Numeric] offset point in buffer to start from - * @param [Numeric] length string's length in bytes. - * @return [String] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_bytes(VALUE self, VALUE offset, VALUE length) -{ - AbstractMemory* ptr = MEMORY(self); - long off, len; - - off = NUM2LONG(offset); - len = NUM2LONG(length); - - checkRead(ptr); - checkBounds(ptr, off, len); - - return rb_tainted_str_new((char *) ptr->address + off, len); -} - -/* - * call-seq: memory.put_bytes(offset, str, index=0, length=nil) - * Put a string in memory. - * @param [Numeric] offset point in buffer to start from - * @param [String] str string to put to memory - * @param [Numeric] index - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [self] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string - * @raise {SecurityError} when writing unsafe string to memory - */ -static VALUE -memory_put_bytes(int argc, VALUE* argv, VALUE self) -{ - AbstractMemory* ptr = MEMORY(self); - VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil; - long off, len, idx; - int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength); - - Check_Type(str, T_STRING); - - off = NUM2LONG(offset); - idx = nargs > 2 ? NUM2LONG(rbIndex) : 0; - if (idx < 0) { - rb_raise(rb_eRangeError, "index cannot be less than zero"); - return Qnil; - } - len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx); - if ((idx + len) > RSTRING_LEN(str)) { - rb_raise(rb_eRangeError, "index+length is greater than size of string"); - return Qnil; - } - - checkWrite(ptr); - checkBounds(ptr, off, len); - - if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) { - rb_raise(rb_eSecurityError, "Writing unsafe string to memory"); - return Qnil; - } - memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len); - - return self; -} - -/* - * call-seq: memory.read_bytes(length) - * @param [Numeric] length of string to return - * @return [String] - * equivalent to : - * memory.get_bytes(0, length) - */ -static VALUE -memory_read_bytes(VALUE self, VALUE length) -{ - return memory_get_bytes(self, INT2FIX(0), length); -} - -/* - * call-seq: memory.write_bytes(str, index=0, length=nil) - * @param [String] str string to put to memory - * @param [Numeric] index - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [self] - * equivalent to : - * memory.put_bytes(0, str, index, length) - */ -static VALUE -memory_write_bytes(int argc, VALUE* argv, VALUE self) -{ - VALUE* wargv = ALLOCA_N(VALUE, argc + 1); - int i; - - wargv[0] = INT2FIX(0); - for (i = 0; i < argc; i++) { - wargv[i + 1] = argv[i]; - } - - return memory_put_bytes(argc + 1, wargv, self); -} - -/* - * call-seq: memory.type_size - * @return [Numeric] type size in bytes - * Get the memory's type size. - */ -static VALUE -memory_type_size(VALUE self) -{ - AbstractMemory* ptr; - - Data_Get_Struct(self, AbstractMemory, ptr); - - return INT2NUM(ptr->typeSize); -} - -/* - * Document-method: [] - * call-seq: memory[idx] - * @param [Numeric] idx index to access in memory - * @return - * Memory read accessor. - */ -static VALUE -memory_aref(VALUE self, VALUE idx) -{ - AbstractMemory* ptr; - VALUE rbOffset = Qnil; - - Data_Get_Struct(self, AbstractMemory, ptr); - - rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize); - - return rb_funcall2(self, id_plus, 1, &rbOffset); -} - -static inline char* -memory_address(VALUE obj) -{ - return ((AbstractMemory *) DATA_PTR(obj))->address; -} - -static VALUE -memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen) -{ - AbstractMemory* dst; - - Data_Get_Struct(self, AbstractMemory, dst); - - memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen)); - - return self; -} - -AbstractMemory* -rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass) -{ - if (rb_obj_is_kind_of(obj, klass)) { - AbstractMemory* memory; - Data_Get_Struct(obj, AbstractMemory, memory); - return memory; - } - - rb_raise(rb_eArgError, "Invalid Memory object"); - return NULL; -} - -void -rbffi_AbstractMemory_Error(AbstractMemory *mem, int op) -{ - VALUE rbErrorClass = mem->address == NULL ? NullPointerErrorClass : rb_eRuntimeError; - if (op == MEM_RD) { - rb_raise(rbErrorClass, "invalid memory read at address=%p", mem->address); - } else if (op == MEM_WR) { - rb_raise(rbErrorClass, "invalid memory write at address=%p", mem->address); - } else { - rb_raise(rbErrorClass, "invalid memory access at address=%p", mem->address); - } -} - -static VALUE -memory_op_get_strptr(AbstractMemory* ptr, long offset) -{ - void* tmp = NULL; - - if (ptr != NULL && ptr->address != NULL) { - checkRead(ptr); - checkBounds(ptr, offset, sizeof(tmp)); - memcpy(&tmp, ptr->address + offset, sizeof(tmp)); - } - - return tmp != NULL ? rb_tainted_str_new2(tmp) : Qnil; -} - -static void -memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value) -{ - rb_raise(rb_eArgError, "Cannot set :string fields"); -} - -static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr }; - - -MemoryOps rbffi_AbstractMemoryOps = { - &memory_op_int8, /*.int8 */ - &memory_op_uint8, /* .uint8 */ - &memory_op_int16, /* .int16 */ - &memory_op_uint16, /* .uint16 */ - &memory_op_int32, /* .int32 */ - &memory_op_uint32, /* .uint32 */ - &memory_op_int64, /* .int64 */ - &memory_op_uint64, /* .uint64 */ - &memory_op_long, /* .slong */ - &memory_op_ulong, /* .uslong */ - &memory_op_float32, /* .float32 */ - &memory_op_float64, /* .float64 */ - &memory_op_longdouble, /* .longdouble */ - &memory_op_pointer, /* .pointer */ - &memory_op_strptr, /* .strptr */ - &memory_op_bool /* .boolOp */ -}; - -void -rbffi_AbstractMemory_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::AbstractMemory - * - * {AbstractMemory} is the base class for many memory management classes such as {Buffer}. - * - * This class has a lot of methods to work with integers : - * * put_intsize(offset, value) - * * get_intsize(offset) - * * put_uintsize(offset, value) - * * get_uintsize(offset) - * * writeuintsize(value) - * * read_intsize - * * write_uintsize(value) - * * read_uintsize - * * put_array_of_intsize(offset, ary) - * * get_array_of_intsize(offset, length) - * * put_array_of_uintsize(offset, ary) - * * get_array_of_uintsize(offset, length) - * * write_array_of_intsize(ary) - * * read_array_of_intsize(length) - * * write_array_of_uintsize(ary) - * * read_array_of_uintsize(length) - * where _size_ is 8, 16, 32 or 64. Same methods exist for long type. - * - * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and long_long for _int64_. - * - * Others methods are listed below. - */ - VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject); - rbffi_AbstractMemoryClass = classMemory; - /* - * Document-variable: FFI::AbstractMemory - */ - rb_global_variable(&rbffi_AbstractMemoryClass); - rb_define_alloc_func(classMemory, memory_allocate); - - NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError); - /* Document-variable: NullPointerError */ - rb_global_variable(&NullPointerErrorClass); - - -#undef INT -#define INT(type) \ - rb_define_method(classMemory, "put_" #type, memory_put_##type, 2); \ - rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \ - rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \ - rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \ - rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \ - rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \ - rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \ - rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \ - rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \ - rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \ - rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \ - rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \ - rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \ - rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \ - rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \ - rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1); - - INT(int8); - INT(int16); - INT(int32); - INT(int64); - INT(long); - -#define ALIAS(name, old) \ - rb_define_alias(classMemory, "put_" #name, "put_" #old); \ - rb_define_alias(classMemory, "get_" #name, "get_" #old); \ - rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \ - rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \ - rb_define_alias(classMemory, "write_" #name, "write_" #old); \ - rb_define_alias(classMemory, "read_" #name, "read_" #old); \ - rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \ - rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \ - rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \ - rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \ - rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \ - rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \ - rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \ - rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \ - rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \ - rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old); - - ALIAS(char, int8); - ALIAS(short, int16); - ALIAS(int, int32); - ALIAS(long_long, int64); - - /* - * Document-method: put_float32 - * call-seq: memory.put_float32offset, value) - * @param [Numeric] offset - * @param [Numeric] value - * @return [self] - * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float). - */ - rb_define_method(classMemory, "put_float32", memory_put_float32, 2); - /* - * Document-method: get_float32 - * call-seq: memory.get_float32(offset) - * @param [Numeric] offset - * @return [Float] - * Get a 32-bit float from memory at offset +offset+ (alias: #get_float). - */ - rb_define_method(classMemory, "get_float32", memory_get_float32, 1); - rb_define_alias(classMemory, "put_float", "put_float32"); - rb_define_alias(classMemory, "get_float", "get_float32"); - /* - * Document-method: write_float - * call-seq: memory.write_float(value) - * @param [Numeric] value - * @return [self] - * Write +value+ as a 32-bit float in memory. - * - * Same as: - * memory.put_float(0, value) - */ - rb_define_method(classMemory, "write_float", memory_write_float32, 1); - /* - * Document-method: read_float - * call-seq: memory.read_float - * @return [Float] - * Read a 32-bit float from memory. - * - * Same as: - * memory.get_float(0) - */ - rb_define_method(classMemory, "read_float", memory_read_float32, 0); - /* - * Document-method: put_array_of_float32 - * call-seq: memory.put_array_of_float32(offset, ary) - * @param [Numeric] offset - * @param [Array] ary - * @return [self] - * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float). - */ - rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2); - /* - * Document-method: get_array_of_float32 - * call-seq: memory.get_array_of_float32(offset, length) - * @param [Numeric] offset - * @param [Numeric] length number of Float to get - * @return [Array] - * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float). - */ - rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2); - /* - * Document-method: write_array_of_float - * call-seq: memory.write_array_of_float(ary) - * @param [Array] ary - * @return [self] - * Write values from +ary+ as 32-bit floats in memory. - * - * Same as: - * memory.put_array_of_float(0, ary) - */ - rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1); - /* - * Document-method: read_array_of_float - * call-seq: memory.read_array_of_float(length) - * @param [Numeric] length number of Float to read - * @return [Array] - * Read 32-bit floats from memory. - * - * Same as: - * memory.get_array_of_float(0, ary) - */ - rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1); - rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32"); - rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32"); - /* - * Document-method: put_float64 - * call-seq: memory.put_float64(offset, value) - * @param [Numeric] offset - * @param [Numeric] value - * @return [self] - * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double). - */ - rb_define_method(classMemory, "put_float64", memory_put_float64, 2); - /* - * Document-method: get_float64 - * call-seq: memory.get_float64(offset) - * @param [Numeric] offset - * @return [Float] - * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double). - */ - rb_define_method(classMemory, "get_float64", memory_get_float64, 1); - rb_define_alias(classMemory, "put_double", "put_float64"); - rb_define_alias(classMemory, "get_double", "get_float64"); - /* - * Document-method: write_double - * call-seq: memory.write_double(value) - * @param [Numeric] value - * @return [self] - * Write +value+ as a 64-bit float (double) in memory. - * - * Same as: - * memory.put_double(0, value) - */ - rb_define_method(classMemory, "write_double", memory_write_float64, 1); - /* - * Document-method: read_double - * call-seq: memory.read_double - * @return [Float] - * Read a 64-bit float (double) from memory. - * - * Same as: - * memory.get_double(0) - */ - rb_define_method(classMemory, "read_double", memory_read_float64, 0); - /* - * Document-method: put_array_of_float64 - * call-seq: memory.put_array_of_float64(offset, ary) - * @param [Numeric] offset - * @param [Array] ary - * @return [self] - * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double). - */ - rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2); - /* - * Document-method: get_array_of_float64 - * call-seq: memory.get_array_of_float64(offset, length) - * @param [Numeric] offset - * @param [Numeric] length number of Float to get - * @return [Array] - * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double). - */ - rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2); - /* - * Document-method: write_array_of_double - * call-seq: memory.write_array_of_double(ary) - * @param [Array] ary - * @return [self] - * Write values from +ary+ as 64-bit floats (doubles) in memory. - * - * Same as: - * memory.put_array_of_double(0, ary) - */ - rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1); - /* - * Document-method: read_array_of_double - * call-seq: memory.read_array_of_double(length) - * @param [Numeric] length number of Float to read - * @return [Array] - * Read 64-bit floats (doubles) from memory. - * - * Same as: - * memory.get_array_of_double(0, ary) - */ - rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1); - rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64"); - rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64"); - /* - * Document-method: put_pointer - * call-seq: memory.put_pointer(offset, value) - * @param [Numeric] offset - * @param [nil,Pointer, Integer, #to_ptr] value - * @return [self] - * Put +value+ in memory from +offset+.. - */ - rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2); - /* - * Document-method: get_pointer - * call-seq: memory.get_pointer(offset) - * @param [Numeric] offset - * @return [Pointer] - * Get a {Pointer} to the memory from +offset+. - */ - rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1); - /* - * Document-method: write_pointer - * call-seq: memory.write_pointer(value) - * @param [nil,Pointer, Integer, #to_ptr] value - * @return [self] - * Write +value+ in memory. - * - * Equivalent to: - * memory.put_pointer(0, value) - */ - rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1); - /* - * Document-method: read_pointer - * call-seq: memory.read_pointer - * @return [Pointer] - * Get a {Pointer} to the memory from base address. - * - * Equivalent to: - * memory.get_pointer(0) - */ - rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0); - /* - * Document-method: put_array_of_pointer - * call-seq: memory.put_array_of_pointer(offset, ary) - * @param [Numeric] offset - * @param [Array<#to_ptr>] ary - * @return [self] - * Put an array of {Pointer} into memory from +offset+. - */ - rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2); - /* - * Document-method: get_array_of_pointer - * call-seq: memory.get_array_of_pointer(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Array] - * Get an array of {Pointer} of length +length+ from +offset+. - */ - rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2); - /* - * Document-method: write_array_of_pointer - * call-seq: memory.write_array_of_pointer(ary) - * @param [Array<#to_ptr>] ary - * @return [self] - * Write an array of {Pointer} into memory from +offset+. - * - * Same as : - * memory.put_array_of_pointer(0, ary) - */ - rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1); - /* - * Document-method: read_array_of_pointer - * call-seq: memory.read_array_of_pointer(length) - * @param [Numeric] length - * @return [Array] - * Read an array of {Pointer} of length +length+. - * - * Same as: - * memory.get_array_of_pointer(0, length) - */ - rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1); - - rb_define_method(classMemory, "get_string", memory_get_string, -1); - rb_define_method(classMemory, "put_string", memory_put_string, 2); - rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2); - rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1); - rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1); - rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1); - rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1); - - rb_define_method(classMemory, "get", memory_get, 2); - rb_define_method(classMemory, "put", memory_put, 3); - - rb_define_method(classMemory, "clear", memory_clear, 0); - rb_define_method(classMemory, "total", memory_size, 0); - rb_define_alias(classMemory, "size", "total"); - rb_define_method(classMemory, "type_size", memory_type_size, 0); - rb_define_method(classMemory, "[]", memory_aref, 1); - rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2); - - id_to_ptr = rb_intern("to_ptr"); - id_call = rb_intern("call"); - id_plus = rb_intern("+"); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h deleted file mode 100644 index 11192885ac5a53e849d6f63494ba78d6888676b5..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_ABSTRACTMEMORY_H -#define RBFFI_ABSTRACTMEMORY_H - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _MSC_VER -#include -#endif - -#include "compat.h" -#include "Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define MEM_RD 0x01 -#define MEM_WR 0x02 -#define MEM_CODE 0x04 -#define MEM_SWAP 0x08 -#define MEM_EMBED 0x10 - -typedef struct AbstractMemory_ AbstractMemory; - -typedef struct { - VALUE (*get)(AbstractMemory* ptr, long offset); - void (*put)(AbstractMemory* ptr, long offset, VALUE value); -} MemoryOp; - -typedef struct { - MemoryOp* int8; - MemoryOp* uint8; - MemoryOp* int16; - MemoryOp* uint16; - MemoryOp* int32; - MemoryOp* uint32; - MemoryOp* int64; - MemoryOp* uint64; - MemoryOp* slong; - MemoryOp* uslong; - MemoryOp* float32; - MemoryOp* float64; - MemoryOp* longdouble; - MemoryOp* pointer; - MemoryOp* strptr; - MemoryOp* boolOp; -} MemoryOps; - -struct AbstractMemory_ { - char* address; /* Use char* instead of void* to ensure adding to it works correctly */ - long size; - int flags; - int typeSize; -}; - - -extern VALUE rbffi_AbstractMemoryClass; -extern MemoryOps rbffi_AbstractMemoryOps; - -extern void rbffi_AbstractMemory_Init(VALUE ffiModule); - -extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass); - -extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op); - -static inline void -checkBounds(AbstractMemory* mem, long off, long len) -{ - if (unlikely((off | len | (off + len) | (mem->size - (off + len))) < 0)) { - rb_raise(rb_eIndexError, "Memory access offset=%ld size=%ld is out of bounds", - off, len); - } -} - -static inline void -checkRead(AbstractMemory* mem) -{ - if (unlikely((mem->flags & MEM_RD) == 0)) { - rbffi_AbstractMemory_Error(mem, MEM_RD); - } -} - -static inline void -checkWrite(AbstractMemory* mem) -{ - if (unlikely((mem->flags & MEM_WR) == 0)) { - rbffi_AbstractMemory_Error(mem, MEM_WR); - } -} - -static inline MemoryOp* -get_memory_op(Type* type) -{ - switch (type->nativeType) { - case NATIVE_INT8: - return rbffi_AbstractMemoryOps.int8; - case NATIVE_UINT8: - return rbffi_AbstractMemoryOps.uint8; - case NATIVE_INT16: - return rbffi_AbstractMemoryOps.int16; - case NATIVE_UINT16: - return rbffi_AbstractMemoryOps.uint16; - case NATIVE_INT32: - return rbffi_AbstractMemoryOps.int32; - case NATIVE_UINT32: - return rbffi_AbstractMemoryOps.uint32; - case NATIVE_INT64: - return rbffi_AbstractMemoryOps.int64; - case NATIVE_UINT64: - return rbffi_AbstractMemoryOps.uint64; - case NATIVE_LONG: - return rbffi_AbstractMemoryOps.slong; - case NATIVE_ULONG: - return rbffi_AbstractMemoryOps.uslong; - case NATIVE_FLOAT32: - return rbffi_AbstractMemoryOps.float32; - case NATIVE_FLOAT64: - return rbffi_AbstractMemoryOps.float64; - case NATIVE_LONGDOUBLE: - return rbffi_AbstractMemoryOps.longdouble; - case NATIVE_POINTER: - return rbffi_AbstractMemoryOps.pointer; - case NATIVE_STRING: - return rbffi_AbstractMemoryOps.strptr; - case NATIVE_BOOL: - return rbffi_AbstractMemoryOps.boolOp; - default: - return NULL; - } -} - -#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass) -#define MEMORY_PTR(obj) MEMORY((obj))->address -#define MEMORY_LEN(obj) MEMORY((obj))->size - - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_ABSTRACTMEMORY_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c deleted file mode 100644 index bfd666a7e6772bb2c1191dba3e90435b721ed1a9..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include "ArrayType.h" - -static VALUE array_type_s_allocate(VALUE klass); -static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength); -static void array_type_mark(ArrayType *); -static void array_type_free(ArrayType *); - -VALUE rbffi_ArrayTypeClass = Qnil; - -static VALUE -array_type_s_allocate(VALUE klass) -{ - ArrayType* array; - VALUE obj; - - obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array); - - array->base.nativeType = NATIVE_ARRAY; - array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType)); - array->base.ffiType->type = FFI_TYPE_STRUCT; - array->base.ffiType->size = 0; - array->base.ffiType->alignment = 0; - array->rbComponentType = Qnil; - - return obj; -} - -static void -array_type_mark(ArrayType *array) -{ - rb_gc_mark(array->rbComponentType); -} - -static void -array_type_free(ArrayType *array) -{ - xfree(array->base.ffiType); - xfree(array->ffiTypes); - xfree(array); -} - - -/* - * call-seq: initialize(component_type, length) - * @param [Type] component_type - * @param [Numeric] length - * @return [self] - * A new instance of ArrayType. - */ -static VALUE -array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength) -{ - ArrayType* array; - int i; - - Data_Get_Struct(self, ArrayType, array); - - array->length = NUM2UINT(rbLength); - array->rbComponentType = rbComponentType; - Data_Get_Struct(rbComponentType, Type, array->componentType); - - array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes)); - array->base.ffiType->elements = array->ffiTypes; - array->base.ffiType->size = array->componentType->ffiType->size * array->length; - array->base.ffiType->alignment = array->componentType->ffiType->alignment; - - for (i = 0; i < array->length; ++i) { - array->ffiTypes[i] = array->componentType->ffiType; - } - - return self; -} - -/* - * call-seq: length - * @return [Numeric] - * Get array's length - */ -static VALUE -array_type_length(VALUE self) -{ - ArrayType* array; - - Data_Get_Struct(self, ArrayType, array); - - return UINT2NUM(array->length); -} - -/* - * call-seq: element_type - * @return [Type] - * Get element type. - */ -static VALUE -array_type_element_type(VALUE self) -{ - ArrayType* array; - - Data_Get_Struct(self, ArrayType, array); - - return array->rbComponentType; -} - -void -rbffi_ArrayType_Init(VALUE moduleFFI) -{ - VALUE ffi_Type; - - ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::ArrayType < FFI::Type - * - * This is a typed array. The type is a {NativeType native type}. - */ - rbffi_ArrayTypeClass = rb_define_class_under(moduleFFI, "ArrayType", ffi_Type); - /* - * Document-variable: FFI::ArrayType - */ - rb_global_variable(&rbffi_ArrayTypeClass); - /* - * Document-constant: FFI::Type::Array - */ - rb_define_const(ffi_Type, "Array", rbffi_ArrayTypeClass); - - rb_define_alloc_func(rbffi_ArrayTypeClass, array_type_s_allocate); - rb_define_method(rbffi_ArrayTypeClass, "initialize", array_type_initialize, 2); - rb_define_method(rbffi_ArrayTypeClass, "length", array_type_length, 0); - rb_define_method(rbffi_ArrayTypeClass, "elem_type", array_type_element_type, 0); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h deleted file mode 100644 index 356ffb1c28261c09444c9e6f6594a819a97b575e..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_ARRAYTYPE_H -#define RBFFI_ARRAYTYPE_H - -#include -#include -#include "Type.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct ArrayType_ { - Type base; - int length; - ffi_type** ffiTypes; - Type* componentType; - VALUE rbComponentType; -} ArrayType; - -extern void rbffi_ArrayType_Init(VALUE moduleFFI); -extern VALUE rbffi_ArrayTypeClass; - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_ARRAYTYPE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c deleted file mode 100644 index faf4834d028a7fe7b7a9f963e93222f6b84cee04..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (C) 2009 Aman Gupta - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include -#include "rbffi.h" -#include "rbffi_endian.h" -#include "AbstractMemory.h" - -#define BUFFER_EMBED_MAXLEN (8) -typedef struct Buffer { - AbstractMemory memory; - - union { - VALUE rbParent; /* link to parent buffer */ - char* storage; /* start of malloc area */ - long embed[BUFFER_EMBED_MAXLEN / sizeof(long)]; /* storage for tiny allocations */ - } data; -} Buffer; - -static VALUE buffer_allocate(VALUE klass); -static VALUE buffer_initialize(int argc, VALUE* argv, VALUE self); -static void buffer_release(Buffer* ptr); -static void buffer_mark(Buffer* ptr); -static VALUE buffer_free(VALUE self); - -static VALUE BufferClass = Qnil; - -static VALUE -buffer_allocate(VALUE klass) -{ - Buffer* buffer; - VALUE obj; - - obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer); - buffer->data.rbParent = Qnil; - buffer->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -static void -buffer_release(Buffer* ptr) -{ - if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { - xfree(ptr->data.storage); - ptr->data.storage = NULL; - } - - xfree(ptr); -} - -/* - * call-seq: initialize(size, count=1, clear=false) - * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell - * @param [Fixnum] count number of cell in the Buffer - * @param [Boolean] clear if true, set the buffer to all-zero - * @return [self] - * @raise {NoMemoryError} if failed to allocate memory for Buffer - * A new instance of Buffer. - */ -static VALUE -buffer_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil; - Buffer* p; - int nargs; - - Data_Get_Struct(self, Buffer, p); - - nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear); - p->memory.typeSize = rbffi_type_size(rbSize); - p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1); - - if (p->memory.size > BUFFER_EMBED_MAXLEN) { - p->data.storage = xmalloc(p->memory.size + 7); - if (p->data.storage == NULL) { - rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size); - return Qnil; - } - - /* ensure the memory is aligned on at least a 8 byte boundary */ - p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7UL); - - if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) { - memset(p->memory.address, 0, p->memory.size); - } - - } else { - p->memory.flags |= MEM_EMBED; - p->memory.address = (void *) &p->data.embed[0]; - } - - if (rb_block_given_p()) { - return rb_ensure(rb_yield, self, buffer_free, self); - } - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [self] - * DO NOT CALL THIS METHOD. - */ -static VALUE -buffer_initialize_copy(VALUE self, VALUE other) -{ - AbstractMemory* src; - Buffer* dst; - - Data_Get_Struct(self, Buffer, dst); - src = rbffi_AbstractMemory_Cast(other, BufferClass); - if ((dst->memory.flags & MEM_EMBED) == 0 && dst->data.storage != NULL) { - xfree(dst->data.storage); - } - dst->data.storage = xmalloc(src->size + 7); - if (dst->data.storage == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); - return Qnil; - } - - dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7UL); - dst->memory.size = src->size; - dst->memory.typeSize = src->typeSize; - - /* finally, copy the actual buffer contents */ - memcpy(dst->memory.address, src->address, src->size); - - return self; -} - -static VALUE -buffer_alloc_inout(int argc, VALUE* argv, VALUE klass) -{ - return buffer_initialize(argc, argv, buffer_allocate(klass)); -} - -static VALUE -slice(VALUE self, long offset, long len) -{ - Buffer* ptr; - Buffer* result; - VALUE obj = Qnil; - - Data_Get_Struct(self, Buffer, ptr); - checkBounds(&ptr->memory, offset, len); - - obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result); - result->memory.address = ptr->memory.address + offset; - result->memory.size = len; - result->memory.flags = ptr->memory.flags; - result->memory.typeSize = ptr->memory.typeSize; - result->data.rbParent = self; - - return obj; -} - -/* - * call-seq: + offset - * @param [Numeric] offset - * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer. - * Add a Buffer with an offset - */ -static VALUE -buffer_plus(VALUE self, VALUE rbOffset) -{ - Buffer* ptr; - long offset = NUM2LONG(rbOffset); - - Data_Get_Struct(self, Buffer, ptr); - - return slice(self, offset, ptr->memory.size - offset); -} - -/* - * call-seq: slice(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Buffer] a new instance of Buffer - * Slice an existing Buffer. - */ -static VALUE -buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength) -{ - return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); -} - -/* - * call-seq: inspect - * @return [String] - * Inspect a Buffer. - */ -static VALUE -buffer_inspect(VALUE self) -{ - char tmp[100]; - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - - snprintf(tmp, sizeof(tmp), "#", ptr, ptr->memory.address, ptr->memory.size); - - return rb_str_new2(tmp); -} - - -#if BYTE_ORDER == LITTLE_ENDIAN -# define SWAPPED_ORDER BIG_ENDIAN -#else -# define SWAPPED_ORDER LITTLE_ENDIAN -#endif - -/* - * Set or get endianness of Buffer. - * @overload order - * @return [:big, :little] - * Get endianness of Buffer. - * @overload order(order) - * @param [:big, :little, :network] order - * @return [self] - * Set endianness of Buffer (+:network+ is an alias for +:big+). - */ -static VALUE -buffer_order(int argc, VALUE* argv, VALUE self) -{ - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - if (argc == 0) { - int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; - return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); - } else { - VALUE rbOrder = Qnil; - int order = BYTE_ORDER; - - if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { - rb_raise(rb_eArgError, "need byte order"); - } - if (SYMBOL_P(rbOrder)) { - ID id = SYM2ID(rbOrder); - if (id == rb_intern("little")) { - order = LITTLE_ENDIAN; - - } else if (id == rb_intern("big") || id == rb_intern("network")) { - order = BIG_ENDIAN; - } - } - if (order != BYTE_ORDER) { - Buffer* p2; - VALUE retval = slice(self, 0, ptr->memory.size); - - Data_Get_Struct(retval, Buffer, p2); - p2->memory.flags |= MEM_SWAP; - return retval; - } - - return self; - } -} - -/* Only used to free the buffer if the yield in the initializer throws an exception */ -static VALUE -buffer_free(VALUE self) -{ - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { - xfree(ptr->data.storage); - ptr->data.storage = NULL; - } - - return self; -} - -static void -buffer_mark(Buffer* ptr) -{ - rb_gc_mark(ptr->data.rbParent); -} - -void -rbffi_Buffer_Init(VALUE moduleFFI) -{ - VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; - - /* - * Document-class: FFI::Buffer < FFI::AbstractMemory - * - * A Buffer is a function argument type. It should be use with functions playing with C arrays. - */ - BufferClass = rb_define_class_under(moduleFFI, "Buffer", ffi_AbstractMemory); - - /* - * Document-variable: FFI::Buffer - */ - rb_global_variable(&BufferClass); - rb_define_alloc_func(BufferClass, buffer_allocate); - - /* - * Document-method: alloc_inout - * call-seq: alloc_inout(*args) - * Create a new Buffer for in and out arguments (alias : new_inout). - */ - rb_define_singleton_method(BufferClass, "alloc_inout", buffer_alloc_inout, -1); - /* - * Document-method: alloc_out - * call-seq: alloc_out(*args) - * Create a new Buffer for out arguments (alias : new_out). - */ - rb_define_singleton_method(BufferClass, "alloc_out", buffer_alloc_inout, -1); - /* - * Document-method: alloc_in - * call-seq: alloc_in(*args) - * Create a new Buffer for in arguments (alias : new_in). - */ - rb_define_singleton_method(BufferClass, "alloc_in", buffer_alloc_inout, -1); - rb_define_alias(rb_singleton_class(BufferClass), "new_in", "alloc_in"); - rb_define_alias(rb_singleton_class(BufferClass), "new_out", "alloc_out"); - rb_define_alias(rb_singleton_class(BufferClass), "new_inout", "alloc_inout"); - - rb_define_method(BufferClass, "initialize", buffer_initialize, -1); - rb_define_method(BufferClass, "initialize_copy", buffer_initialize_copy, 1); - rb_define_method(BufferClass, "order", buffer_order, -1); - rb_define_method(BufferClass, "inspect", buffer_inspect, 0); - rb_define_alias(BufferClass, "length", "total"); - rb_define_method(BufferClass, "+", buffer_plus, 1); - rb_define_method(BufferClass, "slice", buffer_slice, 2); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c deleted file mode 100644 index 0b9aceb87268a27f99e95f72e5a2faf12e2ee85d..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c +++ /dev/null @@ -1,520 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Mike Dalessio - * Copyright (c) 2009, Aman Gupta. - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include -#if defined(HAVE_RUBY_THREAD_H) -#include -#endif -#if defined(HAVE_NATIVETHREAD) && (defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && !defined(_WIN32) -# include -# include -#endif -#include -#include "extconf.h" -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Struct.h" -#include "Function.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "MappedType.h" -#include "Thread.h" -#include "LongDouble.h" - -#ifdef USE_RAW -# ifndef __i386__ -# error "RAW argument packing only supported on i386" -# endif - -#define INT8_ADJ (4) -#define INT16_ADJ (4) -#define INT32_ADJ (4) -#define INT64_ADJ (8) -#define LONG_ADJ (sizeof(long)) -#define FLOAT32_ADJ (4) -#define FLOAT64_ADJ (8) -#define ADDRESS_ADJ (sizeof(void *)) -#define LONGDOUBLE_ADJ (ffi_type_longdouble.alignment) - -#endif /* USE_RAW */ - -#ifdef USE_RAW -# define ADJ(p, a) ((p) = (FFIStorage*) (((char *) p) + a##_ADJ)) -#else -# define ADJ(p, a) (++(p)) -#endif - -static void* callback_param(VALUE proc, VALUE cbinfo); -static inline void* getPointer(VALUE value, int type); - -static ID id_to_ptr, id_map_symbol, id_to_native; - -void -rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, - FFIStorage* paramStorage, void** ffiValues, - VALUE* callbackParameters, int callbackCount, VALUE enums) -{ - VALUE callbackProc = Qnil; - FFIStorage* param = ¶mStorage[0]; - int i, argidx, cbidx, argCount; - - if (unlikely(paramCount != -1 && paramCount != argc)) { - if (argc == (paramCount - 1) && callbackCount == 1 && rb_block_given_p()) { - callbackProc = rb_block_proc(); - } else { - rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, paramCount); - } - } - - argCount = paramCount != -1 ? paramCount : argc; - - for (i = 0, argidx = 0, cbidx = 0; i < argCount; ++i) { - Type* paramType = paramTypes[i]; - int type; - - - if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { argv[argidx], Qnil }; - argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values); - paramType = ((MappedType *) paramType)->type; - } - - type = argidx < argc ? TYPE(argv[argidx]) : T_NONE; - ffiValues[i] = param; - - switch (paramType->nativeType) { - - case NATIVE_INT8: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s8 = NUM2INT(value); - } else { - param->s8 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT8); - break; - - case NATIVE_INT16: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s16 = NUM2INT(value); - - } else { - param->s16 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT16); - break; - - case NATIVE_INT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s32 = NUM2INT(value); - - } else { - param->s32 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT32); - break; - - case NATIVE_BOOL: - if (type != T_TRUE && type != T_FALSE) { - rb_raise(rb_eTypeError, "wrong argument type (expected a boolean parameter)"); - } - param->s8 = argv[argidx++] == Qtrue; - ADJ(param, INT8); - break; - - case NATIVE_UINT8: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u8 = NUM2UINT(value); - } else { - param->u8 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT8); - ++argidx; - break; - - case NATIVE_UINT16: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u16 = NUM2UINT(value); - } else { - param->u16 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT16); - ++argidx; - break; - - case NATIVE_UINT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u32 = NUM2UINT(value); - } else { - param->u32 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT32); - ++argidx; - break; - - case NATIVE_INT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->i64 = NUM2LL(value); - } else { - param->i64 = NUM2LL(argv[argidx]); - } - - ADJ(param, INT64); - ++argidx; - break; - - case NATIVE_UINT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u64 = NUM2ULL(value); - } else { - param->u64 = NUM2ULL(argv[argidx]); - } - - ADJ(param, INT64); - ++argidx; - break; - - case NATIVE_LONG: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - *(ffi_sarg *) param = NUM2LONG(value); - } else { - *(ffi_sarg *) param = NUM2LONG(argv[argidx]); - } - - ADJ(param, LONG); - ++argidx; - break; - - case NATIVE_ULONG: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - *(ffi_arg *) param = NUM2ULONG(value); - } else { - *(ffi_arg *) param = NUM2ULONG(argv[argidx]); - } - - ADJ(param, LONG); - ++argidx; - break; - - case NATIVE_FLOAT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->f32 = (float) NUM2DBL(value); - } else { - param->f32 = (float) NUM2DBL(argv[argidx]); - } - - ADJ(param, FLOAT32); - ++argidx; - break; - - case NATIVE_FLOAT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->f64 = NUM2DBL(value); - } else { - param->f64 = NUM2DBL(argv[argidx]); - } - - ADJ(param, FLOAT64); - ++argidx; - break; - - case NATIVE_LONGDOUBLE: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->ld = rbffi_num2longdouble(value); - } else { - param->ld = rbffi_num2longdouble(argv[argidx]); - } - - ADJ(param, LONGDOUBLE); - ++argidx; - break; - - - case NATIVE_STRING: - if (type == T_NIL) { - param->ptr = NULL; - - } else { - if (rb_safe_level() >= 1 && OBJ_TAINTED(argv[argidx])) { - rb_raise(rb_eSecurityError, "Unsafe string parameter"); - } - - param->ptr = StringValueCStr(argv[argidx]); - } - - ADJ(param, ADDRESS); - ++argidx; - break; - - case NATIVE_POINTER: - case NATIVE_BUFFER_IN: - case NATIVE_BUFFER_OUT: - case NATIVE_BUFFER_INOUT: - param->ptr = getPointer(argv[argidx++], type); - ADJ(param, ADDRESS); - break; - - - case NATIVE_FUNCTION: - case NATIVE_CALLBACK: - if (callbackProc != Qnil) { - param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]); - } else { - param->ptr = callback_param(argv[argidx], callbackParameters[cbidx++]); - ++argidx; - } - ADJ(param, ADDRESS); - break; - - case NATIVE_STRUCT: - ffiValues[i] = getPointer(argv[argidx++], type); - break; - - default: - rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType); - } - } -} - -static void * -call_blocking_function(void* data) -{ - rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data; - b->frame->has_gvl = false; - ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues); - b->frame->has_gvl = true; - - return NULL; -} - -VALUE -rbffi_do_blocking_call(void *data) -{ - rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); - - return Qnil; -} - -VALUE -rbffi_save_frame_exception(void *data, VALUE exc) -{ - rbffi_frame_t* frame = (rbffi_frame_t *) data; - frame->exc = exc; - return Qnil; -} - -VALUE -rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo) -{ - void* retval; - void** ffiValues; - FFIStorage* params; - VALUE rbReturnValue; - rbffi_frame_t frame = { 0 }; - - retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); - - if (unlikely(fnInfo->blocking)) { - rbffi_blocking_call_t* bc; - - /* - * due to the way thread switching works on older ruby variants, we - * cannot allocate anything passed to the blocking function on the stack - */ -#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) - ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); - params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); - bc = ALLOCA_N(rbffi_blocking_call_t, 1); - bc->retval = retval; -#else - ffiValues = ALLOC_N(void *, fnInfo->parameterCount); - params = ALLOC_N(FFIStorage, fnInfo->parameterCount); - bc = ALLOC_N(rbffi_blocking_call_t, 1); - bc->retval = xmalloc(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); - bc->stkretval = retval; -#endif - bc->cif = fnInfo->ffi_cif; - bc->function = function; - bc->ffiValues = ffiValues; - bc->params = params; - bc->frame = &frame; - - rbffi_SetupCallParams(argc, argv, - fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, - fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); - - rbffi_frame_push(&frame); - rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); - rbffi_frame_pop(&frame); - -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - memcpy(bc->stkretval, bc->retval, MAX(bc->cif.rtype->size, FFI_SIZEOF_ARG)); - xfree(bc->params); - xfree(bc->ffiValues); - xfree(bc->retval); - xfree(bc); -#endif - - } else { - - ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); - params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); - - rbffi_SetupCallParams(argc, argv, - fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, - fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); - - rbffi_frame_push(&frame); - ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues); - rbffi_frame_pop(&frame); - } - - if (unlikely(!fnInfo->ignoreErrno)) { - rbffi_save_errno(); - } - - if (RTEST(frame.exc) && frame.exc != Qnil) { - rb_exc_raise(frame.exc); - } - - RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval); - RB_GC_GUARD(fnInfo->rbReturnType); - - return rbReturnValue; -} - -static inline void* -getPointer(VALUE value, int type) -{ - if (likely(type == T_DATA && rb_obj_is_kind_of(value, rbffi_AbstractMemoryClass))) { - - return ((AbstractMemory *) DATA_PTR(value))->address; - - } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) { - - AbstractMemory* memory = ((Struct *) DATA_PTR(value))->pointer; - return memory != NULL ? memory->address : NULL; - - } else if (type == T_STRING) { - - return StringValuePtr(value); - - } else if (type == T_NIL) { - - return NULL; - - } else if (rb_respond_to(value, id_to_ptr)) { - - VALUE ptr = rb_funcall2(value, id_to_ptr, 0, NULL); - if (rb_obj_is_kind_of(ptr, rbffi_AbstractMemoryClass) && TYPE(ptr) == T_DATA) { - return ((AbstractMemory *) DATA_PTR(ptr))->address; - } - rb_raise(rb_eArgError, "to_ptr returned an invalid pointer"); - } - - rb_raise(rb_eArgError, ":pointer argument is not a valid pointer"); - return NULL; -} - -Invoker -rbffi_GetInvoker(FunctionType *fnInfo) -{ - return rbffi_CallFunction; -} - - -static void* -callback_param(VALUE proc, VALUE cbInfo) -{ - VALUE callback ; - if (unlikely(proc == Qnil)) { - return NULL ; - } - - /* Handle Function pointers here */ - if (rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { - AbstractMemory* ptr; - Data_Get_Struct(proc, AbstractMemory, ptr); - return ptr->address; - } - - callback = rbffi_Function_ForProc(cbInfo, proc); - RB_GC_GUARD(callback); - - return ((AbstractMemory *) DATA_PTR(callback))->address; -} - - -void -rbffi_Call_Init(VALUE moduleFFI) -{ - id_to_ptr = rb_intern("to_ptr"); - id_to_native = rb_intern("to_native"); - id_map_symbol = rb_intern("__map_symbol"); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h deleted file mode 100644 index 56bdd61a6f20c9e61380e809fd5f484526d9c163..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Mike Dalessio - * Copyright (c) 2009, Aman Gupta. - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_CALL_H -#define RBFFI_CALL_H - -#include "Thread.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__i386__) && \ - (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \ - !defined(_WIN32) && !defined(__WIN32__) -# define USE_RAW -#endif - -#if (defined(__i386__) || defined(__x86_64__)) && !(defined(_WIN32) || defined(__WIN32__)) -# define BYPASS_FFI 1 -#endif - -typedef union { -#ifdef USE_RAW - signed int s8, s16, s32; - unsigned int u8, u16, u32; -#else - signed char s8; - unsigned char u8; - signed short s16; - unsigned short u16; - signed int s32; - unsigned int u32; -#endif - signed long long i64; - unsigned long long u64; - signed long sl; - unsigned long ul; - void* ptr; - float f32; - double f64; - long double ld; -} FFIStorage; - -extern void rbffi_Call_Init(VALUE moduleFFI); - -extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, - FFIStorage* paramStorage, void** ffiValues, - VALUE* callbackParameters, int callbackCount, VALUE enums); - -struct FunctionType_; -extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); - -typedef VALUE (*Invoker)(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); - -Invoker rbffi_GetInvoker(struct FunctionType_* fnInfo); - -extern VALUE rbffi_GetEnumValue(VALUE enums, VALUE value); -extern int rbffi_GetSignedIntValue(VALUE value, int type, int minValue, int maxValue, const char* typeName, VALUE enums); - -typedef struct rbffi_blocking_call { - rbffi_frame_t* frame; - void* function; - ffi_cif cif; - void **ffiValues; - void* retval; - void* params; -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - void* stkretval; -#endif -} rbffi_blocking_call_t; - -VALUE rbffi_do_blocking_call(void* data); -VALUE rbffi_save_frame_exception(void *data, VALUE exc); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_CALL_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c deleted file mode 100644 index 5499b40d454344c63c8edebf21c5bcf9c6f7303f..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2009, 2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -#endif -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -#else -# include -# define _WINSOCKAPI_ -# include -#endif -#include -#include - -#if defined(_MSC_VER) && !defined(INT8_MIN) -# include "win32/stdint.h" -#endif -#include -#include "rbffi.h" -#include "compat.h" - -#include "Function.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" - -#include "ClosurePool.h" - - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif -#ifdef _WIN32 - typedef char* caddr_t; -#endif - -typedef struct Memory { - void* code; - void* data; - struct Memory* next; -} Memory; - -struct ClosurePool_ { - void* ctx; - int closureSize; - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize); - struct Memory* blocks; /* Keeps track of all the allocated memory for this pool */ - Closure* list; - long refcnt; -}; - -static long pageSize; - -static void* allocatePage(void); -static bool freePage(void *); -static bool protectPage(void *); - -ClosurePool* -rbffi_ClosurePool_New(int closureSize, - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), - void* ctx) -{ - ClosurePool* pool; - - pool = xcalloc(1, sizeof(*pool)); - pool->closureSize = closureSize; - pool->ctx = ctx; - pool->prep = prep; - pool->refcnt = 1; - - return pool; -} - -void -cleanup_closure_pool(ClosurePool* pool) -{ - Memory* memory; - - for (memory = pool->blocks; memory != NULL; ) { - Memory* next = memory->next; - freePage(memory->code); - free(memory->data); - free(memory); - memory = next; - } - xfree(pool); -} - -void -rbffi_ClosurePool_Free(ClosurePool* pool) -{ - if (pool != NULL) { - long refcnt = --(pool->refcnt); - if (refcnt == 0) { - cleanup_closure_pool(pool); - } - } -} - -Closure* -rbffi_Closure_Alloc(ClosurePool* pool) -{ - Closure *list = NULL; - Memory* block = NULL; - caddr_t code = NULL; - char errmsg[256]; - int nclosures; - long trampolineSize; - int i; - - if (pool->list != NULL) { - Closure* closure = pool->list; - pool->list = pool->list->next; - pool->refcnt++; - - return closure; - } - - trampolineSize = roundup(pool->closureSize, 8); - nclosures = (int) (pageSize / trampolineSize); - block = calloc(1, sizeof(*block)); - list = calloc(nclosures, sizeof(*list)); - code = allocatePage(); - - if (block == NULL || list == NULL || code == NULL) { - snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); - goto error; - } - - for (i = 0; i < nclosures; ++i) { - Closure* closure = &list[i]; - closure->next = &list[i + 1]; - closure->pool = pool; - closure->code = (code + (i * trampolineSize)); - - if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { - goto error; - } - } - - if (!protectPage(code)) { - goto error; - } - - /* Track the allocated page + Closure memory area */ - block->data = list; - block->code = code; - block->next = pool->blocks; - pool->blocks = block; - - /* Thread the new block onto the free list, apart from the first one. */ - list[nclosures - 1].next = pool->list; - pool->list = list->next; - pool->refcnt++; - - /* Use the first one as the new handle */ - return list; - -error: - free(block); - free(list); - if (code != NULL) { - freePage(code); - } - - - rb_raise(rb_eRuntimeError, "%s", errmsg); - return NULL; -} - -void -rbffi_Closure_Free(Closure* closure) -{ - if (closure != NULL) { - ClosurePool* pool = closure->pool; - long refcnt; - /* Just push it on the front of the free list */ - closure->next = pool->list; - pool->list = closure; - refcnt = --(pool->refcnt); - if (refcnt == 0) { - cleanup_closure_pool(pool); - } - } -} - -void* -rbffi_Closure_CodeAddress(Closure* handle) -{ - return handle->code; -} - - -static long -getPageSize() -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwPageSize; -#else - return sysconf(_SC_PAGESIZE); -#endif -} - -static void* -allocatePage(void) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); -#else - caddr_t page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - return (page != (caddr_t) -1) ? page : NULL; -#endif -} - -static bool -freePage(void *addr) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - return VirtualFree(addr, 0, MEM_RELEASE); -#else - return munmap(addr, pageSize) == 0; -#endif -} - -static bool -protectPage(void* page) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - DWORD oldProtect; - return VirtualProtect(page, pageSize, PAGE_EXECUTE_READ, &oldProtect); -#else - return mprotect(page, pageSize, PROT_READ | PROT_EXEC) == 0; -#endif -} - -void -rbffi_ClosurePool_Init(VALUE module) -{ - pageSize = getPageSize(); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h deleted file mode 100644 index b842375ae9e8f7ec2eedf40142062afb2779b7f3..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2009, 2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RUBYFFI_CLOSUREPOOL_H -#define RUBYFFI_CLOSUREPOOL_H - -typedef struct ClosurePool_ ClosurePool; -typedef struct Closure_ Closure; - -struct Closure_ { - void* info; /* opaque handle for storing closure-instance specific data */ - void* function; /* closure-instance specific function, called by custom trampoline */ - void* code; /* The native trampoline code location */ - struct ClosurePool_* pool; - Closure* next; -}; - -void rbffi_ClosurePool_Init(VALUE module); - -ClosurePool* rbffi_ClosurePool_New(int closureSize, - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), - void* ctx); - -void rbffi_ClosurePool_Free(ClosurePool *); - -Closure* rbffi_Closure_Alloc(ClosurePool *); -void rbffi_Closure_Free(Closure *); - -void* rbffi_Closure_GetCodeAddress(Closure *); - -#endif /* RUBYFFI_CLOSUREPOOL_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c deleted file mode 100644 index 2d5b827438cfcca2cc387c10c8c1cf7dff787251..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c +++ /dev/null @@ -1,91 +0,0 @@ - -#include - -#include -#include "rbffi.h" - -#include "Type.h" -#include "MappedType.h" - - -VALUE rbffi_DataConverterClass = Qnil; -static ID id_native_type_ivar; - -/* - * Get native type. - * @overload native_type(type) - * @param [String, Symbol, Type] type - * @return [Type] - * Get native type from +type+. - * @overload native_type - * @raise {NotImplementedError} This method must be overriden. - */ -static VALUE -conv_native_type(int argc, VALUE* argv, VALUE self) -{ - if (argc == 0) { - if (!rb_ivar_defined(self, id_native_type_ivar)) { - rb_raise(rb_eNotImpError, "native_type method not overridden and no native_type set"); - } - - return rb_ivar_get(self, id_native_type_ivar); - - } else if (argc == 1) { - VALUE type = rbffi_Type_Find(argv[0]); - - rb_ivar_set(self, id_native_type_ivar, type); - - return type; - - } else { - rb_raise(rb_eArgError, "incorrect arguments"); - } -} - -/* - * call-seq: to_native(value, ctx) - * @param value - * @param ctx - * @return [value] - * Convert to a native type. - */ -static VALUE -conv_to_native(VALUE self, VALUE value, VALUE ctx) -{ - return value; -} - -/* - * call-seq: from_native(value, ctx) - * @param value - * @param ctx - * @return [value] - * Convert from a native type. - */ -static VALUE -conv_from_native(VALUE self, VALUE value, VALUE ctx) -{ - return value; -} - - - -void -rbffi_DataConverter_Init(VALUE moduleFFI) -{ - /* - * Document-module: FFI::DataConverter - * This module is used to extend somes classes and give then a common API. - * - * Most of methods defined here must be overriden. - */ - rbffi_DataConverterClass = rb_define_module_under(moduleFFI, "DataConverter"); - - rb_define_method(rbffi_DataConverterClass, "native_type", conv_native_type, -1); - rb_define_method(rbffi_DataConverterClass, "to_native", conv_to_native, 2); - rb_define_method(rbffi_DataConverterClass, "from_native", conv_from_native, 2); - - id_native_type_ivar = rb_intern("@native_type"); -} - - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c deleted file mode 100644 index 4a2ea386d5a357c67398ebc734f87fe22ad26734..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#ifndef _MSC_VER -# include -#endif -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -# include -# define _WINSOCKAPI_ -# include -# include -#else -# include -#endif -#include -#if defined(_MSC_VER) && !defined(INT8_MIN) -# include "win32/stdint.h" -#endif - -#include - -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "DynamicLibrary.h" - -typedef struct LibrarySymbol_ { - Pointer base; - VALUE library; - VALUE name; -} LibrarySymbol; - -static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags); -static void library_free(Library* lib); - - -static VALUE symbol_allocate(VALUE klass); -static VALUE symbol_new(VALUE library, void* address, VALUE name); -static void symbol_mark(LibrarySymbol* sym); - -static VALUE LibraryClass = Qnil, SymbolClass = Qnil; - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -static void* dl_open(const char* name, int flags); -static void dl_error(char* buf, int size); -#define dl_sym(handle, name) GetProcAddress(handle, name) -#define dl_close(handle) FreeLibrary(handle) -#else -# define dl_open(name, flags) dlopen(name, flags != 0 ? flags : RTLD_LAZY) -# define dl_error(buf, size) do { snprintf(buf, size, "%s", dlerror()); } while(0) -# define dl_sym(handle, name) dlsym(handle, name) -# define dl_close(handle) dlclose(handle) -#endif - -static VALUE -library_allocate(VALUE klass) -{ - Library* library; - return Data_Make_Struct(klass, Library, NULL, library_free, library); -} - -/* - * call-seq: DynamicLibrary.open(libname, libflags) - * @param libname (see #initialize) - * @param libflags (see #initialize) - * @return [FFI::DynamicLibrary] - * @raise {LoadError} if +libname+ cannot be opened - * Open a library. - */ -static VALUE -library_open(VALUE klass, VALUE libname, VALUE libflags) -{ - return library_initialize(library_allocate(klass), libname, libflags); -} - -/* - * call-seq: initialize(libname, libflags) - * @param [String] libname name of library to open - * @param [Fixnum] libflags flags for library to open - * @return [FFI::DynamicLibrary] - * @raise {LoadError} if +libname+ cannot be opened - * A new DynamicLibrary instance. - */ -static VALUE -library_initialize(VALUE self, VALUE libname, VALUE libflags) -{ - Library* library; - int flags; - - Check_Type(libflags, T_FIXNUM); - - Data_Get_Struct(self, Library, library); - flags = libflags != Qnil ? NUM2UINT(libflags) : 0; - - library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags); - if (library->handle == NULL) { - char errmsg[1024]; - dl_error(errmsg, sizeof(errmsg)); - rb_raise(rb_eLoadError, "Could not open library '%s': %s", - libname != Qnil ? StringValueCStr(libname) : "[current process]", - errmsg); - } -#ifdef __CYGWIN__ - // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process") - // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead. - // Since 0 == RTLD_DEFAULT we won't call dl_close later. - if (libname == Qnil) { - dl_close(library->handle); - library->handle = RTLD_DEFAULT; - } -#endif - rb_iv_set(self, "@name", libname != Qnil ? libname : rb_str_new2("[current process]")); - return self; -} - -static VALUE -library_dlsym(VALUE self, VALUE name) -{ - Library* library; - void* address = NULL; - Check_Type(name, T_STRING); - - Data_Get_Struct(self, Library, library); - address = dl_sym(library->handle, StringValueCStr(name)); - - return address != NULL ? symbol_new(self, address, name) : Qnil; -} - -/* - * call-seq: last_error - * @return [String] library's last error string - */ -static VALUE -library_dlerror(VALUE self) -{ - char errmsg[1024]; - dl_error(errmsg, sizeof(errmsg)); - return rb_tainted_str_new2(errmsg); -} - -static void -library_free(Library* library) -{ - /* dlclose() on MacOS tends to segfault - avoid it */ -#ifndef __APPLE__ - if (library->handle != NULL) { - dl_close(library->handle); - } -#endif - xfree(library); -} - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -static void* -dl_open(const char* name, int flags) -{ - if (name == NULL) { - return GetModuleHandle(NULL); - } else { - DWORD dwFlags = PathIsRelativeA(name) ? 0 : LOAD_WITH_ALTERED_SEARCH_PATH; - return LoadLibraryExA(name, NULL, dwFlags); - } -} - -static void -dl_error(char* buf, int size) -{ - FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), - 0, buf, size, NULL); -} -#endif - -static VALUE -symbol_allocate(VALUE klass) -{ - LibrarySymbol* sym; - VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym); - sym->name = Qnil; - sym->library = Qnil; - sym->base.rbParent = Qnil; - - return obj; -} - - -/* - * call-seq: initialize_copy(other) - * @param [Object] other - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -symbol_initialize_copy(VALUE self, VALUE other) -{ - rb_raise(rb_eRuntimeError, "cannot duplicate symbol"); - return Qnil; -} - -static VALUE -symbol_new(VALUE library, void* address, VALUE name) -{ - LibrarySymbol* sym; - VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym); - - sym->base.memory.address = address; - sym->base.memory.size = LONG_MAX; - sym->base.memory.typeSize = 1; - sym->base.memory.flags = MEM_RD | MEM_WR; - sym->library = library; - sym->name = name; - - return obj; -} - -static void -symbol_mark(LibrarySymbol* sym) -{ - rb_gc_mark(sym->library); - rb_gc_mark(sym->name); -} - -/* - * call-seq: inspect - * @return [String] - * Inspect. - */ -static VALUE -symbol_inspect(VALUE self) -{ - LibrarySymbol* sym; - char buf[256]; - - Data_Get_Struct(self, LibrarySymbol, sym); - snprintf(buf, sizeof(buf), "#", - StringValueCStr(sym->name), sym->base.memory.address); - return rb_str_new2(buf); -} - -void -rbffi_DynamicLibrary_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::DynamicLibrary - */ - LibraryClass = rb_define_class_under(moduleFFI, "DynamicLibrary", rb_cObject); - rb_global_variable(&LibraryClass); - /* - * Document-class: FFI::DynamicLibrary::Symbol < FFI::Pointer - * - * An instance of this class represents a library symbol. It may be a {Pointer pointer} to - * a function or to a variable. - */ - SymbolClass = rb_define_class_under(LibraryClass, "Symbol", rbffi_PointerClass); - rb_global_variable(&SymbolClass); - - /* - * Document-const: FFI::NativeLibrary - * Backward compatibility for FFI::DynamicLibrary - */ - rb_define_const(moduleFFI, "NativeLibrary", LibraryClass); /* backwards compat library */ - rb_define_alloc_func(LibraryClass, library_allocate); - rb_define_singleton_method(LibraryClass, "open", library_open, 2); - rb_define_singleton_method(LibraryClass, "last_error", library_dlerror, 0); - rb_define_method(LibraryClass, "initialize", library_initialize, 2); - /* - * Document-method: find_symbol - * call-seq: find_symbol(name) - * @param [String] name library symbol's name - * @return [FFI::DynamicLibrary::Symbol] library symbol - */ - rb_define_method(LibraryClass, "find_symbol", library_dlsym, 1); - /* - * Document-method: find_function - * call-seq: find_function(name) - * @param [String] name library function's name - * @return [FFI::DynamicLibrary::Symbol] library function symbol - */ - rb_define_method(LibraryClass, "find_function", library_dlsym, 1); - /* - * Document-method: find_variable - * call-seq: find_variable(name) - * @param [String] name library variable's name - * @return [FFI::DynamicLibrary::Symbol] library variable symbol - */ - rb_define_method(LibraryClass, "find_variable", library_dlsym, 1); - rb_define_method(LibraryClass, "last_error", library_dlerror, 0); - rb_define_attr(LibraryClass, "name", 1, 0); - - rb_define_alloc_func(SymbolClass, symbol_allocate); - rb_undef_method(SymbolClass, "new"); - rb_define_method(SymbolClass, "inspect", symbol_inspect, 0); - rb_define_method(SymbolClass, "initialize_copy", symbol_initialize_copy, 1); - -#define DEF(x) rb_define_const(LibraryClass, "RTLD_" #x, UINT2NUM(RTLD_##x)) - DEF(LAZY); - DEF(NOW); - DEF(GLOBAL); - DEF(LOCAL); - DEF(NOLOAD); - DEF(NODELETE); - DEF(FIRST); - DEF(DEEPBIND); - DEF(MEMBER); - DEF(BINDING_MASK); - DEF(LOCATION_MASK); - DEF(ALL_MASK); -#undef DEF - -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h deleted file mode 100644 index 97bf7bce6813f614e1ef8cd9af46adced649a1ca..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _LIBRARY_H -#define _LIBRARY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* if these aren't defined (eg. windows), we need sensible defaults */ -#ifndef RTLD_LAZY -#define RTLD_LAZY 1 -#endif - -#ifndef RTLD_NOW -#define RTLD_NOW 2 -#endif - -#ifndef RTLD_LOCAL -#define RTLD_LOCAL 4 -#endif - -#ifndef RTLD_GLOBAL -#define RTLD_GLOBAL 8 -#endif - -/* If these aren't defined, they're not supported so define as 0 */ -#ifndef RTLD_NOLOAD -#define RTLD_NOLOAD 0 -#endif - -#ifndef RTLD_NODELETE -#define RTLD_NODELETE 0 -#endif - -#ifndef RTLD_FIRST -#define RTLD_FIRST 0 -#endif - -#ifndef RTLD_DEEPBIND -#define RTLD_DEEPBIND 0 -#endif - -#ifndef RTLD_MEMBER -#define RTLD_MEMBER 0 -#endif - -/* convenience */ -#ifndef RTLD_BINDING_MASK -#define RTLD_BINDING_MASK (RTLD_LAZY | RTLD_NOW) -#endif - -#ifndef RTLD_LOCATION_MASK -#define RTLD_LOCATION_MASK (RTLD_LOCAL | RTLD_GLOBAL) -#endif - -#ifndef RTLD_ALL_MASK -#define RTLD_ALL_MASK (RTLD_BINDING_MASK | RTLD_LOCATION_MASK | RTLD_NOLOAD | RTLD_NODELETE | RTLD_FIRST | RTLD_DEEPBIND | RTLD_MEMBER) -#endif - -typedef struct Library { - void* handle; -} Library; - -extern void rbffi_DynamicLibrary_Init(VALUE ffiModule); - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBRARY_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c deleted file mode 100644 index 9e861ff9e67022eef4253af684e8d6098c910b98..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c +++ /dev/null @@ -1,1001 +0,0 @@ -/* - * Copyright (c) 2009-2011 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _WIN32 -# include -# include -#endif - -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# if !defined(INT8_MIN) -# include "win32/stdint.h" -# endif -#endif -#include -#if defined(HAVE_RUBY_THREAD_H) -#include -#endif - -#include -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) -#include -#endif -#include - -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Struct.h" -#include "Platform.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "ClosurePool.h" -#include "MappedType.h" -#include "Thread.h" -#include "LongDouble.h" -#include "MethodHandle.h" -#include "Function.h" - -typedef struct Function_ { - Pointer base; - FunctionType* info; - MethodHandle* methodHandle; - bool autorelease; - Closure* closure; - VALUE rbProc; - VALUE rbFunctionInfo; -} Function; - -static void function_mark(Function *); -static void function_free(Function *); -static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc); -static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data); -static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); -static void* callback_with_gvl(void* data); -static VALUE invoke_callback(void* data); -static VALUE save_callback_exception(void* data, VALUE exc); - -#define DEFER_ASYNC_CALLBACK 1 - - -#if defined(DEFER_ASYNC_CALLBACK) -static VALUE async_cb_event(void *); -static VALUE async_cb_call(void *); -#endif - -#ifdef HAVE_RB_THREAD_CALL_WITH_GVL -extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1); -#endif - -VALUE rbffi_FunctionClass = Qnil; - -#if defined(DEFER_ASYNC_CALLBACK) -static VALUE async_cb_thread = Qnil; -#endif - -static ID id_call = 0, id_to_native = 0, id_from_native = 0, id_cbtable = 0, id_cb_ref = 0; - -struct gvl_callback { - Closure* closure; - void* retval; - void** parameters; - bool done; - rbffi_frame_t *frame; -#if defined(DEFER_ASYNC_CALLBACK) - struct gvl_callback* next; -# ifndef _WIN32 - pthread_cond_t async_cond; - pthread_mutex_t async_mutex; -# else - HANDLE async_event; -# endif -#endif -}; - - -#if defined(DEFER_ASYNC_CALLBACK) -static struct gvl_callback* async_cb_list = NULL; -# ifndef _WIN32 - static pthread_mutex_t async_cb_mutex = PTHREAD_MUTEX_INITIALIZER; - static pthread_cond_t async_cb_cond = PTHREAD_COND_INITIALIZER; -# if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - static int async_cb_pipe[2]; -# endif -# else - static HANDLE async_cb_cond; - static CRITICAL_SECTION async_cb_lock; -# if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - static int async_cb_pipe[2]; -# endif -# endif -#endif - - -static VALUE -function_allocate(VALUE klass) -{ - Function *fn; - VALUE obj; - - obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn); - - fn->base.memory.flags = MEM_RD; - fn->base.rbParent = Qnil; - fn->rbProc = Qnil; - fn->rbFunctionInfo = Qnil; - fn->autorelease = true; - - return obj; -} - -static void -function_mark(Function *fn) -{ - rb_gc_mark(fn->base.rbParent); - rb_gc_mark(fn->rbProc); - rb_gc_mark(fn->rbFunctionInfo); -} - -static void -function_free(Function *fn) -{ - if (fn->methodHandle != NULL) { - rbffi_MethodHandle_Free(fn->methodHandle); - } - - if (fn->closure != NULL && fn->autorelease) { - rbffi_Closure_Free(fn->closure); - } - - xfree(fn); -} - -/* - * @param [Type, Symbol] return_type return type for the function - * @param [Array] param_types array of parameters types - * @param [Hash] options see {FFI::FunctionType} for available options - * @return [self] - * A new Function instance. - * - * Define a function from a Proc or a block. - * - * @overload initialize(return_type, param_types, options = {}) { |i| ... } - * @yieldparam i parameters for the function - * @overload initialize(return_type, param_types, proc, options = {}) - * @param [Proc] proc - */ -static VALUE -function_initialize(int argc, VALUE* argv, VALUE self) -{ - - VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil; - VALUE rbFunctionInfo = Qnil; - VALUE infoArgv[3]; - int nargs; - - nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions); - - /* - * Callback with block, - * e.g. Function.new(:int, [ :int ]) { |i| blah } - * or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah } - */ - if (rb_block_given_p()) { - if (nargs > 3) { - rb_raise(rb_eArgError, "cannot create function with both proc/address and block"); - } - rbOptions = rbProc; - rbProc = rb_block_proc(); - } else { - /* Callback with proc, or Function with address - * e.g. Function.new(:int, [ :int ], Proc.new { |i| }) - * Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall }) - * Function.new(:int, [ :int ], addr) - * Function.new(:int, [ :int ], addr, { :convention => :stdcall }) - */ - } - - infoArgv[0] = rbReturnType; - infoArgv[1] = rbParamTypes; - infoArgv[2] = rbOptions; - rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass); - - function_init(self, rbFunctionInfo, rbProc); - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -function_initialize_copy(VALUE self, VALUE other) -{ - rb_raise(rb_eRuntimeError, "cannot duplicate function instances"); - return Qnil; -} - -VALUE -rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc) -{ - return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc); -} - -VALUE -rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc) -{ - VALUE callback, cbref, cbTable; - Function* fp; - - cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil; - /* If the first callback reference has the same function function signature, use it */ - if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) { - Data_Get_Struct(cbref, Function, fp); - if (fp->rbFunctionInfo == rbFunctionInfo) { - return cbref; - } - } - - cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil; - if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) { - return callback; - } - - /* No existing function for the proc with that signature, create a new one and cache it */ - callback = rbffi_Function_NewInstance(rbFunctionInfo, proc); - if (cbref == Qnil) { - /* If there is no other cb already cached for this proc, we can use the ivar slot */ - rb_ivar_set(proc, id_cb_ref, callback); - } else { - /* The proc instance has been used as more than one type of callback, store extras in a hash */ - cbTable = rb_hash_new(); - rb_ivar_set(proc, id_cbtable, cbTable); - rb_hash_aset(cbTable, rbFunctionInfo, callback); - } - - return callback; -} - -static VALUE -function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc) -{ - Function* fn = NULL; - - Data_Get_Struct(self, Function, fn); - - fn->rbFunctionInfo = rbFunctionInfo; - - Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info); - - if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) { - Pointer* orig; - Data_Get_Struct(rbProc, Pointer, orig); - fn->base.memory = orig->memory; - fn->base.rbParent = rbProc; - - } else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) { - if (fn->info->closurePool == NULL) { - fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info); - if (fn->info->closurePool == NULL) { - rb_raise(rb_eNoMemError, "failed to create closure pool"); - } - } - -#if defined(DEFER_ASYNC_CALLBACK) - if (async_cb_thread == Qnil) { -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && defined(_WIN32) - _pipe(async_cb_pipe, 1024, O_BINARY); -#elif !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - pipe(async_cb_pipe); - fcntl(async_cb_pipe[0], F_SETFL, fcntl(async_cb_pipe[0], F_GETFL) | O_NONBLOCK); - fcntl(async_cb_pipe[1], F_SETFL, fcntl(async_cb_pipe[1], F_GETFL) | O_NONBLOCK); -#endif - async_cb_thread = rb_thread_create(async_cb_event, NULL); - } - -#endif - - fn->closure = rbffi_Closure_Alloc(fn->info->closurePool); - fn->closure->info = fn; - fn->base.memory.address = fn->closure->code; - fn->base.memory.size = sizeof(*fn->closure); - fn->autorelease = true; - - } else { - rb_raise(rb_eTypeError, "wrong argument type %s, expected pointer or proc", - rb_obj_classname(rbProc)); - } - - fn->rbProc = rbProc; - - return self; -} - -/* - * call-seq: call(*args) - * @param [Array] args function arguments - * @return [FFI::Type] - * Call the function - */ -static VALUE -function_call(int argc, VALUE* argv, VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info); -} - -/* - * call-seq: attach(m, name) - * @param [Module] m - * @param [String] name - * @return [self] - * Attach a Function to the Module +m+ as +name+. - */ -static VALUE -function_attach(VALUE self, VALUE module, VALUE name) -{ - Function* fn; - char var[1024]; - - Data_Get_Struct(self, Function, fn); - - if (fn->info->parameterCount == -1) { - rb_raise(rb_eRuntimeError, "cannot attach variadic functions"); - return Qnil; - } - - if (!rb_obj_is_kind_of(module, rb_cModule)) { - rb_raise(rb_eRuntimeError, "trying to attach function to non-module"); - return Qnil; - } - - if (fn->methodHandle == NULL) { - fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->base.memory.address); - } - - /* - * Stash the Function in a module variable so it does not get garbage collected - */ - snprintf(var, sizeof(var), "@@%s", StringValueCStr(name)); - rb_cv_set(module, var, self); - - rb_define_singleton_method(module, StringValueCStr(name), - rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); - - - rb_define_method(module, StringValueCStr(name), - rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); - - return self; -} - -/* - * call-seq: autorelease = autorelease - * @param [Boolean] autorelease - * @return [self] - * Set +autorelease+ attribute (See {Pointer}). - */ -static VALUE -function_set_autorelease(VALUE self, VALUE autorelease) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - fn->autorelease = RTEST(autorelease); - - return self; -} - -static VALUE -function_autorelease_p(VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - return fn->autorelease ? Qtrue : Qfalse; -} - -/* - * call-seq: free - * @return [self] - * Free memory allocated by Function. - */ -static VALUE -function_release(VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - if (fn->closure == NULL) { - rb_raise(rb_eRuntimeError, "cannot free function which was not allocated"); - } - - rbffi_Closure_Free(fn->closure); - fn->closure = NULL; - - return self; -} - -static void -callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data) -{ - struct gvl_callback cb = { 0 }; - - cb.closure = (Closure *) user_data; - cb.retval = retval; - cb.parameters = parameters; - cb.done = false; - cb.frame = rbffi_frame_current(); - - if (cb.frame != NULL) cb.frame->exc = Qnil; - if (cb.frame != NULL && cb.frame->has_gvl) { - callback_with_gvl(&cb); - -#if defined(HAVE_RB_THREAD_CALL_WITH_GVL) - } else if (cb.frame != NULL) { - rb_thread_call_with_gvl(callback_with_gvl, &cb); -#endif -#if defined(DEFER_ASYNC_CALLBACK) && !defined(_WIN32) - } else { - bool empty = false; - - pthread_mutex_init(&cb.async_mutex, NULL); - pthread_cond_init(&cb.async_cond, NULL); - - /* Now signal the async callback thread */ - pthread_mutex_lock(&async_cb_mutex); - empty = async_cb_list == NULL; - cb.next = async_cb_list; - async_cb_list = &cb; - -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - pthread_mutex_unlock(&async_cb_mutex); - /* Only signal if the list was empty */ - if (empty) { - char c; - write(async_cb_pipe[1], &c, 1); - } -#else - pthread_cond_signal(&async_cb_cond); - pthread_mutex_unlock(&async_cb_mutex); -#endif - - /* Wait for the thread executing the ruby callback to signal it is done */ - pthread_mutex_lock(&cb.async_mutex); - while (!cb.done) { - pthread_cond_wait(&cb.async_cond, &cb.async_mutex); - } - pthread_mutex_unlock(&cb.async_mutex); - pthread_cond_destroy(&cb.async_cond); - pthread_mutex_destroy(&cb.async_mutex); - -#elif defined(DEFER_ASYNC_CALLBACK) && defined(_WIN32) - } else { - bool empty = false; - - cb.async_event = CreateEvent(NULL, FALSE, FALSE, NULL); - - /* Now signal the async callback thread */ - EnterCriticalSection(&async_cb_lock); - empty = async_cb_list == NULL; - cb.next = async_cb_list; - async_cb_list = &cb; - LeaveCriticalSection(&async_cb_lock); - -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - /* Only signal if the list was empty */ - if (empty) { - char c; - write(async_cb_pipe[1], &c, 1); - } -#else - SetEvent(async_cb_cond); -#endif - - /* Wait for the thread executing the ruby callback to signal it is done */ - WaitForSingleObject(cb.async_event, INFINITE); - CloseHandle(cb.async_event); -#endif - } -} - -#if defined(DEFER_ASYNC_CALLBACK) -struct async_wait { - void* cb; - bool stop; -}; - -static void * async_cb_wait(void *); -static void async_cb_stop(void *); - -#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) -static VALUE -async_cb_event(void* unused) -{ - struct async_wait w = { 0 }; - - w.stop = false; - while (!w.stop) { -#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) - rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); -#else - rb_thread_blocking_region(async_cb_wait, &w, async_cb_stop, &w); -#endif - if (w.cb != NULL) { - /* Start up a new ruby thread to run the ruby callback */ - rb_thread_create(async_cb_call, w.cb); - } - } - - return Qnil; -} - -#elif defined(_WIN32) -static VALUE -async_cb_event(void* unused) -{ - while (true) { - struct gvl_callback* cb; - char buf[64]; - fd_set rfds; - - FD_ZERO(&rfds); - FD_SET(async_cb_pipe[0], &rfds); - rb_thread_select(async_cb_pipe[0] + 1, &rfds, NULL, NULL, NULL); - read(async_cb_pipe[0], buf, sizeof(buf)); - - EnterCriticalSection(&async_cb_lock); - cb = async_cb_list; - async_cb_list = NULL; - LeaveCriticalSection(&async_cb_lock); - - while (cb != NULL) { - struct gvl_callback* next = cb->next; - /* Start up a new ruby thread to run the ruby callback */ - rb_thread_create(async_cb_call, cb); - cb = next; - } - } - - return Qnil; -} -#else -static VALUE -async_cb_event(void* unused) -{ - while (true) { - struct gvl_callback* cb; - char buf[64]; - - if (read(async_cb_pipe[0], buf, sizeof(buf)) < 0) { - rb_thread_wait_fd(async_cb_pipe[0]); - while (read(async_cb_pipe[0], buf, sizeof (buf)) < 0) { - if (rb_io_wait_readable(async_cb_pipe[0]) != Qtrue) { - return Qfalse; - } - } - } - - pthread_mutex_lock(&async_cb_mutex); - cb = async_cb_list; - async_cb_list = NULL; - pthread_mutex_unlock(&async_cb_mutex); - - while (cb != NULL) { - struct gvl_callback* next = cb->next; - /* Start up a new ruby thread to run the ruby callback */ - rb_thread_create(async_cb_call, cb); - cb = next; - } - } - - return Qnil; -} -#endif - -#ifdef _WIN32 -static void * -async_cb_wait(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - w->cb = NULL; - - EnterCriticalSection(&async_cb_lock); - - while (!w->stop && async_cb_list == NULL) { - LeaveCriticalSection(&async_cb_lock); - WaitForSingleObject(async_cb_cond, INFINITE); - EnterCriticalSection(&async_cb_lock); - } - - if (async_cb_list != NULL) { - w->cb = async_cb_list; - async_cb_list = async_cb_list->next; - } - - LeaveCriticalSection(&async_cb_lock); - - return NULL; -} - -static void -async_cb_stop(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - EnterCriticalSection(&async_cb_lock); - w->stop = true; - LeaveCriticalSection(&async_cb_lock); - SetEvent(async_cb_cond); -} - -#else -static void * -async_cb_wait(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - w->cb = NULL; - - pthread_mutex_lock(&async_cb_mutex); - - while (!w->stop && async_cb_list == NULL) { - pthread_cond_wait(&async_cb_cond, &async_cb_mutex); - } - - if (async_cb_list != NULL) { - w->cb = async_cb_list; - async_cb_list = async_cb_list->next; - } - - pthread_mutex_unlock(&async_cb_mutex); - - return NULL; -} - -static void -async_cb_stop(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - pthread_mutex_lock(&async_cb_mutex); - w->stop = true; - pthread_cond_signal(&async_cb_cond); - pthread_mutex_unlock(&async_cb_mutex); -} -#endif - -static VALUE -async_cb_call(void *data) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - callback_with_gvl(data); - - /* Signal the original native thread that the ruby code has completed */ -#ifdef _WIN32 - SetEvent(cb->async_event); -#else - pthread_mutex_lock(&cb->async_mutex); - cb->done = true; - pthread_cond_signal(&cb->async_cond); - pthread_mutex_unlock(&cb->async_mutex); -#endif - - return Qnil; -} - -#endif - -static void * -callback_with_gvl(void* data) -{ - rb_rescue2(invoke_callback, (VALUE) data, save_callback_exception, (VALUE) data, rb_eException, (VALUE) 0); - return NULL; -} - -static VALUE -invoke_callback(void* data) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - Function* fn = (Function *) cb->closure->info; - FunctionType *cbInfo = fn->info; - Type* returnType = cbInfo->returnType; - void* retval = cb->retval; - void** parameters = cb->parameters; - VALUE* rbParams; - VALUE rbReturnType = cbInfo->rbReturnType; - VALUE rbReturnValue; - int i; - - rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount); - for (i = 0; i < cbInfo->parameterCount; ++i) { - VALUE param; - Type* paramType = cbInfo->parameterTypes[i]; - VALUE rbParamType = rb_ary_entry(cbInfo->rbParameterTypes, i); - - if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { - rbParamType = ((MappedType *) paramType)->rbType; - paramType = ((MappedType *) paramType)->type; - } - - switch (paramType->nativeType) { - case NATIVE_INT8: - param = INT2NUM(*(int8_t *) parameters[i]); - break; - case NATIVE_UINT8: - param = UINT2NUM(*(uint8_t *) parameters[i]); - break; - case NATIVE_INT16: - param = INT2NUM(*(int16_t *) parameters[i]); - break; - case NATIVE_UINT16: - param = UINT2NUM(*(uint16_t *) parameters[i]); - break; - case NATIVE_INT32: - param = INT2NUM(*(int32_t *) parameters[i]); - break; - case NATIVE_UINT32: - param = UINT2NUM(*(uint32_t *) parameters[i]); - break; - case NATIVE_INT64: - param = LL2NUM(*(int64_t *) parameters[i]); - break; - case NATIVE_UINT64: - param = ULL2NUM(*(uint64_t *) parameters[i]); - break; - case NATIVE_LONG: - param = LONG2NUM(*(long *) parameters[i]); - break; - case NATIVE_ULONG: - param = ULONG2NUM(*(unsigned long *) parameters[i]); - break; - case NATIVE_FLOAT32: - param = rb_float_new(*(float *) parameters[i]); - break; - case NATIVE_FLOAT64: - param = rb_float_new(*(double *) parameters[i]); - break; - case NATIVE_LONGDOUBLE: - param = rbffi_longdouble_new(*(long double *) parameters[i]); - break; - case NATIVE_STRING: - param = (*(void **) parameters[i] != NULL) ? rb_tainted_str_new2(*(char **) parameters[i]) : Qnil; - break; - case NATIVE_POINTER: - param = rbffi_Pointer_NewInstance(*(void **) parameters[i]); - break; - case NATIVE_BOOL: - param = (*(uint8_t *) parameters[i]) ? Qtrue : Qfalse; - break; - - case NATIVE_FUNCTION: - case NATIVE_CALLBACK: - case NATIVE_STRUCT: - param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]); - break; - - default: - param = Qnil; - break; - } - - /* Convert the native value into a custom ruby value */ - if (unlikely(cbInfo->parameterTypes[i]->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { param, Qnil }; - param = rb_funcall2(((MappedType *) cbInfo->parameterTypes[i])->rbConverter, id_from_native, 2, values); - } - - rbParams[i] = param; - } - - rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams); - - if (unlikely(returnType->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { rbReturnValue, Qnil }; - rbReturnValue = rb_funcall2(((MappedType *) returnType)->rbConverter, id_to_native, 2, values); - rbReturnType = ((MappedType *) returnType)->rbType; - returnType = ((MappedType* ) returnType)->type; - } - - if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) { - memset(retval, 0, returnType->ffiType->size); - } else switch (returnType->nativeType) { - case NATIVE_INT8: - case NATIVE_INT16: - case NATIVE_INT32: - *((ffi_sarg *) retval) = NUM2INT(rbReturnValue); - break; - case NATIVE_UINT8: - case NATIVE_UINT16: - case NATIVE_UINT32: - *((ffi_arg *) retval) = NUM2UINT(rbReturnValue); - break; - case NATIVE_INT64: - *((int64_t *) retval) = NUM2LL(rbReturnValue); - break; - case NATIVE_UINT64: - *((uint64_t *) retval) = NUM2ULL(rbReturnValue); - break; - case NATIVE_LONG: - *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue); - break; - case NATIVE_ULONG: - *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue); - break; - case NATIVE_FLOAT32: - *((float *) retval) = (float) NUM2DBL(rbReturnValue); - break; - case NATIVE_FLOAT64: - *((double *) retval) = NUM2DBL(rbReturnValue); - break; - case NATIVE_POINTER: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { - *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; - } else { - /* Default to returning NULL if not a value pointer object. handles nil case as well */ - *((void **) retval) = NULL; - } - break; - - case NATIVE_BOOL: - *((ffi_arg *) retval) = rbReturnValue == Qtrue; - break; - - case NATIVE_FUNCTION: - case NATIVE_CALLBACK: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { - - *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; - - } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) { - VALUE function; - - function = rbffi_Function_ForProc(rbReturnType, rbReturnValue); - - *((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address; - } else { - *((void **) retval) = NULL; - } - break; - - case NATIVE_STRUCT: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) { - AbstractMemory* memory = ((Struct *) DATA_PTR(rbReturnValue))->pointer; - - if (memory->address != NULL) { - memcpy(retval, memory->address, returnType->ffiType->size); - - } else { - memset(retval, 0, returnType->ffiType->size); - } - - } else { - memset(retval, 0, returnType->ffiType->size); - } - break; - - default: - *((ffi_arg *) retval) = 0; - break; - } - - return Qnil; -} - -static VALUE -save_callback_exception(void* data, VALUE exc) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - memset(cb->retval, 0, ((Function *) cb->closure->info)->info->returnType->ffiType->size); - if (cb->frame != NULL) cb->frame->exc = exc; - - return Qnil; -} - -static bool -callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - FunctionType* fnInfo = (FunctionType *) ctx; - ffi_status ffiStatus; - - ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); - if (ffiStatus != FFI_OK) { - snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus); - return false; - } - - return true; -} - -void -rbffi_Function_Init(VALUE moduleFFI) -{ - rbffi_FunctionInfo_Init(moduleFFI); - /* - * Document-class: FFI::Function < FFI::Pointer - */ - rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass); - - rb_global_variable(&rbffi_FunctionClass); - rb_define_alloc_func(rbffi_FunctionClass, function_allocate); - - rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1); - rb_define_method(rbffi_FunctionClass, "initialize_copy", function_initialize_copy, 1); - rb_define_method(rbffi_FunctionClass, "call", function_call, -1); - rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2); - rb_define_method(rbffi_FunctionClass, "free", function_release, 0); - rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1); - /* - * call-seq: autorelease - * @return [Boolean] - * Get +autorelease+ attribute. - * Synonymous for {#autorelease?}. - */ - rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0); - /* - * call-seq: autorelease? - * @return [Boolean] +autorelease+ attribute - * Get +autorelease+ attribute. - */ - rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0); - - id_call = rb_intern("call"); - id_cbtable = rb_intern("@__ffi_callback_table__"); - id_cb_ref = rb_intern("@__ffi_callback__"); - id_to_native = rb_intern("to_native"); - id_from_native = rb_intern("from_native"); -#if defined(_WIN32) - InitializeCriticalSection(&async_cb_lock); - async_cb_cond = CreateEvent(NULL, FALSE, FALSE, NULL); -#endif -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h deleted file mode 100644 index 052aaf6a28142806acde84e3aa70f6343c90abbc..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_FUNCTION_H -#define RBFFI_FUNCTION_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _MSC_VER -# include -#else -# include "win32/stdbool.h" -#endif - -#include - -typedef struct FunctionType_ FunctionType; - -#include "Type.h" -#include "Call.h" -#include "ClosurePool.h" - -struct FunctionType_ { - Type type; /* The native type of a FunctionInfo object */ - VALUE rbReturnType; - VALUE rbParameterTypes; - - Type* returnType; - Type** parameterTypes; - NativeType* nativeParameterTypes; - ffi_type* ffiReturnType; - ffi_type** ffiParameterTypes; - ffi_cif ffi_cif; - Invoker invoke; - ClosurePool* closurePool; - int parameterCount; - int flags; - ffi_abi abi; - int callbackCount; - VALUE* callbackParameters; - VALUE rbEnums; - bool ignoreErrno; - bool blocking; - bool hasStruct; -}; - -extern VALUE rbffi_FunctionTypeClass, rbffi_FunctionClass; - -void rbffi_Function_Init(VALUE moduleFFI); -VALUE rbffi_Function_NewInstance(VALUE functionInfo, VALUE proc); -VALUE rbffi_Function_ForProc(VALUE cbInfo, VALUE proc); -void rbffi_FunctionInfo_Init(VALUE moduleFFI); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_FUNCTION_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c deleted file mode 100644 index 8085c870eb8727510ea390257cf465000416d1c0..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (C) 2009 Andrea Fazzi - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -#endif -#include -#include - -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -#endif - -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Types.h" -#include "Type.h" -#include "StructByValue.h" -#include "Function.h" - -static VALUE fntype_allocate(VALUE klass); -static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self); -static void fntype_mark(FunctionType*); -static void fntype_free(FunctionType *); - -VALUE rbffi_FunctionTypeClass = Qnil; - -static VALUE -fntype_allocate(VALUE klass) -{ - FunctionType* fnInfo; - VALUE obj = Data_Make_Struct(klass, FunctionType, fntype_mark, fntype_free, fnInfo); - - fnInfo->type.ffiType = &ffi_type_pointer; - fnInfo->type.nativeType = NATIVE_FUNCTION; - fnInfo->rbReturnType = Qnil; - fnInfo->rbParameterTypes = Qnil; - fnInfo->rbEnums = Qnil; - fnInfo->invoke = rbffi_CallFunction; - fnInfo->closurePool = NULL; - - return obj; -} - -static void -fntype_mark(FunctionType* fnInfo) -{ - rb_gc_mark(fnInfo->rbReturnType); - rb_gc_mark(fnInfo->rbParameterTypes); - rb_gc_mark(fnInfo->rbEnums); - if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) { - rb_gc_mark_locations(&fnInfo->callbackParameters[0], &fnInfo->callbackParameters[fnInfo->callbackCount]); - } -} - -static void -fntype_free(FunctionType* fnInfo) -{ - xfree(fnInfo->parameterTypes); - xfree(fnInfo->ffiParameterTypes); - xfree(fnInfo->nativeParameterTypes); - xfree(fnInfo->callbackParameters); - if (fnInfo->closurePool != NULL) { - rbffi_ClosurePool_Free(fnInfo->closurePool); - } - xfree(fnInfo); -} - -/* - * call-seq: initialize(return_type, param_types, options={}) - * @param [Type, Symbol] return_type return type for the function - * @param [Array] param_types array of parameters types - * @param [Hash] options - * @option options [Boolean] :blocking set to true if the C function is a blocking call - * @option options [Symbol] :convention calling convention see {FFI::Library#calling_convention} - * @option options [FFI::Enums] :enums - * @return [self] - * A new FunctionType instance. - */ -static VALUE -fntype_initialize(int argc, VALUE* argv, VALUE self) -{ - FunctionType *fnInfo; - ffi_status status; - VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil; - VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil; -#if defined(X86_WIN32) - VALUE rbConventionStr; -#endif - int i, nargs; - - nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions); - if (nargs >= 3 && rbOptions != Qnil) { - rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention"))); - rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums"))); - rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking"))); - } - - Check_Type(rbParamTypes, T_ARRAY); - - Data_Get_Struct(self, FunctionType, fnInfo); - fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes); - fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes)); - fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *)); - fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes)); - fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount); - fnInfo->rbEnums = rbEnums; - fnInfo->blocking = RTEST(rbBlocking); - fnInfo->hasStruct = false; - - for (i = 0; i < fnInfo->parameterCount; ++i) { - VALUE entry = rb_ary_entry(rbParamTypes, i); - VALUE type = rbffi_Type_Lookup(entry); - - if (!RTEST(type)) { - VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); - } - - if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) { - REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1); - fnInfo->callbackParameters[fnInfo->callbackCount++] = type; - } - - if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) { - fnInfo->hasStruct = true; - } - - rb_ary_push(fnInfo->rbParameterTypes, type); - Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]); - fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType; - fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType; - } - - fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType); - if (!RTEST(fnInfo->rbReturnType)) { - VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); - } - - if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) { - fnInfo->hasStruct = true; - } - - Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType); - fnInfo->ffiReturnType = fnInfo->returnType->ffiType; - - -#if defined(X86_WIN32) - rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil; - fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) - ? FFI_STDCALL : FFI_DEFAULT_ABI; -#else - fnInfo->abi = FFI_DEFAULT_ABI; -#endif - - status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount, - fnInfo->ffiReturnType, fnInfo->ffiParameterTypes); - switch (status) { - case FFI_BAD_ABI: - rb_raise(rb_eArgError, "Invalid ABI specified"); - case FFI_BAD_TYPEDEF: - rb_raise(rb_eArgError, "Invalid argument type specified"); - case FFI_OK: - break; - default: - rb_raise(rb_eArgError, "Unknown FFI error"); - } - - fnInfo->invoke = rbffi_GetInvoker(fnInfo); - - return self; -} - -/* - * call-seq: result_type - * @return [Type] - * Get the return type of the function type - */ -static VALUE -fntype_result_type(VALUE self) -{ - FunctionType* ft; - - Data_Get_Struct(self, FunctionType, ft); - - return ft->rbReturnType; -} - -/* - * call-seq: param_types - * @return [Array] - * Get parameters types. - */ -static VALUE -fntype_param_types(VALUE self) -{ - FunctionType* ft; - - Data_Get_Struct(self, FunctionType, ft); - - return rb_ary_dup(ft->rbParameterTypes); -} - -void -rbffi_FunctionInfo_Init(VALUE moduleFFI) -{ - VALUE ffi_Type; - - ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::FunctionType < FFI::Type - */ - rbffi_FunctionTypeClass = rb_define_class_under(moduleFFI, "FunctionType",ffi_Type); - rb_global_variable(&rbffi_FunctionTypeClass); - /* - * Document-const: FFI::CallbackInfo = FFI::FunctionType - */ - rb_define_const(moduleFFI, "CallbackInfo", rbffi_FunctionTypeClass); - /* - * Document-const: FFI::FunctionInfo = FFI::FunctionType - */ - rb_define_const(moduleFFI, "FunctionInfo", rbffi_FunctionTypeClass); - /* - * Document-const: FFI::Type::Function = FFI::FunctionType - */ - rb_define_const(ffi_Type, "Function", rbffi_FunctionTypeClass); - - rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate); - rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1); - rb_define_method(rbffi_FunctionTypeClass, "result_type", fntype_result_type, 0); - rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0); - -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c deleted file mode 100644 index 795a42e5594340eda7c0420bfe1daaffbc6c12f2..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Aman Gupta - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -#endif -#include -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -#endif -#include -#include - -#include "LastError.h" - -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) -# include -# define USE_PTHREAD_LOCAL -#endif - -typedef struct ThreadData { - int td_errno; -} ThreadData; - -#if defined(USE_PTHREAD_LOCAL) -static pthread_key_t threadDataKey; -#endif - -static inline ThreadData* thread_data_get(void); - -#if defined(USE_PTHREAD_LOCAL) - -static ThreadData* -thread_data_init(void) -{ - ThreadData* td = xcalloc(1, sizeof(ThreadData)); - - pthread_setspecific(threadDataKey, td); - - return td; -} - - -static inline ThreadData* -thread_data_get(void) -{ - ThreadData* td = pthread_getspecific(threadDataKey); - return td != NULL ? td : thread_data_init(); -} - -static void -thread_data_free(void *ptr) -{ - xfree(ptr); -} - -#else -static ID id_thread_data; - -static ThreadData* -thread_data_init(void) -{ - ThreadData* td; - VALUE obj; - - obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td); - rb_thread_local_aset(rb_thread_current(), id_thread_data, obj); - - return td; -} - -static inline ThreadData* -thread_data_get() -{ - VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data); - - if (obj != Qnil && TYPE(obj) == T_DATA) { - return (ThreadData *) DATA_PTR(obj); - } - - return thread_data_init(); -} - -#endif - - -/* - * call-seq: error - * @return [Numeric] - * Get +errno+ value. - */ -static VALUE -get_last_error(VALUE self) -{ - return INT2NUM(thread_data_get()->td_errno); -} - - -/* - * call-seq: error(error) - * @param [Numeric] error - * @return [nil] - * Set +errno+ value. - */ -static VALUE -set_last_error(VALUE self, VALUE error) -{ - -#ifdef _WIN32 - SetLastError(NUM2INT(error)); -#else - errno = NUM2INT(error); -#endif - - return Qnil; -} - - -void -rbffi_save_errno(void) -{ - int error = 0; - -#ifdef _WIN32 - error = GetLastError(); -#else - error = errno; -#endif - - thread_data_get()->td_errno = error; -} - - -void -rbffi_LastError_Init(VALUE moduleFFI) -{ - /* - * Document-module: FFI::LastError - * This module defines a couple of method to set and get +errno+ - * for current thread. - */ - VALUE moduleError = rb_define_module_under(moduleFFI, "LastError"); - - rb_define_module_function(moduleError, "error", get_last_error, 0); - rb_define_module_function(moduleError, "error=", set_last_error, 1); - -#if defined(USE_PTHREAD_LOCAL) - pthread_key_create(&threadDataKey, thread_data_free); -#else - id_thread_data = rb_intern("ffi_thread_local_data"); -#endif /* USE_PTHREAD_LOCAL */ -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h deleted file mode 100644 index ee1dfbb2d9a41787f702670663e34dbdb7b4e551..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_LASTERROR_H -#define RBFFI_LASTERROR_H - -#ifdef __cplusplus -extern "C" { -#endif - - -void rbffi_LastError_Init(VALUE moduleFFI); - -void rbffi_save_errno(void); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_LASTERROR_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c deleted file mode 100644 index a21883afed9229ce5651533bae101a305917048a..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "LongDouble.h" -#include -#include -#include - -#if defined (__CYGWIN__) || defined(__INTERIX) -# define strtold(str, endptr) ((long double) strtod((str), (endptr))) -#endif /* defined (__CYGWIN__) */ - -static VALUE rb_cBigDecimal = Qnil; -static VALUE bigdecimal_load(VALUE unused); -static VALUE bigdecimal_failed(VALUE value); - -VALUE -rbffi_longdouble_new(long double ld) -{ - if (!RTEST(rb_cBigDecimal)) { - /* allow fallback if the bigdecimal library is unavailable in future ruby versions */ - rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject); - } - - if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) { - char buf[128]; - return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld))); - } - - /* Fall through to handling as a float */ - return rb_float_new(ld); -} - -long double -rbffi_num2longdouble(VALUE value) -{ - if (TYPE(value) == T_FLOAT) { - return rb_num2dbl(value); - } - - if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) { - rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal")); - } - - if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) { - VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E")); - return strtold(RSTRING_PTR(s), NULL); - } - - /* Fall through to handling as a float */ - return rb_num2dbl(value); -} - - -static VALUE -bigdecimal_load(VALUE unused) -{ - rb_require("bigdecimal"); - return rb_const_get(rb_cObject, rb_intern("BigDecimal")); -} - -static VALUE -bigdecimal_failed(VALUE value) -{ - return value; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h deleted file mode 100644 index 2e52ccb33db74f44217c37bc6625ab5f566e84b7..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2012, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_LONGDOUBLE_H -#define RBFFI_LONGDOUBLE_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#define strtold strtod -#endif - -extern VALUE rbffi_longdouble_new(long double ld); -extern long double rbffi_num2longdouble(VALUE value); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_LONGDOUBLE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile deleted file mode 100644 index f3970538c7ef0af119b903d287d057822b45894a..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile +++ /dev/null @@ -1,263 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@:) -ECHO = $(ECHO1:0=@echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -hdrdir = $(topdir) -arch_hdrdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr -rubysitearchprefix = $(rubylibprefix)/$(sitearch) -rubyarchprefix = $(rubylibprefix)/$(arch) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) -sitearchhdrdir = $(sitehdrdir)/$(sitearch) -rubyarchhdrdir = $(rubyhdrdir)/$(arch) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(vendorlibdir)/$(sitearch) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)./.gem.20190924-36740-x1wmd8 -sitelibdir = $(DESTDIR)./.gem.20190924-36740-x1wmd8 -sitedir = $(DESTDIR)/Library/Ruby/Site -rubyarchdir = $(rubylibdir)/$(arch) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(DESTDIR)/usr/share/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(DESTDIR)/usr/share/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(DESTDIR)/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk$(prefix)/include -localstatedir = $(prefix)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/Library/Ruby/Site -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC = xcrun clang -CXX = xcrun clang++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework Foundation -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) - -RUBY_EXTCONF_H = extconf.h -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = $(optflags) $(debugflags) $(warnflags) -optflags = -debugflags = -g -warnflags = -CCDLFLAGS = -CFLAGS = $(CCDLFLAGS) -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -Os -pipe $(ARCH_FLAG) -ldflags = -L. -dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) -RUBY_SO_NAME = ruby.2.3.0 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = universal-darwin18 -sitearch = $(arch) -ruby_version = 2.3.0 -ruby = $(bindir)/$(RUBY_BASE_NAME) -RUBY = $(ruby) -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H) - -RM = rm -f -RM_RF = $(RUBY) -run -e rm -- -rf -RMDIRS = rmdir -p -MAKEDIRS = mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = - -libpath = . $(libdir) -LIBPATH = -L. -L$(libdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc -ORIG_SRCS = AbstractMemory.c ArrayType.c Buffer.c Call.c ClosurePool.c DataConverter.c DynamicLibrary.c Function.c FunctionInfo.c LastError.c LongDouble.c MappedType.c MemoryPointer.c MethodHandle.c Platform.c Pointer.c Struct.c StructByReference.c StructByValue.c StructLayout.c Thread.c Type.c Types.c Variadic.c ffi.c -SRCS = $(ORIG_SRCS) -OBJS = AbstractMemory.o ArrayType.o Buffer.o Call.o ClosurePool.o DataConverter.o DynamicLibrary.o Function.o FunctionInfo.o LastError.o LongDouble.o MappedType.o MemoryPointer.o MethodHandle.o Platform.o Pointer.o Struct.o StructByReference.o StructByValue.o StructLayout.o Thread.o Type.o Types.o Variadic.o ffi.o -HDRS = $(srcdir)/Type.h $(srcdir)/rbffi_endian.h $(srcdir)/MappedType.h $(srcdir)/Types.h $(srcdir)/LastError.h $(srcdir)/ArrayType.h $(srcdir)/StructByReference.h $(srcdir)/extconf.h $(srcdir)/StructByValue.h $(srcdir)/AbstractMemory.h $(srcdir)/ClosurePool.h $(srcdir)/Call.h $(srcdir)/MethodHandle.h $(srcdir)/Struct.h $(srcdir)/rbffi.h $(srcdir)/Thread.h $(srcdir)/compat.h $(srcdir)/DynamicLibrary.h $(srcdir)/Platform.h $(srcdir)/Function.h $(srcdir)/LongDouble.h $(srcdir)/MemoryPointer.h $(srcdir)/Pointer.h -TARGET = ffi_c -TARGET_NAME = ffi_c -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).bundle -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) -ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) - -TARGET_SO = $(DLLIB) -CLEANLIBS = $(TARGET).bundle -CLEANOBJS = *.o *.bak - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.time - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb install-rb-default -install-rb-default: pre-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -pre-install-rb-default: - @$(NULLCMD) -$(TIMESTAMP_DIR)/.RUBYARCHDIR.time: - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< - -$(DLLIB): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - $(Q) $(POSTLINK) - - - -$(OBJS): $(HDRS) $(ruby_headers) -LIBFFI_HOST=--host= -include ${srcdir}/libffi.darwin.mk diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c deleted file mode 100644 index d1a41894b69235f80fcbb55cabb0cd9e77a33659..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2010, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#include -#include "rbffi.h" - -#include "Type.h" -#include "MappedType.h" - - -static VALUE mapped_allocate(VALUE); -static VALUE mapped_initialize(VALUE, VALUE); -static void mapped_mark(MappedType *); -static ID id_native_type, id_to_native, id_from_native; - -VALUE rbffi_MappedTypeClass = Qnil; - -static VALUE -mapped_allocate(VALUE klass) -{ - MappedType* m; - - VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m); - - m->rbConverter = Qnil; - m->rbType = Qnil; - m->type = NULL; - m->base.nativeType = NATIVE_MAPPED; - m->base.ffiType = &ffi_type_void; - - return obj; -} - -/* - * call-seq: initialize(converter) - * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to - * all these methods - * @return [self] - */ -static VALUE -mapped_initialize(VALUE self, VALUE rbConverter) -{ - MappedType* m = NULL; - - if (!rb_respond_to(rbConverter, id_native_type)) { - rb_raise(rb_eNoMethodError, "native_type method not implemented"); - } - - if (!rb_respond_to(rbConverter, id_to_native)) { - rb_raise(rb_eNoMethodError, "to_native method not implemented"); - } - - if (!rb_respond_to(rbConverter, id_from_native)) { - rb_raise(rb_eNoMethodError, "from_native method not implemented"); - } - - Data_Get_Struct(self, MappedType, m); - m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL); - if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) { - rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type"); - } - - m->rbConverter = rbConverter; - Data_Get_Struct(m->rbType, Type, m->type); - m->base.ffiType = m->type->ffiType; - - return self; -} - -static void -mapped_mark(MappedType* m) -{ - rb_gc_mark(m->rbType); - rb_gc_mark(m->rbConverter); -} - -/* - * call-seq: mapped_type.native_type - * @return [Type] - * Get native type of mapped type. - */ -static VALUE -mapped_native_type(VALUE self) -{ - MappedType*m = NULL; - Data_Get_Struct(self, MappedType, m); - - return m->rbType; -} - -/* - * call-seq: mapped_type.to_native(*args) - * @param args depends on {FFI::DataConverter} used to initialize +self+ - */ -static VALUE -mapped_to_native(int argc, VALUE* argv, VALUE self) -{ - MappedType*m = NULL; - - Data_Get_Struct(self, MappedType, m); - - return rb_funcall2(m->rbConverter, id_to_native, argc, argv); -} - -/* - * call-seq: mapped_type.from_native(*args) - * @param args depends on {FFI::DataConverter} used to initialize +self+ - */ -static VALUE -mapped_from_native(int argc, VALUE* argv, VALUE self) -{ - MappedType*m = NULL; - - Data_Get_Struct(self, MappedType, m); - - return rb_funcall2(m->rbConverter, id_from_native, argc, argv); -} - -void -rbffi_MappedType_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::Type::Mapped < FFI::Type - */ - rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass); - - rb_global_variable(&rbffi_MappedTypeClass); - - id_native_type = rb_intern("native_type"); - id_to_native = rb_intern("to_native"); - id_from_native = rb_intern("from_native"); - - rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate); - rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1); - rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0); - rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0); - rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1); - rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h deleted file mode 100644 index 4b26cc1c62400ffb907aa8085941446f7dbbfea0..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2010, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_MAPPEDTYPE_H -#define RBFFI_MAPPEDTYPE_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct MappedType_ { - Type base; - Type* type; - VALUE rbConverter; - VALUE rbType; - -} MappedType; - -void rbffi_MappedType_Init(VALUE moduleFFI); - -extern VALUE rbffi_MappedTypeClass; - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_MAPPEDTYPE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c deleted file mode 100644 index 0d91c35b7c872dcd2378903b02086ffcd9782bfd..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include -#include "rbffi.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" - - -static VALUE memptr_allocate(VALUE klass); -static void memptr_release(Pointer* ptr); -static VALUE memptr_malloc(VALUE self, long size, long count, bool clear); -static VALUE memptr_free(VALUE self); - -VALUE rbffi_MemoryPointerClass; - -#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass)) - -VALUE -rbffi_MemoryPointer_NewInstance(long size, long count, bool clear) -{ - return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear); -} - -static VALUE -memptr_allocate(VALUE klass) -{ - Pointer* p; - VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p); - p->rbParent = Qnil; - p->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -/* - * call-seq: initialize(size, count=1, clear=true) - * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used) - * @param [Numeric] count number of cells in memory - * @param [Boolean] clear set memory to all-zero if +true+ - * @return [self] - * A new instance of FFI::MemoryPointer. - */ -static VALUE -memptr_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE size = Qnil, count = Qnil, clear = Qnil; - int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear); - - memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1, - RTEST(clear) || clear == Qnil); - - if (rb_block_given_p()) { - return rb_ensure(rb_yield, self, memptr_free, self); - } - - return self; -} - -static VALUE -memptr_malloc(VALUE self, long size, long count, bool clear) -{ - Pointer* p; - unsigned long msize; - - Data_Get_Struct(self, Pointer, p); - - msize = size * count; - - p->storage = xmalloc(msize + 7); - if (p->storage == NULL) { - rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize); - return Qnil; - } - p->autorelease = true; - p->memory.typeSize = (int) size; - p->memory.size = msize; - /* ensure the memory is aligned on at least a 8 byte boundary */ - p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);; - p->allocated = true; - - if (clear && p->memory.size > 0) { - memset(p->memory.address, 0, p->memory.size); - } - - return self; -} - -static VALUE -memptr_free(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->allocated) { - if (ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - ptr->allocated = false; - } - - return self; -} - -static void -memptr_release(Pointer* ptr) -{ - if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - xfree(ptr); -} - -/* - * call-seq: from_string(s) - * @param [String] s string - * @return [MemoryPointer] - * Create a {MemoryPointer} with +s+ inside. - */ -static VALUE -memptr_s_from_string(VALUE klass, VALUE to_str) -{ - VALUE s = StringValue(to_str); - VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse }; - VALUE obj = rb_class_new_instance(3, args, klass); - rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s); - - return obj; -} - -void -rbffi_MemoryPointer_Init(VALUE moduleFFI) -{ - VALUE ffi_Pointer; - - ffi_Pointer = rbffi_PointerClass; - - /* - * Document-class: FFI::MemoryPointer < FFI::Pointer - * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the - * same size. - * - * @example Create a new MemoryPointer - * mp = FFI::MemoryPointer.new(:long, 16) # Create a pointer on a memory of 16 long ints. - * @example Create a new MemoryPointer from a String - * mp1 = FFI::MemoryPointer.from_string("this is a string") - * # same as: - * mp2 = FFI::MemoryPointer.new(:char,16) - * mp2.put_string("this is a string") - */ - rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer); - rb_global_variable(&rbffi_MemoryPointerClass); - - rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate); - rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1); - rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h deleted file mode 100644 index 12576838a679a350ee7b28c032ebfd56613af594..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2008, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_MEMORYPOINTER_H -#define RBFFI_MEMORYPOINTER_H - -#ifndef _MSC_VER -# include -#else -# include "win32/stdbool.h" -#endif -#include - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_MemoryPointer_Init(VALUE moduleFFI); - extern VALUE rbffi_MemoryPointerClass; - extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear); -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_MEMORYPOINTER_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c deleted file mode 100644 index 70efb7257438e877379d80b75eaee21ddb078bba..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (c) 2009, 2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _WIN32 -# include -#endif -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdint.h" -# include "win32/stdbool.h" -#endif -#ifndef _WIN32 -# include -#endif -#include -#include -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) -# include -#endif - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Function.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "ClosurePool.h" -#include "MethodHandle.h" - - -#define MAX_METHOD_FIXED_ARITY (6) - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif -#ifdef _WIN32 - typedef char* caddr_t; -#endif - -#ifdef USE_RAW -# define METHOD_CLOSURE ffi_raw_closure -# define METHOD_PARAMS ffi_raw* -#else -# define METHOD_CLOSURE ffi_closure -# define METHOD_PARAMS void** -#endif - - - -static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); -static long trampoline_size(void); - -#if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__)) -# define CUSTOM_TRAMPOLINE 1 -#endif - - -struct MethodHandle { - Closure* closure; -}; - -static ClosurePool* defaultClosurePool; - - -MethodHandle* -rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function) -{ - MethodHandle* handle; - Closure* closure = rbffi_Closure_Alloc(defaultClosurePool); - if (closure == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate closure from pool"); - return NULL; - } - - handle = xcalloc(1, sizeof(*handle)); - handle->closure = closure; - closure->info = fnInfo; - closure->function = function; - - return handle; -} - -void -rbffi_MethodHandle_Free(MethodHandle* handle) -{ - if (handle != NULL) { - rbffi_Closure_Free(handle->closure); - } -} - -void* -rbffi_MethodHandle_CodeAddress(MethodHandle* handle) -{ - return handle->closure->code; -} - -#ifndef CUSTOM_TRAMPOLINE -static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); - -static ffi_type* methodHandleParamTypes[] = { - &ffi_type_sint, - &ffi_type_pointer, - &ffi_type_ulong, -}; - -static ffi_cif mh_cif; - -static bool -prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - ffi_status ffiStatus; - -#if defined(USE_RAW) - ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure); -#else - ffiStatus = ffi_prep_closure(code, &mh_cif, attached_method_invoke, closure); -#endif - if (ffiStatus != FFI_OK) { - snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus); - return false; - } - - return true; -} - - -static long -trampoline_size(void) -{ - return sizeof(METHOD_CLOSURE); -} - -/* - * attached_method_invoke is used functions with more than 6 parameters, or - * with struct param or return values - */ -static void -attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data) -{ - Closure* handle = (Closure *) user_data; - FunctionType* fnInfo = (FunctionType *) handle->info; - -#ifdef USE_RAW - int argc = parameters[0].sint; - VALUE* argv = *(VALUE **) ¶meters[1]; -#else - int argc = *(int *) parameters[0]; - VALUE* argv = *(VALUE **) parameters[1]; -#endif - - *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); -} - -#endif - - - -#if defined(CUSTOM_TRAMPOLINE) -#if defined(__x86_64__) - -static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*); - -#define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe) -#define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d) - -/* - * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation - * layer for x86_64 arches. - * - * Since a ruby function has exactly 3 arguments, and the first 6 arguments are - * passed in registers for x86_64, we can tack on a context pointer by simply - * putting a value in %rcx, then jumping to the C trampoline code. - * - * This results in approx a 30% speedup for x86_64 FFI dispatch - */ -__asm__( - ".text\n\t" - ".globl ffi_trampoline\n\t" - ".globl _ffi_trampoline\n\t" - "ffi_trampoline:\n\t" - "_ffi_trampoline:\n\t" - "movabsq $0xfee1deadcafebabe, %rcx\n\t" - "movabsq $0xfeedfacebeeff00d, %r11\n\t" - "jmpq *%r11\n\t" - ".globl ffi_trampoline_end\n\t" - "ffi_trampoline_end:\n\t" - ".globl _ffi_trampoline_end\n\t" - "_ffi_trampoline_end:\n\t" -); - -static VALUE -custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle) -{ - FunctionType* fnInfo = (FunctionType *) handle->info; - VALUE rbReturnValue; - - RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); - RB_GC_GUARD(self); - - return rbReturnValue; -} - -#elif defined(__i386__) && 0 - -static VALUE custom_trampoline(caddr_t args, Closure*); -#define TRAMPOLINE_CTX_MAGIC (0xfee1dead) -#define TRAMPOLINE_FUN_MAGIC (0xbeefcafe) - -/* - * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation - * layer for i386 arches. - * - * This does not make a discernible difference vs a raw closure, so for now, - * it is not enabled. - */ -__asm__( - ".text\n\t" - ".globl ffi_trampoline\n\t" - ".globl _ffi_trampoline\n\t" - "ffi_trampoline:\n\t" - "_ffi_trampoline:\n\t" - "subl $12, %esp\n\t" - "leal 16(%esp), %eax\n\t" - "movl %eax, (%esp)\n\t" - "movl $0xfee1dead, 4(%esp)\n\t" - "movl $0xbeefcafe, %eax\n\t" - "call *%eax\n\t" - "addl $12, %esp\n\t" - "ret\n\t" - ".globl ffi_trampoline_end\n\t" - "ffi_trampoline_end:\n\t" - ".globl _ffi_trampoline_end\n\t" - "_ffi_trampoline_end:\n\t" -); - -static VALUE -custom_trampoline(caddr_t args, Closure* handle) -{ - FunctionType* fnInfo = (FunctionType *) handle->info; - return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo); -} - -#endif /* __x86_64__ else __i386__ */ - -extern void ffi_trampoline(int argc, VALUE* argv, VALUE self); -extern void ffi_trampoline_end(void); -static int trampoline_offsets(long *, long *); - -static long trampoline_ctx_offset, trampoline_func_offset; - -static long -trampoline_offset(int off, const long value) -{ - caddr_t ptr; - for (ptr = (caddr_t) &ffi_trampoline + off; ptr < (caddr_t) &ffi_trampoline_end; ++ptr) { - if (*(long *) ptr == value) { - return ptr - (caddr_t) &ffi_trampoline; - } - } - - return -1; -} - -static int -trampoline_offsets(long* ctxOffset, long* fnOffset) -{ - *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC); - if (*ctxOffset == -1) { - return -1; - } - - *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC); - if (*fnOffset == -1) { - return -1; - } - - return 0; -} - -static bool -prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - caddr_t ptr = (caddr_t) code; - - memcpy(ptr, &ffi_trampoline, trampoline_size()); - /* Patch the context and function addresses into the stub code */ - *(intptr_t *)(ptr + trampoline_ctx_offset) = (intptr_t) closure; - *(intptr_t *)(ptr + trampoline_func_offset) = (intptr_t) custom_trampoline; - - return true; -} - -static long -trampoline_size(void) -{ - return (caddr_t) &ffi_trampoline_end - (caddr_t) &ffi_trampoline; -} - -#endif /* CUSTOM_TRAMPOLINE */ - - -void -rbffi_MethodHandle_Init(VALUE module) -{ -#ifndef CUSTOM_TRAMPOLINE - ffi_status ffiStatus; -#endif - - defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL); - -#if defined(CUSTOM_TRAMPOLINE) - if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) { - rb_raise(rb_eFatal, "Could not locate offsets in trampoline code"); - } -#else - ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong, - methodHandleParamTypes); - if (ffiStatus != FFI_OK) { - rb_raise(rb_eFatal, "ffi_prep_cif failed. status=%#x", ffiStatus); - } - -#endif -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h deleted file mode 100644 index c3341bf30d9474ea7aa771170f6d8ce642b10dd6..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_METHODHANDLE_H -#define RBFFI_METHODHANDLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "Function.h" - - -typedef struct MethodHandlePool MethodHandlePool; -typedef struct MethodHandle MethodHandle; - - -MethodHandle* rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function); -void rbffi_MethodHandle_Free(MethodHandle* handle); -void* rbffi_MethodHandle_CodeAddress(MethodHandle* handle); -void rbffi_MethodHandle_Init(VALUE module); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_METHODHANDLE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c deleted file mode 100644 index de114a88b47c33a55cb43809517fa419b3757792..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -#endif -# include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdint.h" -# include "win32/stdbool.h" -#endif -#include -#include -#include "rbffi_endian.h" -#include "Platform.h" - -#if defined(__GNU__) || defined(__GLIBC__) -# include -#endif - -static VALUE PlatformModule = Qnil; - -/* - * Determine the cpu type at compile time - useful for MacOSX where the the - * system installed ruby incorrectly reports 'host_cpu' as 'powerpc' when running - * on intel. - */ -#if defined(__x86_64__) || defined(__x86_64) || defined(__amd64) || defined(_M_X64) || defined(_M_AMD64) -# define CPU "x86_64" - -#elif defined(__i386__) || defined(__i386) || defined(_M_IX86) -# define CPU "i386" - -#elif defined(__ppc64__) || defined(__powerpc64__) || defined(_M_PPC) -# define CPU "ppc64" - -#elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc) -# define CPU "ppc" - -/* - * Need to check for __sparcv9 first, because __sparc will be defined either way. - * Note that __sparcv9 seems to only be set for Solaris. On Linux, __sparc will - * be set, along with __arch64__ if a 64-bit platform. - */ -#elif defined(__sparcv9__) || defined(__sparcv9) -# define CPU "sparcv9" - -#elif defined(__sparc__) || defined(__sparc) -# if defined(__arch64__) -# define CPU "sparcv9" -# else -# define CPU "sparc" -# endif - -#elif defined(__arm__) || defined(__arm) -# define CPU "arm" - -#elif defined(__mips__) || defined(__mips) -# define CPU "mips" - -#elif defined(__s390__) -# define CPU "s390" - -#else -# define CPU "unknown" -#endif - -static void -export_primitive_types(VALUE module) -{ -#define S(name, T) do { \ - typedef struct { char c; T v; } s; \ - rb_define_const(module, #name "_ALIGN", INT2NUM((sizeof(s) - sizeof(T)) * 8)); \ - rb_define_const(module, #name "_SIZE", INT2NUM(sizeof(T)* 8)); \ -} while(0) - S(INT8, char); - S(INT16, short); - S(INT32, int); - S(INT64, long long); - S(LONG, long); - S(FLOAT, float); - S(DOUBLE, double); - S(ADDRESS, void*); -#undef S -} - -void -rbffi_Platform_Init(VALUE moduleFFI) -{ - PlatformModule = rb_define_module_under(moduleFFI, "Platform"); - rb_define_const(PlatformModule, "BYTE_ORDER", INT2FIX(BYTE_ORDER)); - rb_define_const(PlatformModule, "LITTLE_ENDIAN", INT2FIX(LITTLE_ENDIAN)); - rb_define_const(PlatformModule, "BIG_ENDIAN", INT2FIX(BIG_ENDIAN)); - rb_define_const(PlatformModule, "CPU", rb_str_new2(CPU)); -#if defined(__GNU__) || defined(__GLIBC__) - rb_define_const(PlatformModule, "GNU_LIBC", rb_str_new2(LIBC_SO)); -#endif - export_primitive_types(PlatformModule); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h deleted file mode 100644 index 5575e34ab9574ad200ad067d570ab9d1db6f3a8c..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_PLATFORM_H -#define RBFFI_PLATFORM_H - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_Platform_Init(VALUE moduleFFI); - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_PLATFORM_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c deleted file mode 100644 index 1eee790db530251e66eedf93ef547141bfcf3bfd..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdint.h" -# include "win32/stdbool.h" -#endif -#include -#include -#include "rbffi.h" -#include "rbffi_endian.h" -#include "AbstractMemory.h" -#include "Pointer.h" - -#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass) - -VALUE rbffi_PointerClass = Qnil; -VALUE rbffi_NullPointerSingleton = Qnil; - -static void ptr_release(Pointer* ptr); -static void ptr_mark(Pointer* ptr); - -VALUE -rbffi_Pointer_NewInstance(void* addr) -{ - Pointer* p; - VALUE obj; - - if (addr == NULL) { - return rbffi_NullPointerSingleton; - } - - obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p); - p->memory.address = addr; - p->memory.size = LONG_MAX; - p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR); - p->memory.typeSize = 1; - p->rbParent = Qnil; - - return obj; -} - -static VALUE -ptr_allocate(VALUE klass) -{ - Pointer* p; - VALUE obj; - - obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p); - p->rbParent = Qnil; - p->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -/* - * @overload initialize(pointer) - * @param [Pointer] pointer another pointer to initialize from - * Create a new pointer from another {Pointer}. - * @overload initialize(type, address) - * @param [Type] type type for pointer - * @param [Integer] address base address for pointer - * Create a new pointer from a {Type} and a base address - * @return [self] - * A new instance of Pointer. - */ -static VALUE -ptr_initialize(int argc, VALUE* argv, VALUE self) -{ - Pointer* p; - VALUE rbType = Qnil, rbAddress = Qnil; - int typeSize = 1; - - Data_Get_Struct(self, Pointer, p); - - switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) { - case 1: - rbAddress = rbType; - typeSize = 1; - break; - case 2: - typeSize = rbffi_type_size(rbType); - break; - default: - rb_raise(rb_eArgError, "Invalid arguments"); - } - - switch (TYPE(rbAddress)) { - case T_FIXNUM: - case T_BIGNUM: - p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress); - p->memory.size = LONG_MAX; - if (p->memory.address == NULL) { - p->memory.flags = 0; - } - break; - - default: - if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) { - Pointer* orig; - - p->rbParent = rbAddress; - Data_Get_Struct(rbAddress, Pointer, orig); - p->memory = orig->memory; - } else { - rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer"); - } - break; - } - - p->memory.typeSize = typeSize; - - return self; -} - -/* - * call-seq: ptr.initialize_copy(other) - * @param [Pointer] other source for cloning or dupping - * @return [self] - * @raise {RuntimeError} if +other+ is an unbounded memory area, or is unreadable/unwritable - * @raise {NoMemError} if failed to allocate memory for new object - * DO NOT CALL THIS METHOD. - * - * This method is internally used by #dup and #clone. Memory content is copied from +other+. - */ -static VALUE -ptr_initialize_copy(VALUE self, VALUE other) -{ - AbstractMemory* src; - Pointer* dst; - - Data_Get_Struct(self, Pointer, dst); - src = POINTER(other); - if (src->size == LONG_MAX) { - rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area"); - return Qnil; - } - - if ((dst->memory.flags & (MEM_RD | MEM_WR)) != (MEM_RD | MEM_WR)) { - rb_raise(rb_eRuntimeError, "cannot duplicate unreadable/unwritable memory area"); - return Qnil; - } - - if (dst->storage != NULL) { - xfree(dst->storage); - dst->storage = NULL; - } - - dst->storage = xmalloc(src->size + 7); - if (dst->storage == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); - return Qnil; - } - - dst->allocated = true; - dst->autorelease = true; - dst->memory.address = (void *) (((uintptr_t) dst->storage + 0x7) & (uintptr_t) ~0x7UL); - dst->memory.size = src->size; - dst->memory.typeSize = src->typeSize; - - /* finally, copy the actual memory contents */ - memcpy(dst->memory.address, src->address, src->size); - - return self; -} - -static VALUE -slice(VALUE self, long offset, long size) -{ - AbstractMemory* ptr; - Pointer* p; - VALUE retval; - - Data_Get_Struct(self, AbstractMemory, ptr); - checkBounds(ptr, offset, size == LONG_MAX ? 1 : size); - - retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p); - - p->memory.address = ptr->address + offset; - p->memory.size = size; - p->memory.flags = ptr->flags; - p->memory.typeSize = ptr->typeSize; - p->rbParent = self; - - return retval; -} - -/* - * Document-method: + - * call-seq: ptr + offset - * @param [Numeric] offset - * @return [Pointer] - * Return a new {Pointer} from an existing pointer and an +offset+. - */ -static VALUE -ptr_plus(VALUE self, VALUE offset) -{ - AbstractMemory* ptr; - long off = NUM2LONG(offset); - - Data_Get_Struct(self, AbstractMemory, ptr); - - return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off); -} - -/* - * call-seq: ptr.slice(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Pointer] - * Return a new {Pointer} from an existing one. This pointer points on same contents - * from +offset+ for a length +length+. - */ -static VALUE -ptr_slice(VALUE self, VALUE rbOffset, VALUE rbLength) -{ - return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); -} - -/* - * call-seq: ptr.inspect - * @return [String] - * Inspect pointer object. - */ -static VALUE -ptr_inspect(VALUE self) -{ - char buf[100]; - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->memory.size != LONG_MAX) { - snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>", - rb_obj_classname(self), ptr->memory.address, ptr->memory.size); - } else { - snprintf(buf, sizeof(buf), "#<%s address=%p>", rb_obj_classname(self), ptr->memory.address); - } - - return rb_str_new2(buf); -} - -/* - * Document-method: null? - * call-seq: ptr.null? - * @return [Boolean] - * Return +true+ if +self+ is a {NULL} pointer. - */ -static VALUE -ptr_null_p(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ptr->memory.address == NULL ? Qtrue : Qfalse; -} - -/* - * Document-method: == - * call-seq: ptr == other - * @param [Pointer] other - * Check equality between +self+ and +other+. Equality is tested on {#address}. - */ -static VALUE -ptr_equals(VALUE self, VALUE other) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (NIL_P(other)) { - return ptr->memory.address == NULL ? Qtrue : Qfalse; - } - - return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse; -} - -/* - * call-seq: ptr.address - * @return [Numeric] pointer's base address - * Return +self+'s base address (alias: #to_i). - */ -static VALUE -ptr_address(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ULL2NUM((uintptr_t) ptr->memory.address); -} - -#if BYTE_ORDER == LITTLE_ENDIAN -# define SWAPPED_ORDER BIG_ENDIAN -#else -# define SWAPPED_ORDER LITTLE_ENDIAN -#endif - -/* - * Get or set +self+'s endianness - * @overload order - * @return [:big, :little] endianness of +self+ - * @overload order(order) - * @param [Symbol] order endianness to set (+:little+, +:big+ or +:network+). +:big+ and +:network+ - * are synonymous. - * @return [self] - */ -static VALUE -ptr_order(int argc, VALUE* argv, VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - if (argc == 0) { - int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; - return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); - } else { - VALUE rbOrder = Qnil; - int order = BYTE_ORDER; - - if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { - rb_raise(rb_eArgError, "need byte order"); - } - if (SYMBOL_P(rbOrder)) { - ID id = SYM2ID(rbOrder); - if (id == rb_intern("little")) { - order = LITTLE_ENDIAN; - - } else if (id == rb_intern("big") || id == rb_intern("network")) { - order = BIG_ENDIAN; - } - } - if (order != BYTE_ORDER) { - Pointer* p2; - VALUE retval = slice(self, 0, ptr->memory.size); - - Data_Get_Struct(retval, Pointer, p2); - p2->memory.flags |= MEM_SWAP; - return retval; - } - - return self; - } -} - - -/* - * call-seq: ptr.free - * @return [self] - * Free memory pointed by +self+. - */ -static VALUE -ptr_free(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->allocated) { - if (ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - ptr->allocated = false; - - } else { - VALUE caller = rb_funcall(rb_funcall(Qnil, rb_intern("caller"), 0), rb_intern("first"), 0); - - rb_warn("calling free on non allocated pointer %s from %s", RSTRING_PTR(ptr_inspect(self)), RSTRING_PTR(rb_str_to_str(caller))); - } - - return self; -} - -static VALUE -ptr_type_size(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return INT2NUM(ptr->memory.typeSize); -} - -/* - * call-seq: ptr.autorelease = autorelease - * @param [Boolean] autorelease - * @return [Boolean] +autorelease+ - * Set +autorelease+ attribute. See also Autorelease section. - */ -static VALUE -ptr_autorelease(VALUE self, VALUE autorelease) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - ptr->autorelease = autorelease == Qtrue; - - return autorelease; -} - -/* - * call-seq: ptr.autorelease? - * @return [Boolean] - * Get +autorelease+ attribute. See also Autorelease section. - */ -static VALUE -ptr_autorelease_p(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ptr->autorelease ? Qtrue : Qfalse; -} - - -static void -ptr_release(Pointer* ptr) -{ - if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - xfree(ptr); -} - -static void -ptr_mark(Pointer* ptr) -{ - rb_gc_mark(ptr->rbParent); -} - -void -rbffi_Pointer_Init(VALUE moduleFFI) -{ - VALUE rbNullAddress = ULL2NUM(0); - VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; - - /* - * Document-class: FFI::Pointer < FFI::AbstractMemory - * Pointer class is used to manage C pointers with ease. A {Pointer} object is defined by his - * {#address} (as a C pointer). It permits additions with an integer for pointer arithmetic. - * - * ==Autorelease - * A pointer object may autorelease his contents when freed (by default). This behaviour may be - * changed with {#autorelease=} method. - */ - rbffi_PointerClass = rb_define_class_under(moduleFFI, "Pointer", ffi_AbstractMemory); - /* - * Document-variable: Pointer - */ - rb_global_variable(&rbffi_PointerClass); - - rb_define_alloc_func(rbffi_PointerClass, ptr_allocate); - rb_define_method(rbffi_PointerClass, "initialize", ptr_initialize, -1); - rb_define_method(rbffi_PointerClass, "initialize_copy", ptr_initialize_copy, 1); - rb_define_method(rbffi_PointerClass, "inspect", ptr_inspect, 0); - rb_define_method(rbffi_PointerClass, "to_s", ptr_inspect, 0); - rb_define_method(rbffi_PointerClass, "+", ptr_plus, 1); - rb_define_method(rbffi_PointerClass, "slice", ptr_slice, 2); - rb_define_method(rbffi_PointerClass, "null?", ptr_null_p, 0); - rb_define_method(rbffi_PointerClass, "address", ptr_address, 0); - rb_define_alias(rbffi_PointerClass, "to_i", "address"); - rb_define_method(rbffi_PointerClass, "==", ptr_equals, 1); - rb_define_method(rbffi_PointerClass, "order", ptr_order, -1); - rb_define_method(rbffi_PointerClass, "autorelease=", ptr_autorelease, 1); - rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0); - rb_define_method(rbffi_PointerClass, "free", ptr_free, 0); - rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0); - - rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass); - /* - * NULL pointer - */ - rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h deleted file mode 100644 index 2d868518e9d35fd776ef88bd6e70a12ae3800650..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_POINTER_H -#define RBFFI_POINTER_H - -#ifndef _MSC_VER -# include -#else -# include "win32/stdbool.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include "AbstractMemory.h" - -extern void rbffi_Pointer_Init(VALUE moduleFFI); -extern VALUE rbffi_Pointer_NewInstance(void* addr); -extern VALUE rbffi_PointerClass; -extern VALUE rbffi_NullPointerSingleton; - -typedef struct Pointer { - AbstractMemory memory; - VALUE rbParent; - char* storage; /* start of malloc area */ - bool autorelease; - bool allocated; -} Pointer; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_POINTER_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c deleted file mode 100644 index c6428a212818482c74b0b109c260deaaf8532817..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c +++ /dev/null @@ -1,829 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifndef _MSC_VER -# include -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Function.h" -#include "Types.h" -#include "Function.h" -#include "StructByValue.h" -#include "ArrayType.h" -#include "MappedType.h" -#include "Struct.h" - -typedef struct InlineArray_ { - VALUE rbMemory; - VALUE rbField; - - AbstractMemory* memory; - StructField* field; - MemoryOp *op; - Type* componentType; - ArrayType* arrayType; - int length; -} InlineArray; - - -static void struct_mark(Struct *); -static void struct_free(Struct *); -static VALUE struct_class_layout(VALUE klass); -static void struct_malloc(Struct* s); -static void inline_array_mark(InlineArray *); -static void store_reference_value(StructField* f, Struct* s, VALUE value); - -VALUE rbffi_StructClass = Qnil; - -VALUE rbffi_StructInlineArrayClass = Qnil; -VALUE rbffi_StructLayoutCharArrayClass = Qnil; - -static ID id_pointer_ivar = 0, id_layout_ivar = 0; -static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0; - -static inline char* -memory_address(VALUE self) -{ - return ((AbstractMemory *)DATA_PTR((self)))->address; -} - -static VALUE -struct_allocate(VALUE klass) -{ - Struct* s; - VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, struct_free, s); - - s->rbPointer = Qnil; - s->rbLayout = Qnil; - - return obj; -} - -/* - * call-seq: initialize - * @overload initialize(pointer, *args) - * @param [AbstractMemory] pointer - * @param [Array] args - * @return [self] - */ -static VALUE -struct_initialize(int argc, VALUE* argv, VALUE self) -{ - Struct* s; - VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self); - int nargs; - - Data_Get_Struct(self, Struct, s); - - nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest); - - /* Call up into ruby code to adjust the layout */ - if (nargs > 1) { - s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, (int) RARRAY_LEN(rest), RARRAY_PTR(rest)); - } else { - s->rbLayout = struct_class_layout(klass); - } - - if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) { - rb_raise(rb_eRuntimeError, "Invalid Struct layout"); - } - - Data_Get_Struct(s->rbLayout, StructLayout, s->layout); - - if (rbPointer != Qnil) { - s->pointer = MEMORY(rbPointer); - s->rbPointer = rbPointer; - } else { - struct_malloc(s); - } - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -struct_initialize_copy(VALUE self, VALUE other) -{ - Struct* src; - Struct* dst; - - Data_Get_Struct(self, Struct, dst); - Data_Get_Struct(other, Struct, src); - if (dst == src) { - return self; - } - - dst->rbLayout = src->rbLayout; - dst->layout = src->layout; - - /* - * A new MemoryPointer instance is allocated here instead of just calling - * #dup on rbPointer, since the Pointer may not know its length, or may - * be longer than just this struct. - */ - if (src->pointer->address != NULL) { - dst->rbPointer = rbffi_MemoryPointer_NewInstance(1, src->layout->size, false); - dst->pointer = MEMORY(dst->rbPointer); - memcpy(dst->pointer->address, src->pointer->address, src->layout->size); - } else { - dst->rbPointer = src->rbPointer; - dst->pointer = src->pointer; - } - - if (src->layout->referenceFieldCount > 0) { - dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount); - memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE)); - } - - return self; -} - -static VALUE -struct_class_layout(VALUE klass) -{ - VALUE layout; - if (!rb_ivar_defined(klass, id_layout_ivar)) { - rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass)); - } - - layout = rb_ivar_get(klass, id_layout_ivar); - if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { - rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass)); - } - - return layout; -} - -static StructLayout* -struct_layout(VALUE self) -{ - Struct* s = (Struct *) DATA_PTR(self); - if (s->layout != NULL) { - return s->layout; - } - - if (s->layout == NULL) { - s->rbLayout = struct_class_layout(CLASS_OF(self)); - Data_Get_Struct(s->rbLayout, StructLayout, s->layout); - } - - return s->layout; -} - -static Struct* -struct_validate(VALUE self) -{ - Struct* s; - Data_Get_Struct(self, Struct, s); - - if (struct_layout(self) == NULL) { - rb_raise(rb_eRuntimeError, "struct layout == null"); - } - - if (s->pointer == NULL) { - struct_malloc(s); - } - - return s; -} - -static void -struct_malloc(Struct* s) -{ - if (s->rbPointer == Qnil) { - s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true); - - } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) { - rb_raise(rb_eRuntimeError, "invalid pointer in struct"); - } - - s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer); -} - -static void -struct_mark(Struct *s) -{ - rb_gc_mark(s->rbPointer); - rb_gc_mark(s->rbLayout); - if (s->rbReferences != NULL) { - rb_gc_mark_locations(&s->rbReferences[0], &s->rbReferences[s->layout->referenceFieldCount]); - } -} - -static void -struct_free(Struct* s) -{ - xfree(s->rbReferences); - xfree(s); -} - - -static void -store_reference_value(StructField* f, Struct* s, VALUE value) -{ - if (unlikely(f->referenceIndex == -1)) { - rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type"); - return; - } - if (s->rbReferences == NULL) { - int i; - s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount); - for (i = 0; i < s->layout->referenceFieldCount; ++i) { - s->rbReferences[i] = Qnil; - } - } - - s->rbReferences[f->referenceIndex] = value; -} - - -static VALUE -struct_field(Struct* s, VALUE fieldName) -{ - StructLayout* layout = s->layout; - VALUE rbField; - - if (likely(SYMBOL_P(fieldName) && st_lookup(layout->fieldSymbolTable, fieldName, (st_data_t *) &rbField))) { - return rbField; - } - - // TODO does this ever return anything? - rbField = rb_hash_aref(layout->rbFieldMap, fieldName); - if (rbField == Qnil) { - VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL); - rb_raise(rb_eArgError, "No such field '%s'", StringValuePtr(str)); - } - - return rbField; -} - -/* - * call-seq: struct[field_name] - * @param field_name field to access - * Acces to a Struct field. - */ -static VALUE -struct_aref(VALUE self, VALUE fieldName) -{ - Struct* s; - VALUE rbField; - StructField* f; - - s = struct_validate(self); - - rbField = struct_field(s, fieldName); - f = (StructField *) DATA_PTR(rbField); - - if (f->get != NULL) { - return (*f->get)(f, s); - - } else if (f->memoryOp != NULL) { - return (*f->memoryOp->get)(s->pointer, f->offset); - - } else { - - /* call up to the ruby code to fetch the value */ - return rb_funcall2(rbField, id_get, 1, &s->rbPointer); - } -} - -/* - * call-seq: []=(field_name, value) - * @param field_name field to access - * @param value value to set to +field_name+ - * @return [value] - * Set a field in Struct. - */ -static VALUE -struct_aset(VALUE self, VALUE fieldName, VALUE value) -{ - Struct* s; - VALUE rbField; - StructField* f; - - - s = struct_validate(self); - - rbField = struct_field(s, fieldName); - f = (StructField *) DATA_PTR(rbField); - if (f->put != NULL) { - (*f->put)(f, s, value); - - } else if (f->memoryOp != NULL) { - - (*f->memoryOp->put)(s->pointer, f->offset, value); - - } else { - /* call up to the ruby code to set the value */ - VALUE argv[2]; - argv[0] = s->rbPointer; - argv[1] = value; - rb_funcall2(rbField, id_put, 2, argv); - } - - if (f->referenceRequired) { - store_reference_value(f, s, value); - } - - return value; -} - -/* - * call-seq: pointer= pointer - * @param [AbstractMemory] pointer - * @return [self] - * Make Struct point to +pointer+. - */ -static VALUE -struct_set_pointer(VALUE self, VALUE pointer) -{ - Struct* s; - StructLayout* layout; - AbstractMemory* memory; - - if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)", - rb_obj_classname(pointer)); - return Qnil; - } - - - Data_Get_Struct(self, Struct, s); - Data_Get_Struct(pointer, AbstractMemory, memory); - layout = struct_layout(self); - - if ((int) layout->base.ffiType->size > memory->size) { - rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)", - memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size); - } - - s->pointer = MEMORY(pointer); - s->rbPointer = pointer; - rb_ivar_set(self, id_pointer_ivar, pointer); - - return self; -} - -/* - * call-seq: pointer - * @return [AbstractMemory] - * Get pointer to Struct contents. - */ -static VALUE -struct_get_pointer(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->rbPointer; -} - -/* - * call-seq: layout= layout - * @param [StructLayout] layout - * @return [self] - * Set the Struct's layout. - */ -static VALUE -struct_set_layout(VALUE self, VALUE layout) -{ - Struct* s; - Data_Get_Struct(self, Struct, s); - - if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", - rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass)); - return Qnil; - } - - Data_Get_Struct(layout, StructLayout, s->layout); - rb_ivar_set(self, id_layout_ivar, layout); - - return self; -} - -/* - * call-seq: layout - * @return [StructLayout] - * Get the Struct's layout. - */ -static VALUE -struct_get_layout(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->rbLayout; -} - -/* - * call-seq: null? - * @return [Boolean] - * Test if Struct's pointer is NULL - */ -static VALUE -struct_null_p(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->pointer->address == NULL ? Qtrue : Qfalse; -} - -/* - * (see Pointer#order) - */ -static VALUE -struct_order(int argc, VALUE* argv, VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - if (argc == 0) { - return rb_funcall(s->rbPointer, rb_intern("order"), 0); - - } else { - VALUE retval = rb_obj_dup(self); - VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv); - struct_set_pointer(retval, rbPointer); - - return retval; - } -} - -static VALUE -inline_array_allocate(VALUE klass) -{ - InlineArray* array; - VALUE obj; - - obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array); - array->rbField = Qnil; - array->rbMemory = Qnil; - - return obj; -} - -static void -inline_array_mark(InlineArray* array) -{ - rb_gc_mark(array->rbField); - rb_gc_mark(array->rbMemory); -} - -/* - * Document-method: FFI::Struct::InlineArray#initialize - * call-seq: initialize(memory, field) - * @param [AbstractMemory] memory - * @param [StructField] field - * @return [self] - */ -static VALUE -inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - array->rbMemory = rbMemory; - array->rbField = rbField; - - Data_Get_Struct(rbMemory, AbstractMemory, array->memory); - Data_Get_Struct(rbField, StructField, array->field); - Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType); - Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType); - - array->op = get_memory_op(array->componentType); - if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) { - array->op = get_memory_op(((MappedType *) array->componentType)->type); - } - - array->length = array->arrayType->length; - - return self; -} - -/* - * call-seq: size - * @return [Numeric] - * Get size - */ -static VALUE -inline_array_size(VALUE self) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - return UINT2NUM(((ArrayType *) array->field->type)->length); -} - -static int -inline_array_offset(InlineArray* array, int index) -{ - if (index < 0 || (index >= array->length && array->length > 0)) { - rb_raise(rb_eIndexError, "index %d out of bounds", index); - } - - return (int) array->field->offset + (index * (int) array->componentType->ffiType->size); -} - -/* - * call-seq: [](index) - * @param [Numeric] index - * @return [Type, Struct] - */ -static VALUE -inline_array_aref(VALUE self, VALUE rbIndex) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - if (array->op != NULL) { - VALUE rbNativeValue = array->op->get(array->memory, - inline_array_offset(array, NUM2INT(rbIndex))); - if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { - return rb_funcall(((MappedType *) array->componentType)->rbConverter, - rb_intern("from_native"), 2, rbNativeValue, Qnil); - } else { - return rbNativeValue; - } - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex))); - VALUE rbLength = INT2NUM(array->componentType->ffiType->size); - VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength); - - return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass); - } else { - - rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType)); - return Qnil; - } -} - -/* - * call-seq: []=(index, value) - * @param [Numeric] index - * @param [Type, Struct] - * @return [value] - */ -static VALUE -inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - if (array->op != NULL) { - if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { - rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter, - rb_intern("to_native"), 2, rbValue, Qnil); - } - array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)), - rbValue); - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - int offset = inline_array_offset(array, NUM2INT(rbIndex)); - Struct* s; - - if (!rb_obj_is_kind_of(rbValue, rbffi_StructClass)) { - rb_raise(rb_eTypeError, "argument not an instance of struct"); - return Qnil; - } - - checkWrite(array->memory); - checkBounds(array->memory, offset, array->componentType->ffiType->size); - - Data_Get_Struct(rbValue, Struct, s); - checkRead(s->pointer); - checkBounds(s->pointer, 0, array->componentType->ffiType->size); - - memcpy(array->memory->address + offset, s->pointer->address, array->componentType->ffiType->size); - - } else { - ArrayType* arrayType; - Data_Get_Struct(array->field->rbType, ArrayType, arrayType); - - rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType)); - return Qnil; - } - - return rbValue; -} - -/* - * call-seq: each - * Yield block for each element of +self+. - */ -static VALUE -inline_array_each(VALUE self) -{ - InlineArray* array; - - int i; - - Data_Get_Struct(self, InlineArray, array); - - for (i = 0; i < array->length; ++i) { - rb_yield(inline_array_aref(self, INT2FIX(i))); - } - - return self; -} - -/* - * call-seq: to_a - * @return [Array] - * Convert +self+ to an array. - */ -static VALUE -inline_array_to_a(VALUE self) -{ - InlineArray* array; - VALUE obj; - int i; - - Data_Get_Struct(self, InlineArray, array); - obj = rb_ary_new2(array->length); - - - for (i = 0; i < array->length; ++i) { - rb_ary_push(obj, inline_array_aref(self, INT2FIX(i))); - } - - return obj; -} - -/* - * Document-method: FFI::StructLayout::CharArray#to_s - * call-seq: to_s - * @return [String] - * Convert +self+ to a string. - */ -static VALUE -inline_array_to_s(VALUE self) -{ - InlineArray* array; - VALUE argv[2]; - - Data_Get_Struct(self, InlineArray, array); - - if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) { - VALUE dummy = Qnil; - return rb_call_super(0, &dummy); - } - - argv[0] = UINT2NUM(array->field->offset); - argv[1] = UINT2NUM(array->length); - - return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv); -} - -/* - * call-seq: to_ptr - * @return [AbstractMemory] - * Get pointer to +self+ content. - */ -static VALUE -inline_array_to_ptr(VALUE self) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - return rb_funcall(array->rbMemory, rb_intern("slice"), 2, - UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size)); -} - - -void -rbffi_Struct_Init(VALUE moduleFFI) -{ - VALUE StructClass; - - rbffi_StructLayout_Init(moduleFFI); - - /* - * Document-class: FFI::Struct - * - * A FFI::Struct means to mirror a C struct. - * - * A Struct is defined as: - * class MyStruct < FFI::Struct - * layout :value1, :int, - * :value2, :double - * end - * and is used as: - * my_struct = MyStruct.new - * my_struct[:value1] = 12 - * - * For more information, see http://github.com/ffi/ffi/wiki/Structs - */ - rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject); - StructClass = rbffi_StructClass; // put on a line alone to help RDoc - rb_global_variable(&rbffi_StructClass); - - /* - * Document-class: FFI::Struct::InlineArray - */ - rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject); - rb_global_variable(&rbffi_StructInlineArrayClass); - - /* - * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray - */ - rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray", - rbffi_StructInlineArrayClass); - rb_global_variable(&rbffi_StructLayoutCharArrayClass); - - - rb_define_alloc_func(StructClass, struct_allocate); - rb_define_method(StructClass, "initialize", struct_initialize, -1); - rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1); - rb_define_method(StructClass, "order", struct_order, -1); - - rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new"); - rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new"); - rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_in", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_out", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_inout", "new"); - - rb_define_method(StructClass, "pointer", struct_get_pointer, 0); - rb_define_private_method(StructClass, "pointer=", struct_set_pointer, 1); - - rb_define_method(StructClass, "layout", struct_get_layout, 0); - rb_define_private_method(StructClass, "layout=", struct_set_layout, 1); - - rb_define_method(StructClass, "[]", struct_aref, 1); - rb_define_method(StructClass, "[]=", struct_aset, 2); - rb_define_method(StructClass, "null?", struct_null_p, 0); - - rb_include_module(rbffi_StructInlineArrayClass, rb_mEnumerable); - rb_define_alloc_func(rbffi_StructInlineArrayClass, inline_array_allocate); - rb_define_method(rbffi_StructInlineArrayClass, "initialize", inline_array_initialize, 2); - rb_define_method(rbffi_StructInlineArrayClass, "[]", inline_array_aref, 1); - rb_define_method(rbffi_StructInlineArrayClass, "[]=", inline_array_aset, 2); - rb_define_method(rbffi_StructInlineArrayClass, "each", inline_array_each, 0); - rb_define_method(rbffi_StructInlineArrayClass, "size", inline_array_size, 0); - rb_define_method(rbffi_StructInlineArrayClass, "to_a", inline_array_to_a, 0); - rb_define_method(rbffi_StructInlineArrayClass, "to_ptr", inline_array_to_ptr, 0); - - rb_define_method(rbffi_StructLayoutCharArrayClass, "to_s", inline_array_to_s, 0); - rb_define_alias(rbffi_StructLayoutCharArrayClass, "to_str", "to_s"); - - id_pointer_ivar = rb_intern("@pointer"); - id_layout_ivar = rb_intern("@layout"); - id_layout = rb_intern("layout"); - id_get = rb_intern("get"); - id_put = rb_intern("put"); - id_to_ptr = rb_intern("to_ptr"); - id_to_s = rb_intern("to_s"); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h deleted file mode 100644 index 85e826390f99b68fff362775fa972352dd921ad3..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_STRUCT_H -#define RBFFI_STRUCT_H - -#include "extconf.h" -#include "AbstractMemory.h" -#include "Type.h" -#ifdef RUBY_1_9 -#include -#else -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_Struct_Init(VALUE ffiModule); - extern void rbffi_StructLayout_Init(VALUE ffiModule); - typedef struct StructField_ StructField; - typedef struct StructLayout_ StructLayout; - typedef struct Struct_ Struct; - - struct StructField_ { - Type* type; - unsigned int offset; - - int referenceIndex; - - bool referenceRequired; - VALUE rbType; - VALUE rbName; - - VALUE (*get)(StructField* field, Struct* s); - void (*put)(StructField* field, Struct* s, VALUE value); - - MemoryOp* memoryOp; - }; - - struct StructLayout_ { - Type base; - StructField** fields; - int fieldCount; - int size; - int align; - ffi_type** ffiTypes; - struct st_table* fieldSymbolTable; - - /** The number of reference tracking fields in this struct */ - int referenceFieldCount; - - VALUE rbFieldNames; - VALUE rbFieldMap; - VALUE rbFields; - }; - - struct Struct_ { - StructLayout* layout; - AbstractMemory* pointer; - VALUE* rbReferences; - - VALUE rbLayout; - VALUE rbPointer; - }; - - extern VALUE rbffi_StructClass, rbffi_StructLayoutClass; - extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass; - extern VALUE rbffi_StructLayoutArrayFieldClass; - extern VALUE rbffi_StructInlineArrayClass; - extern VALUE rbffi_StructLayoutCharArrayClass; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_STRUCT_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c deleted file mode 100644 index 73e51116ef9681adc0cee1b854740947281abb00..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2010, Wayne Meissner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * The name of the author or authors may not be used to endorse or promote - * products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -# include -#endif -#include -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Pointer.h" -#include "Struct.h" -#include "StructByReference.h" - - -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -static VALUE sbr_allocate(VALUE); -static VALUE sbr_initialize(VALUE, VALUE); -static void sbr_mark(StructByReference *); - -VALUE rbffi_StructByReferenceClass = Qnil; - -static VALUE -sbr_allocate(VALUE klass) -{ - StructByReference* sbr; - - VALUE obj = Data_Make_Struct(klass, StructByReference, sbr_mark, -1, sbr); - - sbr->rbStructClass = Qnil; - - return obj; -} - -/* - * call-seq: initialize(struc_class) - * @param [Struct] struct_calss - * @return [self] - * A new instance of StructByReference. - */ -static VALUE -sbr_initialize(VALUE self, VALUE rbStructClass) -{ - StructByReference* sbr = NULL; - - if (!rb_class_inherited_p(rbStructClass, rbffi_StructClass)) { - rb_raise(rb_eTypeError, "wrong type (expected subclass of FFI::Struct)"); - } - - Data_Get_Struct(self, StructByReference, sbr); - sbr->rbStructClass = rbStructClass; - - return self; -} - -static void -sbr_mark(StructByReference *sbr) -{ - rb_gc_mark(sbr->rbStructClass); -} - - -/* - * call-seq: struct_class - * @return [Struct] - * Get +struct_class+. - */ -static VALUE -sbr_struct_class(VALUE self) -{ - StructByReference* sbr; - - Data_Get_Struct(self, StructByReference, sbr); - - return sbr->rbStructClass; -} - -/* - * call-seq: native_type - * @return [Class] - * Always get {FFI::Type}::POINTER. - */ -static VALUE -sbr_native_type(VALUE self) -{ - return rb_const_get(rbffi_TypeClass, rb_intern("POINTER")); -} - -/* - * call-seq: to_native(value, ctx) - * @param [nil, Struct] value - * @param [nil] ctx - * @return [AbstractMemory] Pointer on +value+. - */ -static VALUE -sbr_to_native(VALUE self, VALUE value, VALUE ctx) -{ - StructByReference* sbr; - Struct* s; - - if (unlikely(value == Qnil)) { - return rbffi_NullPointerSingleton; - } - - Data_Get_Struct(self, StructByReference, sbr); - if (!rb_obj_is_kind_of(value, sbr->rbStructClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", - rb_obj_classname(value), - RSTRING_PTR(rb_class_name(sbr->rbStructClass))); - } - - Data_Get_Struct(value, Struct, s); - - return s->rbPointer; -} - -/* - * call-seq: from_native(value, ctx) - * @param [AbstractMemory] value - * @param [nil] ctx - * @return [Struct] - * Create a struct from content of memory +value+. - */ -static VALUE -sbr_from_native(VALUE self, VALUE value, VALUE ctx) -{ - StructByReference* sbr; - - Data_Get_Struct(self, StructByReference, sbr); - - return rb_class_new_instance(1, &value, sbr->rbStructClass); -} - - -void -rbffi_StructByReference_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::StructByReference - * This class includes {FFI::DataConverter} module. - */ - rbffi_StructByReferenceClass = rb_define_class_under(moduleFFI, "StructByReference", rb_cObject); - rb_global_variable(&rbffi_StructByReferenceClass); - rb_include_module(rbffi_StructByReferenceClass, rb_const_get(moduleFFI, rb_intern("DataConverter"))); - - rb_define_alloc_func(rbffi_StructByReferenceClass, sbr_allocate); - rb_define_method(rbffi_StructByReferenceClass, "initialize", sbr_initialize, 1); - rb_define_method(rbffi_StructByReferenceClass, "struct_class", sbr_struct_class, 0); - rb_define_method(rbffi_StructByReferenceClass, "native_type", sbr_native_type, 0); - rb_define_method(rbffi_StructByReferenceClass, "to_native", sbr_to_native, 2); - rb_define_method(rbffi_StructByReferenceClass, "from_native", sbr_from_native, 2); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h deleted file mode 100644 index cf797af62fafe67d923dac71cb0da8f593869bf0..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * The name of the author or authors may not be used to endorse or promote - * products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_STRUCTBYREFERENCE_H -#define RBFFI_STRUCTBYREFERENCE_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct StructByReference_ { - VALUE rbStructClass; -} StructByReference; - -void rbffi_StructByReference_Init(VALUE moduleFFI); - -extern VALUE rbffi_StructByReferenceClass; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_STRUCTBYREFERENCE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c deleted file mode 100644 index 0d9fb9c5346f1258e0e9a560e3a6a0d7150571f4..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Type.h" -#include "StructByValue.h" -#include "Struct.h" - -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -static VALUE sbv_allocate(VALUE); -static VALUE sbv_initialize(VALUE, VALUE); -static void sbv_mark(StructByValue *); -static void sbv_free(StructByValue *); - -VALUE rbffi_StructByValueClass = Qnil; - -static VALUE -sbv_allocate(VALUE klass) -{ - StructByValue* sbv; - - VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv); - - sbv->rbStructClass = Qnil; - sbv->rbStructLayout = Qnil; - sbv->base.nativeType = NATIVE_STRUCT; - - sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType)); - sbv->base.ffiType->size = 0; - sbv->base.ffiType->alignment = 1; - sbv->base.ffiType->type = FFI_TYPE_STRUCT; - - return obj; -} - -static VALUE -sbv_initialize(VALUE self, VALUE rbStructClass) -{ - StructByValue* sbv = NULL; - StructLayout* layout = NULL; - VALUE rbLayout = Qnil; - - rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout")); - if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) { - rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)"); - } - - Data_Get_Struct(rbLayout, StructLayout, layout); - Data_Get_Struct(self, StructByValue, sbv); - sbv->rbStructClass = rbStructClass; - sbv->rbStructLayout = rbLayout; - - /* We can just use everything from the ffi_type directly */ - *sbv->base.ffiType = *layout->base.ffiType; - - return self; -} - -static void -sbv_mark(StructByValue *sbv) -{ - rb_gc_mark(sbv->rbStructClass); - rb_gc_mark(sbv->rbStructLayout); -} - -static void -sbv_free(StructByValue *sbv) -{ - xfree(sbv->base.ffiType); - xfree(sbv); -} - - -static VALUE -sbv_layout(VALUE self) -{ - StructByValue* sbv; - - Data_Get_Struct(self, StructByValue, sbv); - return sbv->rbStructLayout; -} - -static VALUE -sbv_struct_class(VALUE self) -{ - StructByValue* sbv; - - Data_Get_Struct(self, StructByValue, sbv); - - return sbv->rbStructClass; -} - -void -rbffi_StructByValue_Init(VALUE moduleFFI) -{ - rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass); - rb_global_variable(&rbffi_StructByValueClass); - rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass); - - rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate); - rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1); - rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0); - rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h deleted file mode 100644 index 07b27639d1e60ac07e3f7e14c027d34fad698ed2..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_STRUCTBYVALUE_H -#define RBFFI_STRUCTBYVALUE_H - -#include -#include "Type.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct StructByValue_ { - Type base; - VALUE rbStructClass; - VALUE rbStructLayout; -} StructByValue; - -void rbffi_StructByValue_Init(VALUE moduleFFI); - -extern VALUE rbffi_StructByValueClass; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_STRUCTBYVALUE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c deleted file mode 100644 index 483e532866341e7350241261b4c3d1154c4aa0d2..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#ifndef _MSC_VER -# include -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Function.h" -#include "Types.h" -#include "StructByValue.h" -#include "ArrayType.h" -#include "Function.h" -#include "MappedType.h" -#include "Struct.h" - -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -static void struct_layout_mark(StructLayout *); -static void struct_layout_free(StructLayout *); -static void struct_field_mark(StructField* ); - -VALUE rbffi_StructLayoutFieldClass = Qnil; -VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil; -VALUE rbffi_StructLayoutStringFieldClass = Qnil; -VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil; - -VALUE rbffi_StructLayoutClass = Qnil; - - -static VALUE -struct_field_allocate(VALUE klass) -{ - StructField* field; - VALUE obj; - - obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field); - field->rbType = Qnil; - field->rbName = Qnil; - - return obj; -} - -static void -struct_field_mark(StructField* f) -{ - rb_gc_mark(f->rbType); - rb_gc_mark(f->rbName); -} - -/* - * call-seq: initialize(name, offset, type) - * @param [String,Symbol] name - * @param [Fixnum] offset - * @param [FFI::Type] type - * @return [self] - * A new FFI::StructLayout::Field instance. - */ -static VALUE -struct_field_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil; - StructField* field; - int nargs; - - Data_Get_Struct(self, StructField, field); - - nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType); - - if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)", - rb_obj_classname(rbName)); - } - - Check_Type(rbOffset, T_FIXNUM); - - if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)", - rb_obj_classname(rbType)); - } - - field->offset = NUM2UINT(rbOffset); - field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName); - field->rbType = rbType; - Data_Get_Struct(field->rbType, Type, field->type); - field->memoryOp = get_memory_op(field->type); - field->referenceIndex = -1; - - switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) { - case NATIVE_FUNCTION: - case NATIVE_CALLBACK: - case NATIVE_POINTER: - field->referenceRequired = true; - break; - - default: - field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?")) - && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL))) - || (rb_respond_to(rbType, rb_intern("reference_required?")) - && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL))); - break; - } - - return self; -} - -/* - * call-seq: offset - * @return [Numeric] - * Get the field offset. - */ -static VALUE -struct_field_offset(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->offset); -} - -/* - * call-seq: size - * @return [Numeric] - * Get the field size. - */ -static VALUE -struct_field_size(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->type->ffiType->size); -} - -/* - * call-seq: alignment - * @return [Numeric] - * Get the field alignment. - */ -static VALUE -struct_field_alignment(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->type->ffiType->alignment); -} - -/* - * call-seq: type - * @return [Type] - * Get the field type. - */ -static VALUE -struct_field_type(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - - return field->rbType; -} - -/* - * call-seq: name - * @return [Symbol] - * Get the field name. - */ -static VALUE -struct_field_name(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return field->rbName; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [Object] - * Get an object of type {#type} from memory pointed by +pointer+. - */ -static VALUE -struct_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - if (f->memoryOp == NULL) { - rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType)); - return Qnil; - } - - return (*f->memoryOp->get)(MEMORY(pointer), f->offset); -} - -/* - * call-seq: put(pointer, value) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @param [Object] value this object must be a kind of {#type} - * @return [self] - * Put an object to memory pointed by +pointer+. - */ -static VALUE -struct_field_put(VALUE self, VALUE pointer, VALUE value) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - if (f->memoryOp == NULL) { - rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType)); - return self; - } - - (*f->memoryOp->put)(MEMORY(pointer), f->offset, value); - - return self; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [Function] - * Get a {Function} from memory pointed by +pointer+. - */ -static VALUE -function_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - - return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset)); -} - -/* - * call-seq: put(pointer, proc) - * @param [AbstractMemory] pointer pointer to a {Struct} - * @param [Function, Proc] proc - * @return [Function] - * Set a {Function} to memory pointed by +pointer+ as a function. - * - * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}. - */ -static VALUE -function_field_put(VALUE self, VALUE pointer, VALUE proc) -{ - StructField* f; - VALUE value = Qnil; - - Data_Get_Struct(self, StructField, f); - - if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { - value = proc; - } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) { - value = rbffi_Function_ForProc(f->rbType, proc); - } else { - rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)"); - } - - (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value); - - return self; -} - -static inline bool -isCharArray(ArrayType* arrayType) -{ - return arrayType->componentType->nativeType == NATIVE_INT8 - || arrayType->componentType->nativeType == NATIVE_UINT8; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray] - * Get an array from a {Struct}. - */ -static VALUE -array_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - ArrayType* array; - VALUE argv[2]; - - Data_Get_Struct(self, StructField, f); - Data_Get_Struct(f->rbType, ArrayType, array); - - argv[0] = pointer; - argv[1] = self; - - return rb_class_new_instance(2, argv, isCharArray(array) - ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass); -} - -/* - * call-seq: put(pointer, value) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+ - * @return [value] - * Set an array in a {Struct}. - */ -static VALUE -array_field_put(VALUE self, VALUE pointer, VALUE value) -{ - StructField* f; - ArrayType* array; - - - Data_Get_Struct(self, StructField, f); - Data_Get_Struct(f->rbType, ArrayType, array); - - if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) { - VALUE argv[2]; - - argv[0] = INT2FIX(f->offset); - argv[1] = value; - - rb_funcall2(pointer, rb_intern("put_string"), 2, argv); - - } else { -#ifdef notyet - MemoryOp* op; - int count = RARRAY_LEN(value); - int i; - AbstractMemory* memory = MEMORY(pointer); - - if (count > array->length) { - rb_raise(rb_eIndexError, "array too large"); - } - - /* clear the contents in case of a short write */ - checkWrite(memory); - checkBounds(memory, f->offset, f->type->ffiType->size); - if (count < array->length) { - memset(memory->address + f->offset + (count * array->componentType->ffiType->size), - 0, (array->length - count) * array->componentType->ffiType->size); - } - - /* now copy each element in */ - if ((op = get_memory_op(array->componentType)) != NULL) { - - for (i = 0; i < count; ++i) { - (*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i)); - } - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - - for (i = 0; i < count; ++i) { - VALUE entry = rb_ary_entry(value, i); - Struct* s; - - if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) { - rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct"); - break; - } - - Data_Get_Struct(entry, Struct, s); - checkRead(s->pointer); - checkBounds(s->pointer, 0, array->componentType->ffiType->size); - - memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size), - s->pointer->address, array->componentType->ffiType->size); - } - - } else { - rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType)); - } -#else - rb_raise(rb_eNotImpError, "cannot set array field"); -#endif - } - - return value; -} - - -static VALUE -struct_layout_allocate(VALUE klass) -{ - StructLayout* layout; - VALUE obj; - - obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout); - layout->rbFieldMap = Qnil; - layout->rbFieldNames = Qnil; - layout->rbFields = Qnil; - layout->fieldSymbolTable = st_init_numtable(); - layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType)); - layout->base.ffiType->size = 0; - layout->base.ffiType->alignment = 0; - layout->base.ffiType->type = FFI_TYPE_STRUCT; - - return obj; -} - -/* - * call-seq: initialize(fields, size, align) - * @param [Array] fields - * @param [Numeric] size - * @param [Numeric] align - * @return [self] - * A new StructLayout instance. - */ -static VALUE -struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align) -{ - StructLayout* layout; - ffi_type* ltype; - int i; - - Data_Get_Struct(self, StructLayout, layout); - layout->fieldCount = (int) RARRAY_LEN(fields); - layout->rbFieldMap = rb_hash_new(); - layout->rbFieldNames = rb_ary_new2(layout->fieldCount); - layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align)); - layout->align = NUM2INT(align); - layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *)); - layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *)); - layout->rbFields = rb_ary_new2(layout->fieldCount); - layout->referenceFieldCount = 0; - layout->base.ffiType->elements = layout->ffiTypes; - layout->base.ffiType->size = layout->size; - layout->base.ffiType->alignment = layout->align; - - ltype = layout->base.ffiType; - for (i = 0; i < (int) layout->fieldCount; ++i) { - VALUE rbField = rb_ary_entry(fields, i); - VALUE rbName; - StructField* field; - ffi_type* ftype; - - - if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) { - rb_raise(rb_eTypeError, "wrong type for field %d.", i); - } - rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL); - - Data_Get_Struct(rbField, StructField, field); - layout->fields[i] = field; - - if (field->type == NULL || field->type->ffiType == NULL) { - rb_raise(rb_eRuntimeError, "type of field %d not supported", i); - } - - ftype = field->type->ffiType; - if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) { - rb_raise(rb_eTypeError, "type of field %d has zero size", i); - } - - if (field->referenceRequired) { - field->referenceIndex = layout->referenceFieldCount++; - } - - - layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL; - st_insert(layout->fieldSymbolTable, rbName, rbField); - rb_hash_aset(layout->rbFieldMap, rbName, rbField); - rb_ary_push(layout->rbFields, rbField); - rb_ary_push(layout->rbFieldNames, rbName); - } - - if (ltype->size == 0) { - rb_raise(rb_eRuntimeError, "Struct size is zero"); - } - - return self; -} - -/* - * call-seq: [](field) - * @param [Symbol] field - * @return [StructLayout::Field] - * Get a field from the layout. - */ -static VALUE -struct_layout_union_bang(VALUE self) -{ - const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64, - &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL }; - StructLayout* layout; - ffi_type *t = NULL; - int count, i; - - Data_Get_Struct(self, StructLayout, layout); - - for (i = 0; alignment_types[i] != NULL; ++i) { - if (alignment_types[i]->alignment == layout->align) { - t = (ffi_type *) alignment_types[i]; - break; - } - } - if (t == NULL) { - rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align); - return Qnil; - } - - count = (int) layout->size / (int) t->size; - xfree(layout->ffiTypes); - layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *)); - layout->base.ffiType->elements = layout->ffiTypes; - - for (i = 0; i < count; ++i) { - layout->ffiTypes[i] = t; - } - - return self; -} - -static VALUE -struct_layout_aref(VALUE self, VALUE field) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_hash_aref(layout->rbFieldMap, field); -} - -/* - * call-seq: fields - * @return [Array] - * Get fields list. - */ -static VALUE -struct_layout_fields(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFields); -} - -/* - * call-seq: members - * @return [Array] - * Get list of field names. - */ -static VALUE -struct_layout_members(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFieldNames); -} - -/* - * call-seq: to_a - * @return [Array] - * Get an array of fields. - */ -static VALUE -struct_layout_to_a(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFields); -} - -static void -struct_layout_mark(StructLayout *layout) -{ - rb_gc_mark(layout->rbFieldMap); - rb_gc_mark(layout->rbFieldNames); - rb_gc_mark(layout->rbFields); -} - -static void -struct_layout_free(StructLayout *layout) -{ - xfree(layout->ffiTypes); - xfree(layout->base.ffiType); - xfree(layout->fields); - st_free_table(layout->fieldSymbolTable); - xfree(layout); -} - - -void -rbffi_StructLayout_Init(VALUE moduleFFI) -{ - VALUE ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::StructLayout < FFI::Type - * - * This class aims at defining a struct layout. - */ - rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type); - rb_global_variable(&rbffi_StructLayoutClass); - - /* - * Document-class: FFI::StructLayout::Field - * A field in a {StructLayout}. - */ - rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject); - rb_global_variable(&rbffi_StructLayoutFieldClass); - - /* - * Document-class: FFI::StructLayout::Number - * A numeric {Field} in a {StructLayout}. - */ - rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutNumberFieldClass); - - /* - * Document-class: FFI::StructLayout::String - * A string {Field} in a {StructLayout}. - */ - rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutStringFieldClass); - - /* - * Document-class: FFI::StructLayout::Pointer - * A pointer {Field} in a {StructLayout}. - */ - rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutPointerFieldClass); - - /* - * Document-class: FFI::StructLayout::Function - * A function pointer {Field} in a {StructLayout}. - */ - rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutFunctionFieldClass); - - /* - * Document-class: FFI::StructLayout::Array - * An array {Field} in a {StructLayout}. - */ - rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutArrayFieldClass); - - rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate); - rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1); - rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2); - rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1); - - rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2); - rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1); - - rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1); - rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2); - - rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate); - rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3); - rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1); - rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0); - rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0); - rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0); - rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0); - -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c deleted file mode 100644 index e85ea40b201b46e87719815b89e316da58e45d62..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (c) 2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifndef _MSC_VER -#include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif - -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -# include -# include -# include -#else -# include -# define _WINSOCKAPI_ -# include -#endif -#include -#include "Thread.h" - -#ifdef _WIN32 -static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES; -#else -static pthread_key_t thread_data_key; -struct thread_data { - rbffi_frame_t* frame; -}; -static inline struct thread_data* thread_data_get(void); - -#endif - -rbffi_frame_t* -rbffi_frame_current(void) -{ -#ifdef _WIN32 - return (rbffi_frame_t *) TlsGetValue(frame_thread_key); -#else - struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); - return td != NULL ? td->frame : NULL; -#endif -} - -void -rbffi_frame_push(rbffi_frame_t* frame) -{ - memset(frame, 0, sizeof(*frame)); - frame->has_gvl = true; - frame->exc = Qnil; - -#ifdef _WIN32 - frame->prev = TlsGetValue(frame_thread_key); - TlsSetValue(frame_thread_key, frame); -#else - frame->td = thread_data_get(); - frame->prev = frame->td->frame; - frame->td->frame = frame; -#endif -} - -void -rbffi_frame_pop(rbffi_frame_t* frame) -{ -#ifdef _WIN32 - TlsSetValue(frame_thread_key, frame->prev); -#else - frame->td->frame = frame->prev; -#endif -} - -#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) - -#if !defined(_WIN32) - -struct BlockingThread { - pthread_t tid; - VALUE (*fn)(void *); - void *data; - void (*ubf)(void *); - void *data2; - VALUE retval; - int wrfd; - int rdfd; -}; - -static void* -rbffi_blocking_thread(void* args) -{ - struct BlockingThread* thr = (struct BlockingThread *) args; - char c = 1; - VALUE retval; - - retval = (*thr->fn)(thr->data); - - pthread_testcancel(); - - thr->retval = retval; - - write(thr->wrfd, &c, sizeof(c)); - - return NULL; -} - -static VALUE -wait_for_thread(void *data) -{ - struct BlockingThread* thr = (struct BlockingThread *) data; - char c; - - if (read(thr->rdfd, &c, 1) < 1) { - rb_thread_wait_fd(thr->rdfd); - while (read(thr->rdfd, &c, 1) < 1 && rb_io_wait_readable(thr->rdfd) == Qtrue) { - ; - } - } - - return Qnil; -} - -static VALUE -cleanup_blocking_thread(void *data, VALUE exc) -{ - struct BlockingThread* thr = (struct BlockingThread *) data; - - if (thr->ubf != (void (*)(void *)) -1) { - (*thr->ubf)(thr->data2); - } else { - pthread_kill(thr->tid, SIGVTALRM); - } - - return exc; -} - -VALUE -rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2) -{ - struct BlockingThread* thr; - int fd[2]; - VALUE exc; - - if (pipe(fd) < 0) { - rb_raise(rb_eSystemCallError, "pipe(2) failed"); - return Qnil; - } - fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK); - - thr = ALLOC_N(struct BlockingThread, 1); - thr->rdfd = fd[0]; - thr->wrfd = fd[1]; - thr->fn = func; - thr->data = data1; - thr->ubf = ubf; - thr->data2 = data2; - thr->retval = Qnil; - - if (pthread_create(&thr->tid, NULL, rbffi_blocking_thread, thr) != 0) { - close(fd[0]); - close(fd[1]); - xfree(thr); - rb_raise(rb_eSystemCallError, "pipe(2) failed"); - return Qnil; - } - - exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr, - rb_eException); - - pthread_join(thr->tid, NULL); - close(fd[1]); - close(fd[0]); - xfree(thr); - - if (exc != Qnil) { - rb_exc_raise(exc); - } - - return thr->retval; -} - -#else -/* win32 implementation */ - -struct BlockingThread { - HANDLE tid; - VALUE (*fn)(void *); - void *data; - void (*ubf)(void *); - void *data2; - VALUE retval; - int wrfd; - int rdfd; -}; - -static DWORD __stdcall -rbffi_blocking_thread(LPVOID args) -{ - struct BlockingThread* thr = (struct BlockingThread *) args; - char c = 1; - VALUE retval; - - retval = (*thr->fn)(thr->data); - thr->retval = retval; - - write(thr->wrfd, &c, sizeof(c)); - - return 0; -} - -static VALUE -wait_for_thread(void *data) -{ - struct BlockingThread* thr = (struct BlockingThread *) data; - char c, res; - fd_set rfds; - - FD_ZERO(&rfds); - FD_SET(thr->rdfd, &rfds); - rb_thread_select(thr->rdfd + 1, &rfds, NULL, NULL, NULL); - read(thr->rdfd, &c, 1); - return Qnil; -} - -static VALUE -cleanup_blocking_thread(void *data, VALUE exc) -{ - struct BlockingThread* thr = (struct BlockingThread *) data; - - if (thr->ubf != (void (*)(void *)) -1) { - (*thr->ubf)(thr->data2); - } else { - TerminateThread(thr->tid, 0); - } - - return exc; -} - -VALUE -rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2) -{ - struct BlockingThread* thr; - int fd[2]; - VALUE exc; - DWORD state; - DWORD res; - - if (_pipe(fd, 1024, O_BINARY) == -1) { - rb_raise(rb_eSystemCallError, "_pipe() failed"); - return Qnil; - } - - thr = ALLOC_N(struct BlockingThread, 1); - thr->rdfd = fd[0]; - thr->wrfd = fd[1]; - thr->fn = func; - thr->data = data1; - thr->ubf = ubf; - thr->data2 = data2; - thr->retval = Qnil; - - thr->tid = CreateThread(NULL, 0, rbffi_blocking_thread, thr, 0, NULL); - if (!thr->tid) { - close(fd[0]); - close(fd[1]); - xfree(thr); - rb_raise(rb_eSystemCallError, "CreateThread() failed"); - return Qnil; - } - - exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr, - rb_eException); - - /* The thread should be finished, already. */ - WaitForSingleObject(thr->tid, INFINITE); - CloseHandle(thr->tid); - close(fd[1]); - close(fd[0]); - xfree(thr); - - if (exc != Qnil) { - rb_exc_raise(exc); - } - - return thr->retval; -} - -#endif /* !_WIN32 */ - -#endif /* HAVE_RB_THREAD_BLOCKING_REGION */ - -#ifndef _WIN32 -static struct thread_data* thread_data_init(void); - -static inline struct thread_data* -thread_data_get(void) -{ - struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); - return td != NULL ? td : thread_data_init(); -} - -static struct thread_data* -thread_data_init(void) -{ - struct thread_data* td = calloc(1, sizeof(struct thread_data)); - - pthread_setspecific(thread_data_key, td); - - return td; -} - -static void -thread_data_free(void *ptr) -{ - free(ptr); -} -#endif - -void -rbffi_Thread_Init(VALUE moduleFFI) -{ -#ifdef _WIN32 - frame_thread_key = TlsAlloc(); -#else - pthread_key_create(&thread_data_key, thread_data_free); -#endif -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h deleted file mode 100644 index c51a5a93e559cf805c99cd19cb8d659f93efdc5c..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_THREAD_H -#define RBFFI_THREAD_H - -#ifndef _MSC_VER -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include -#include "extconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef _WIN32 -# include -#else -# include -#endif - -typedef struct { -#ifdef _WIN32 - DWORD id; -#else - pthread_t id; -#endif - bool valid; - bool has_gvl; - VALUE exc; -} rbffi_thread_t; - -typedef struct rbffi_frame { -#ifndef _WIN32 - struct thread_data* td; -#endif - struct rbffi_frame* prev; - bool has_gvl; - VALUE exc; -} rbffi_frame_t; - -rbffi_frame_t* rbffi_frame_current(void); -void rbffi_frame_push(rbffi_frame_t* frame); -void rbffi_frame_pop(rbffi_frame_t* frame); - -#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL -# define rbffi_thread_blocking_region rb_thread_call_without_gvl - -#elif defined(HAVE_RB_THREAD_BLOCKING_REGION) -# define rbffi_thread_blocking_region rb_thread_blocking_region - -#else - -VALUE rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2); - -#endif - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_THREAD_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c deleted file mode 100644 index 034482f2c4e3d2c515470f0559725514ed469606..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif - -#include -#include -#include -#include "rbffi.h" -#include "compat.h" -#include "Types.h" -#include "Type.h" - - -typedef struct BuiltinType_ { - Type type; - char* name; -} BuiltinType; - -static void builtin_type_free(BuiltinType *); - -VALUE rbffi_TypeClass = Qnil; - -static VALUE classBuiltinType = Qnil; -static VALUE moduleNativeType = Qnil; -static VALUE typeMap = Qnil, sizeMap = Qnil; -static ID id_find_type = 0, id_type_size = 0, id_size = 0; - -static VALUE -type_allocate(VALUE klass) -{ - Type* type; - VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type); - - type->nativeType = -1; - type->ffiType = &ffi_type_void; - - return obj; -} - -/* - * Document-method: initialize - * call-seq: initialize(value) - * @param [Fixnum,Type] value - * @return [self] - */ -static VALUE -type_initialize(VALUE self, VALUE value) -{ - Type* type; - Type* other; - - Data_Get_Struct(self, Type, type); - - if (FIXNUM_P(value)) { - type->nativeType = FIX2INT(value); - } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) { - Data_Get_Struct(value, Type, other); - type->nativeType = other->nativeType; - type->ffiType = other->ffiType; - } else { - rb_raise(rb_eArgError, "wrong type"); - } - - return self; -} - -/* - * call-seq: type.size - * @return [Fixnum] - * Return type's size, in bytes. - */ -static VALUE -type_size(VALUE self) -{ - Type *type; - - Data_Get_Struct(self, Type, type); - - return INT2FIX(type->ffiType->size); -} - -/* - * call-seq: type.alignment - * @return [Fixnum] - * Get Type alignment. - */ -static VALUE -type_alignment(VALUE self) -{ - Type *type; - - Data_Get_Struct(self, Type, type); - - return INT2FIX(type->ffiType->alignment); -} - -/* - * call-seq: type.inspect - * @return [String] - * Inspect {Type} object. - */ -static VALUE -type_inspect(VALUE self) -{ - char buf[100]; - Type *type; - - Data_Get_Struct(self, Type, type); - - snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>", - rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment); - - return rb_str_new2(buf); -} - -static VALUE -builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name) -{ - BuiltinType* type; - VALUE obj = Qnil; - - obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type); - - type->name = strdup(name); - type->type.nativeType = nativeType; - type->type.ffiType = ffiType; - - return obj; -} - -static void -builtin_type_free(BuiltinType *type) -{ - free(type->name); - xfree(type); -} - -/* - * call-seq: type.inspect - * @return [String] - * Inspect {Type::Builtin} object. - */ -static VALUE -builtin_type_inspect(VALUE self) -{ - char buf[100]; - BuiltinType *type; - - Data_Get_Struct(self, BuiltinType, type); - snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>", - rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment); - - return rb_str_new2(buf); -} - -int -rbffi_type_size(VALUE type) -{ - int t = TYPE(type); - - if (t == T_FIXNUM || t == T_BIGNUM) { - return NUM2INT(type); - - } else if (t == T_SYMBOL) { - /* - * Try looking up directly in the type and size maps - */ - VALUE nType; - if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) { - if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) { - Type* type; - Data_Get_Struct(nType, Type, type); - return (int) type->ffiType->size; - - } else if (rb_respond_to(nType, id_size)) { - return NUM2INT(rb_funcall2(nType, id_size, 0, NULL)); - } - } - - /* Not found - call up to the ruby version to resolve */ - return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type)); - - } else { - return NUM2INT(rb_funcall2(type, id_size, 0, NULL)); - } -} - -VALUE -rbffi_Type_Lookup(VALUE name) -{ - int t = TYPE(name); - if (t == T_SYMBOL || t == T_STRING) { - /* - * Try looking up directly in the type Map - */ - VALUE nType; - if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) { - return nType; - } - } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) { - - return name; - } - - /* Nothing found - let caller handle raising exceptions */ - return Qnil; -} - -/** - * rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the - * type is not found. - */ -VALUE -rbffi_Type_Find(VALUE name) -{ - VALUE rbType = rbffi_Type_Lookup(name); - - if (!RTEST(rbType)) { - VALUE s = rb_inspect(name); - rb_raise(rb_eTypeError, "invalid type, %s", RSTRING_PTR(s)); - RB_GC_GUARD(s); - } - - return rbType; -} - -void -rbffi_Type_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::Type - * This class manages C types. - * - * It embbed {FFI::Type::Builtin} objects as constants (for names, - * see {FFI::NativeType}). - */ - rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject); - - /* - * Document-constant: FFI::TypeDefs - */ - rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new()); - rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new()); - rb_global_variable(&typeMap); - rb_global_variable(&sizeMap); - id_find_type = rb_intern("find_type"); - id_type_size = rb_intern("type_size"); - id_size = rb_intern("size"); - - /* - * Document-class: FFI::Type::Builtin - * Class for Built-in types. - */ - classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass); - /* - * Document-module: FFI::NativeType - * This module defines constants for native (C) types. - * - * ==Native type constants - * Native types are defined by constants : - * * INT8, SCHAR, CHAR - * * UINT8, UCHAR - * * INT16, SHORT, SSHORT - * * UINT16, USHORT - * * INT32,, INT, SINT - * * UINT32, UINT - * * INT64, LONG_LONG, SLONG_LONG - * * UINT64, ULONG_LONG - * * LONG, SLONG - * * ULONG - * * FLOAT32, FLOAT - * * FLOAT64, DOUBLE - * * POINTER - * * CALLBACK - * * FUNCTION - * * CHAR_ARRAY - * * BOOL - * * STRING (immutable string, nul terminated) - * * STRUCT (struct-b-value param or result) - * * ARRAY (array type definition) - * * MAPPED (custom native type) - * For function return type only : - * * VOID - * For function argument type only : - * * BUFFER_IN - * * BUFFER_OUT - * * VARARGS (function takes a variable number of arguments) - * - * All these constants are exported to {FFI} module prefixed with "TYPE_". - * They are objets from {FFI::Type::Builtin} class. - */ - moduleNativeType = rb_define_module_under(moduleFFI, "NativeType"); - - /* - * Document-global: FFI::Type - */ - rb_global_variable(&rbffi_TypeClass); - rb_global_variable(&classBuiltinType); - rb_global_variable(&moduleNativeType); - - rb_define_alloc_func(rbffi_TypeClass, type_allocate); - rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1); - rb_define_method(rbffi_TypeClass, "size", type_size, 0); - rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0); - rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0); - - /* Make Type::Builtin non-allocatable */ - rb_undef_method(CLASS_OF(classBuiltinType), "new"); - rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0); - - rb_global_variable(&rbffi_TypeClass); - rb_global_variable(&classBuiltinType); - - /* Define all the builtin types */ - #define T(x, ffiType) do { \ - VALUE t = Qnil; \ - rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \ - rb_define_const(moduleNativeType, #x, t); \ - rb_define_const(moduleFFI, "TYPE_" #x, t); \ - } while(0) - - #define A(old_type, new_type) do { \ - VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \ - rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \ - } while(0) - - /* - * Document-constant: FFI::Type::Builtin::VOID - */ - T(VOID, &ffi_type_void); - T(INT8, &ffi_type_sint8); - A(INT8, SCHAR); - A(INT8, CHAR); - T(UINT8, &ffi_type_uint8); - A(UINT8, UCHAR); - - T(INT16, &ffi_type_sint16); - A(INT16, SHORT); - A(INT16, SSHORT); - T(UINT16, &ffi_type_uint16); - A(UINT16, USHORT); - T(INT32, &ffi_type_sint32); - A(INT32, INT); - A(INT32, SINT); - T(UINT32, &ffi_type_uint32); - A(UINT32, UINT); - T(INT64, &ffi_type_sint64); - A(INT64, LONG_LONG); - A(INT64, SLONG_LONG); - T(UINT64, &ffi_type_uint64); - A(UINT64, ULONG_LONG); - T(LONG, &ffi_type_slong); - A(LONG, SLONG); - T(ULONG, &ffi_type_ulong); - T(FLOAT32, &ffi_type_float); - A(FLOAT32, FLOAT); - T(FLOAT64, &ffi_type_double); - A(FLOAT64, DOUBLE); - T(LONGDOUBLE, &ffi_type_longdouble); - T(POINTER, &ffi_type_pointer); - T(STRING, &ffi_type_pointer); - T(BUFFER_IN, &ffi_type_pointer); - T(BUFFER_OUT, &ffi_type_pointer); - T(BUFFER_INOUT, &ffi_type_pointer); - T(BOOL, &ffi_type_uchar); - T(VARARGS, &ffi_type_void); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h deleted file mode 100644 index d5522ee8a17673f560a25548bc2d2bbb40a731d9..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * This file is part of ruby-ffi. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the Evan Phoenix nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef RBFFI_TYPE_H -#define RBFFI_TYPE_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct Type_ Type; - -#include "Types.h" - -struct Type_ { - NativeType nativeType; - ffi_type* ffiType; -}; - -extern VALUE rbffi_TypeClass; -extern VALUE rbffi_Type_Lookup(VALUE type); -extern VALUE rbffi_Type_Find(VALUE type); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_TYPE_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c deleted file mode 100644 index bccf8943f1011c487fbc46a9f9a289ee60ba74b9..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Aman Gupta. - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include "Pointer.h" -#include "rbffi.h" -#include "Function.h" -#include "StructByValue.h" -#include "Types.h" -#include "Struct.h" -#include "MappedType.h" -#include "MemoryPointer.h" -#include "LongDouble.h" - -static ID id_from_native = 0; - - -VALUE -rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr) -{ - switch (type->nativeType) { - case NATIVE_VOID: - return Qnil; - case NATIVE_INT8: - return INT2NUM((signed char) *(ffi_sarg *) ptr); - case NATIVE_INT16: - return INT2NUM((signed short) *(ffi_sarg *) ptr); - case NATIVE_INT32: - return INT2NUM((signed int) *(ffi_sarg *) ptr); - case NATIVE_LONG: - return LONG2NUM((signed long) *(ffi_sarg *) ptr); - case NATIVE_INT64: - return LL2NUM(*(signed long long *) ptr); - - case NATIVE_UINT8: - return UINT2NUM((unsigned char) *(ffi_arg *) ptr); - case NATIVE_UINT16: - return UINT2NUM((unsigned short) *(ffi_arg *) ptr); - case NATIVE_UINT32: - return UINT2NUM((unsigned int) *(ffi_arg *) ptr); - case NATIVE_ULONG: - return ULONG2NUM((unsigned long) *(ffi_arg *) ptr); - case NATIVE_UINT64: - return ULL2NUM(*(unsigned long long *) ptr); - - case NATIVE_FLOAT32: - return rb_float_new(*(float *) ptr); - case NATIVE_FLOAT64: - return rb_float_new(*(double *) ptr); - - case NATIVE_LONGDOUBLE: - return rbffi_longdouble_new(*(long double *) ptr); - - case NATIVE_STRING: - return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil; - case NATIVE_POINTER: - return rbffi_Pointer_NewInstance(*(void **) ptr); - case NATIVE_BOOL: - return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse; - - case NATIVE_FUNCTION: - case NATIVE_CALLBACK: { - return *(void **) ptr != NULL - ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr)) - : Qnil; - } - - case NATIVE_STRUCT: { - StructByValue* sbv = (StructByValue *)type; - AbstractMemory* mem; - VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false); - - Data_Get_Struct(rbMemory, AbstractMemory, mem); - memcpy(mem->address, ptr, sbv->base.ffiType->size); - RB_GC_GUARD(rbMemory); - RB_GC_GUARD(rbType); - - return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass); - } - - case NATIVE_MAPPED: { - /* - * For mapped types, first convert to the real native type, then upcall to - * ruby to convert to the expected return type - */ - MappedType* m = (MappedType *) type; - VALUE values[2], rbReturnValue; - - values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr); - values[1] = Qnil; - - - rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values); - RB_GC_GUARD(values[0]); - RB_GC_GUARD(rbType); - - return rbReturnValue; - } - - default: - rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType); - return Qnil; - } -} - -void -rbffi_Types_Init(VALUE moduleFFI) -{ - id_from_native = rb_intern("from_native"); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h deleted file mode 100644 index 0d4806f85a89cd8d31df9a5f9a779eb4e54b4c6a..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_TYPES_H -#define RBFFI_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - NATIVE_VOID, - NATIVE_INT8, - NATIVE_UINT8, - NATIVE_INT16, - NATIVE_UINT16, - NATIVE_INT32, - NATIVE_UINT32, - NATIVE_INT64, - NATIVE_UINT64, - NATIVE_LONG, - NATIVE_ULONG, - NATIVE_FLOAT32, - NATIVE_FLOAT64, - NATIVE_LONGDOUBLE, - NATIVE_POINTER, - NATIVE_CALLBACK, - NATIVE_FUNCTION, - NATIVE_BUFFER_IN, - NATIVE_BUFFER_OUT, - NATIVE_BUFFER_INOUT, - NATIVE_CHAR_ARRAY, - NATIVE_BOOL, - - /** An immutable string. Nul terminated, but only copies in to the native function */ - NATIVE_STRING, - - /** The function takes a variable number of arguments */ - NATIVE_VARARGS, - - /** Struct-by-value param or result */ - NATIVE_STRUCT, - - /** An array type definition */ - NATIVE_ARRAY, - - /** Custom native type */ - NATIVE_MAPPED, -} NativeType; - -#include -#include "Type.h" - -VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr); -void rbffi_Types_Init(VALUE moduleFFI); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_TYPES_H */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c deleted file mode 100644 index 877ffaba56f6bb220652a68386ce6fd963c2acac..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (C) 2009 Andrea Fazzi - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _MSC_VER -#include -#endif -#include - -#include -#ifndef _MSC_VER -# include -# include -#else -# include "win32/stdbool.h" -# include "win32/stdint.h" -#endif -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "MethodHandle.h" -#include "Call.h" -#include "Thread.h" - -typedef struct VariadicInvoker_ { - VALUE rbAddress; - VALUE rbReturnType; - VALUE rbEnums; - - Type* returnType; - ffi_abi abi; - void* function; - int paramCount; - bool blocking; -} VariadicInvoker; - - -static VALUE variadic_allocate(VALUE klass); -static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, - VALUE rbReturnType, VALUE options); -static void variadic_mark(VariadicInvoker *); - -static VALUE classVariadicInvoker = Qnil; - - -static VALUE -variadic_allocate(VALUE klass) -{ - VariadicInvoker *invoker; - VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker); - - invoker->rbAddress = Qnil; - invoker->rbEnums = Qnil; - invoker->rbReturnType = Qnil; - invoker->blocking = false; - - return obj; -} - -static void -variadic_mark(VariadicInvoker *invoker) -{ - rb_gc_mark(invoker->rbEnums); - rb_gc_mark(invoker->rbAddress); - rb_gc_mark(invoker->rbReturnType); -} - -static VALUE -variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options) -{ - VariadicInvoker* invoker = NULL; - VALUE retval = Qnil; - VALUE convention = Qnil; - VALUE fixed = Qnil; -#if defined(X86_WIN32) - VALUE rbConventionStr; -#endif - int i; - - Check_Type(options, T_HASH); - convention = rb_hash_aref(options, ID2SYM(rb_intern("convention"))); - - Data_Get_Struct(self, VariadicInvoker, invoker); - invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums"))); - invoker->rbAddress = rbFunction; - invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address; - invoker->blocking = RTEST(rb_hash_aref(options, ID2SYM(rb_intern("blocking")))); - -#if defined(X86_WIN32) - rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL); - invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) - ? FFI_STDCALL : FFI_DEFAULT_ABI; -#else - invoker->abi = FFI_DEFAULT_ABI; -#endif - - invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType); - if (!RTEST(invoker->rbReturnType)) { - VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); - } - - Data_Get_Struct(rbReturnType, Type, invoker->returnType); - - invoker->paramCount = -1; - - fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1); - for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) { - VALUE entry = rb_ary_entry(rbParameterTypes, i); - VALUE rbType = rbffi_Type_Lookup(entry); - Type* type; - - if (!RTEST(rbType)) { - VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); - } - Data_Get_Struct(rbType, Type, type); - if (type->nativeType != NATIVE_VARARGS) { - rb_ary_push(fixed, entry); - } - } - /* - * @fixed and @type_map are used by the parameter mangling ruby code - */ - rb_iv_set(self, "@fixed", fixed); - rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map")))); - - return retval; -} - -static VALUE -variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues) -{ - VariadicInvoker* invoker; - FFIStorage* params; - void* retval; - ffi_cif cif; - void** ffiValues; - ffi_type** ffiParamTypes; - ffi_type* ffiReturnType; - Type** paramTypes; - VALUE* argv; - int paramCount = 0, fixedCount = 0, i; - ffi_status ffiStatus; - rbffi_frame_t frame = { 0 }; - - Check_Type(parameterTypes, T_ARRAY); - Check_Type(parameterValues, T_ARRAY); - - Data_Get_Struct(self, VariadicInvoker, invoker); - paramCount = (int) RARRAY_LEN(parameterTypes); - paramTypes = ALLOCA_N(Type *, paramCount); - ffiParamTypes = ALLOCA_N(ffi_type *, paramCount); - params = ALLOCA_N(FFIStorage, paramCount); - ffiValues = ALLOCA_N(void*, paramCount); - argv = ALLOCA_N(VALUE, paramCount); - retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG)); - - for (i = 0; i < paramCount; ++i) { - VALUE rbType = rb_ary_entry(parameterTypes, i); - - if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { - rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)"); - } - Data_Get_Struct(rbType, Type, paramTypes[i]); - - switch (paramTypes[i]->nativeType) { - case NATIVE_INT8: - case NATIVE_INT16: - case NATIVE_INT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - case NATIVE_UINT8: - case NATIVE_UINT16: - case NATIVE_UINT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - - case NATIVE_FLOAT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - - default: - break; - } - - - ffiParamTypes[i] = paramTypes[i]->ffiType; - if (ffiParamTypes[i] == NULL) { - rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType); - } - argv[i] = rb_ary_entry(parameterValues, i); - } - - ffiReturnType = invoker->returnType->ffiType; - if (ffiReturnType == NULL) { - rb_raise(rb_eArgError, "Invalid return type"); - } - - /*Get the number of fixed args from @fixed array*/ - fixedCount = RARRAY_LEN(rb_iv_get(self, "@fixed")); - -#ifdef HAVE_FFI_PREP_CIF_VAR - ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, fixedCount, paramCount, ffiReturnType, ffiParamTypes); -#else - ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes); -#endif - switch (ffiStatus) { - case FFI_BAD_ABI: - rb_raise(rb_eArgError, "Invalid ABI specified"); - case FFI_BAD_TYPEDEF: - rb_raise(rb_eArgError, "Invalid argument type specified"); - case FFI_OK: - break; - default: - rb_raise(rb_eArgError, "Unknown FFI error"); - } - - rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params, - ffiValues, NULL, 0, invoker->rbEnums); - - rbffi_frame_push(&frame); -#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL - /* In Call.c, blocking: true is supported on older ruby variants - * without rb_thread_call_without_gvl by allocating on the heap instead - * of the stack. Since this functionality is being added later, - * we’re skipping support for old rubies here. */ - if(unlikely(invoker->blocking)) { - rbffi_blocking_call_t* bc; - bc = ALLOCA_N(rbffi_blocking_call_t, 1); - bc->retval = retval; - bc->function = invoker->function; - bc->ffiValues = ffiValues; - bc->params = params; - bc->frame = &frame; - bc->cif = cif; - - rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); - } else { - ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); - } -#else - ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); -#endif - rbffi_frame_pop(&frame); - - rbffi_save_errno(); - - if (RTEST(frame.exc) && frame.exc != Qnil) { - rb_exc_raise(frame.exc); - } - - return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval); -} - - -void -rbffi_Variadic_Init(VALUE moduleFFI) -{ - classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject); - rb_global_variable(&classVariadicInvoker); - - rb_define_alloc_func(classVariadicInvoker, variadic_allocate); - - rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4); - rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h deleted file mode 100644 index a4dfc08516a141d4dfb5011c758503cb57fae03c..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RBFFI_COMPAT_H -#define RBFFI_COMPAT_H - -#include - -#ifndef RARRAY_LEN -# define RARRAY_LEN(ary) RARRAY(ary)->len -#endif - -#ifndef RARRAY_PTR -# define RARRAY_PTR(ary) RARRAY(ary)->ptr -#endif - -#ifndef RSTRING_LEN -# define RSTRING_LEN(s) RSTRING(s)->len -#endif - -#ifndef RSTRING_PTR -# define RSTRING_PTR(s) RSTRING(s)->ptr -#endif - -#ifndef NUM2ULL -# define NUM2ULL(x) rb_num2ull((VALUE)x) -#endif - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -#ifdef __GNUC__ -# define likely(x) __builtin_expect((x), 1) -# define unlikely(x) __builtin_expect((x), 0) -#else -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -#ifndef MAX -# define MAX(a, b) ((a) < (b) ? (b) : (a)) -#endif -#ifndef MIN -# define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef RB_GC_GUARD -# define RB_GC_GUARD(x) (x) -#endif - -#endif /* RBFFI_COMPAT_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h deleted file mode 100644 index 35d51402f6a70d1b96395e9a30b70bf714ff3538..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef EXTCONF_H -#define EXTCONF_H -#define HAVE_RUBY_THREAD_H 1 -#define HAVE_RB_THREAD_CALL_WITH_GVL 1 -#define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 -#define HAVE_FFI_PREP_CIF_VAR 1 -#define USE_INTERNAL_LIBFFI 1 -#define RUBY_1_9 1 -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb deleted file mode 100644 index 45ab9770ff77c8cc9f086e85ccd1278d590b0f51..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env ruby - -if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' - require 'mkmf' - require 'rbconfig' - dir_config("ffi_c") - - # recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all - $warnflags = '' - $CFLAGS.gsub!(/[\s+]-ansi/, '') - $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '') - # solaris 10 needs -c99 for - $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/ - - if ENV['RUBY_CC_VERSION'].nil? && (pkg_config("libffi") || - have_header("ffi.h") || - find_header("ffi.h", "/usr/local/include", "/usr/include/ffi")) - - # We need at least ffi_call and ffi_closure_alloc - libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) || - have_library("libffi", "ffi_call", [ "ffi.h" ]) - libffi_ok &&= have_func("ffi_closure_alloc") - - # Check if the raw api is available. - $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure") - end - - have_header('shlwapi.h') - have_header('ruby/thread.h') # for compat with ruby < 2.0 - have_func('rb_thread_blocking_region') - have_func('rb_thread_call_with_gvl') - have_func('rb_thread_call_without_gvl') - - if libffi_ok - have_func('ffi_prep_cif_var') - else - $defs << "-DHAVE_FFI_PREP_CIF_VAR" - end - - $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works - $defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok - $defs << "-DRUBY_1_9" if RUBY_VERSION >= "1.9.0" - $defs << "-DFFI_BUILDING" if RbConfig::CONFIG['host_os'] =~ /mswin/ # for compatibility with newer libffi - - create_header - - $LOCAL_LIBS << " ./libffi/.libs/libffi_convenience.lib" if !libffi_ok && RbConfig::CONFIG['host_os'] =~ /mswin/ - - create_makefile("ffi_c") - unless libffi_ok - File.open("Makefile", "a") do |mf| - mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias") - if RbConfig::CONFIG['host_os'].downcase =~ /darwin/ - mf.puts "include ${srcdir}/libffi.darwin.mk" - elsif RbConfig::CONFIG['host_os'].downcase =~ /bsd/ - mf.puts '.include "${srcdir}/libffi.bsd.mk"' - elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin64/ - mf.puts '!include $(srcdir)/libffi.vc64.mk' - elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin32/ - mf.puts '!include $(srcdir)/libffi.vc.mk' - else - mf.puts "include ${srcdir}/libffi.mk" - end - end - end - -else - File.open("Makefile", "w") do |mf| - mf.puts "# Dummy makefile for non-mri rubies" - mf.puts "all install::\n" - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c deleted file mode 100644 index ea9a0587614460136610c27b7f655a0b1cf588f6..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Ruby FFI project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include - -#include "rbffi.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Struct.h" -#include "StructByValue.h" -#include "StructByReference.h" -#include "DynamicLibrary.h" -#include "Platform.h" -#include "Types.h" -#include "LastError.h" -#include "Function.h" -#include "ClosurePool.h" -#include "MethodHandle.h" -#include "Call.h" -#include "ArrayType.h" -#include "MappedType.h" - -void Init_ffi_c(void); - -VALUE rbffi_FFIModule = Qnil; - -static VALUE moduleFFI = Qnil; - -void -Init_ffi_c(void) -{ - /* - * Document-module: FFI - * - * This module embbed type constants from {FFI::NativeType}. - */ - rbffi_FFIModule = moduleFFI = rb_define_module("FFI"); - rb_global_variable(&rbffi_FFIModule); - - rbffi_Thread_Init(rbffi_FFIModule); - - /* FFI::Type needs to be initialized before most other classes */ - rbffi_Type_Init(moduleFFI); - - rbffi_DataConverter_Init(moduleFFI); - - rbffi_ArrayType_Init(moduleFFI); - rbffi_LastError_Init(moduleFFI); - rbffi_Call_Init(moduleFFI); - rbffi_ClosurePool_Init(moduleFFI); - rbffi_MethodHandle_Init(moduleFFI); - rbffi_Platform_Init(moduleFFI); - rbffi_AbstractMemory_Init(moduleFFI); - rbffi_Pointer_Init(moduleFFI); - rbffi_Function_Init(moduleFFI); - rbffi_MemoryPointer_Init(moduleFFI); - rbffi_Buffer_Init(moduleFFI); - rbffi_StructByValue_Init(moduleFFI); - rbffi_StructByReference_Init(moduleFFI); - rbffi_Struct_Init(moduleFFI); - rbffi_DynamicLibrary_Init(moduleFFI); - rbffi_Variadic_Init(moduleFFI); - rbffi_Types_Init(moduleFFI); - rbffi_MappedType_Init(moduleFFI); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle deleted file mode 100755 index e9433c468a53a6326142bfca1a84ee42297e9710..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib deleted file mode 100755 index 8dc33a4c75bbc6943ff9c08a601311e228a23a6b..0000000000000000000000000000000000000000 Binary files a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib and /dev/null differ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib deleted file mode 120000 index 04debe8fe0f5d11dd750872dc94c46dc323b5a9d..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib +++ /dev/null @@ -1 +0,0 @@ -libffi.7.dylib \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la deleted file mode 120000 index 004dbb5d10a9c8cd7808870bc2437378fe26528d..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la +++ /dev/null @@ -1 +0,0 @@ -../libffi.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai deleted file mode 100644 index d720fef1cc42b888931f4b8eca740d15d3f7cdb2..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai +++ /dev/null @@ -1,41 +0,0 @@ -# libffi.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libffi.7.dylib' - -# Names of this library. -library_names='libffi.7.dylib libffi.dylib' - -# The name of the static archive. -old_library='' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libffi. -current=8 -age=1 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la deleted file mode 120000 index 0727452facd922f90a9b944245bd729af34ce3c5..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la +++ /dev/null @@ -1 +0,0 @@ -../libffi_convenience.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile deleted file mode 100644 index 7e46b90d3a54ce7f53c2f707cd6f4d5823fe69e0..0000000000000000000000000000000000000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile +++ /dev/null @@ -1,1809 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994-2014 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - - - -VPATH = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/libffi -pkgincludedir = $(includedir)/libffi -pkglibdir = $(libdir)/libffi -pkglibexecdir = $(libexecdir)/libffi -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = x86_64-apple-darwin18.6.0 -host_triplet = x86_64-apple-darwin18.6.0 -target_triplet = x86_64-apple-darwin18.6.0 -#am__append_1 = doc -#am__append_2 = src/debug.c -# Build debug. Define FFI_DEBUG on the commandline so that, when building with -# MSVC, it can link against the debug CRT. -#am__append_3 = -DFFI_DEBUG -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/m4/ax_compiler_vendor.m4 \ - $(top_srcdir)/m4/ax_configure_args.m4 \ - $(top_srcdir)/m4/ax_enable_builddir.m4 \ - $(top_srcdir)/m4/ax_gcc_archflag.m4 \ - $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(noinst_HEADERS) $(am__DIST_COMMON) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = fficonfig.h -CONFIG_CLEAN_FILES = libffi.pc -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \ - "$(DESTDIR)$(pkgconfigdir)" -LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) -am__DEPENDENCIES_1 = -am__libffi_la_SOURCES_DIST = src/prep_cif.c src/types.c src/raw_api.c \ - src/java_raw_api.c src/closures.c src/debug.c -am__dirstamp = $(am__leading_dot)dirstamp -#am__objects_1 = src/debug.lo -am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo $(am__objects_1) -libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) -AM_V_lt = $(am__v_lt_$(V)) -am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) -am__v_lt_0 = --silent -am__v_lt_1 = -libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ -am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) -am__libffi_convenience_la_SOURCES_DIST = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c src/debug.c -am__objects_2 = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo $(am__objects_1) -am_libffi_convenience_la_OBJECTS = $(am__objects_2) -nodist_libffi_convenience_la_OBJECTS = -libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ - $(nodist_libffi_convenience_la_OBJECTS) -AM_V_P = $(am__v_P_$(V)) -am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I. -I$(srcdir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CCASFLAGS) $(CCASFLAGS) -AM_V_CPPAS = $(am__v_CPPAS_$(V)) -am__v_CPPAS_ = $(am__v_CPPAS_$(AM_DEFAULT_VERBOSITY)) -am__v_CPPAS_0 = @echo " CPPAS " $@; -am__v_CPPAS_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_$(V)) -am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_$(V)) -am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libffi_la_SOURCES) $(EXTRA_libffi_la_SOURCES) \ - $(libffi_convenience_la_SOURCES) \ - $(EXTRA_libffi_convenience_la_SOURCES) \ - $(nodist_libffi_convenience_la_SOURCES) -DIST_SOURCES = $(am__libffi_la_SOURCES_DIST) \ - $(EXTRA_libffi_la_SOURCES) \ - $(am__libffi_convenience_la_SOURCES_DIST) \ - $(EXTRA_libffi_convenience_la_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(pkgconfig_DATA) -HEADERS = $(noinst_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)fficonfig.h.in -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope -DIST_SUBDIRS = include testsuite man doc -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/fficonfig.h.in \ - $(srcdir)/libffi.pc.in README compile config.guess config.sub \ - depcomp install-sh ltmain.sh missing -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -DIST_TARGETS = dist-gzip -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15 -ALLOCA = -AMTAR = $${TAR-tar} -AM_DEFAULT_VERBOSITY = 1 -AM_LTLDFLAGS = -AM_RUNTESTFLAGS = -AR = ar -AUTOCONF = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf -AUTOHEADER = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader -AUTOMAKE = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15 -AWK = awk -CC = xcrun clang -CCAS = xcrun clang -CCASDEPMODE = depmode=none -CCASFLAGS = -CCDEPMODE = depmode=none -CFLAGS = -Wall -fexceptions -CPP = xcrun clang -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=none -CXXFLAGS = -g -O2 -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -DLLTOOL = false -DSYMUTIL = dsymutil -DUMPBIN = -ECHO_C = \c -ECHO_N = -ECHO_T = -EGREP = /usr/bin/grep -E -EXEEXT = -FFI_EXEC_TRAMPOLINE_TABLE = 0 -FGREP = /usr/bin/grep -F -GREP = /usr/bin/grep -HAVE_LONG_DOUBLE = 1 -HAVE_LONG_DOUBLE_VARIANT = 0 -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = ld -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = lipo -LN_S = ln -s -LTLIBOBJS = -LT_SYS_LIBRARY_PATH = -MAINT = # -MAKEINFO = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo -MANIFEST_TOOL = : -MKDIR_P = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -NM = /usr/bin/nm -B -NMEDIT = nmedit -OBJDUMP = objdump -OBJEXT = o -OPT_LDFLAGS = -OTOOL = otool -OTOOL64 = : -PACKAGE = libffi -PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues -PACKAGE_NAME = libffi -PACKAGE_STRING = libffi 3.99999 -PACKAGE_TARNAME = libffi -PACKAGE_URL = -PACKAGE_VERSION = 3.99999 -PATH_SEPARATOR = : -PRTDIAG = -RANLIB = ranlib -SECTION_LDFLAGS = -SED = /usr/bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -TARGET = X86_64 -TARGETDIR = x86 -TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -VERSION = 3.99999 -abs_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -abs_top_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ac_ct_AR = ar -ac_ct_CC = xcrun clang -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = $${TAR-tar} chof - "$$tardir" -am__untar = $${TAR-tar} xf - -ax_enable_builddir_sed = sed -bindir = ${exec_prefix}/bin -build = x86_64-apple-darwin18.6.0 -build_alias = -build_cpu = x86_64 -build_os = darwin18.6.0 -build_vendor = apple -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-apple-darwin18.6.0 -host_alias = -host_cpu = x86_64 -host_os = darwin18.6.0 -host_vendor = apple -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localedir = ${datarootdir}/locale -localstatedir = ${prefix}/var -mandir = ${datarootdir}/man -mkdir_p = $(MKDIR_P) -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -runstatedir = ${localstatedir}/run -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -sys_symbol_underscore = yes -sysconfdir = ${prefix}/etc -target = x86_64-apple-darwin18.6.0 -target_alias = -target_cpu = x86_64 -target_os = darwin18.6.0 -target_vendor = apple -toolexecdir = ${exec_prefix}/lib/gcc-lib/$(target_alias) -toolexeclibdir = ${exec_prefix}/lib -top_build_prefix = -top_builddir = . -top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -AUTOMAKE_OPTIONS = foreign subdir-objects -ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = include testsuite man $(am__append_1) -EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ - ChangeLog.libffi ChangeLog.libffi-3.1 \ - m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj \ - libtool-ldflags libtool-version configure.host - - -# local.exp is generated by configure -DISTCLEANFILES = local.exp - -# Work around what appears to be a GNU make bug handling MAKEFLAGS -# values defined in terms of make variables, as is the case for CC and -# friends when we are called from the top level Makefile. -AM_MAKEFLAGS = \ - 'AR_FLAGS=$(AR_FLAGS)' \ - 'CC_FOR_BUILD=$(CC_FOR_BUILD)' \ - 'CFLAGS=$(CFLAGS)' \ - 'CXXFLAGS=$(CXXFLAGS)' \ - 'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \ - 'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \ - 'INSTALL=$(INSTALL)' \ - 'INSTALL_DATA=$(INSTALL_DATA)' \ - 'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \ - 'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \ - 'JC1FLAGS=$(JC1FLAGS)' \ - 'LDFLAGS=$(LDFLAGS)' \ - 'LIBCFLAGS=$(LIBCFLAGS)' \ - 'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \ - 'MAKE=$(MAKE)' \ - 'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \ - 'PICFLAG=$(PICFLAG)' \ - 'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \ - 'RUNTESTFLAGS=$(RUNTESTFLAGS)' \ - 'SHELL=$(SHELL)' \ - 'exec_prefix=$(exec_prefix)' \ - 'infodir=$(infodir)' \ - 'libdir=$(libdir)' \ - 'mandir=$(mandir)' \ - 'prefix=$(prefix)' \ - 'AR=$(AR)' \ - 'AS=$(AS)' \ - 'CC=$(CC)' \ - 'CXX=$(CXX)' \ - 'LD=$(LD)' \ - 'NM=$(NM)' \ - 'RANLIB=$(RANLIB)' \ - 'DESTDIR=$(DESTDIR)' - - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) -MAKEOVERRIDES = -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la -libffi_la_SOURCES = src/prep_cif.c src/types.c src/raw_api.c \ - src/java_raw_api.c src/closures.c $(am__append_2) -noinst_HEADERS = \ - src/aarch64/ffitarget.h src/aarch64/internal.h \ - src/alpha/ffitarget.h src/alpha/internal.h \ - src/arc/ffitarget.h \ - src/arm/ffitarget.h src/arm/internal.h \ - src/avr32/ffitarget.h \ - src/bfin/ffitarget.h \ - src/cris/ffitarget.h \ - src/frv/ffitarget.h \ - src/ia64/ffitarget.h src/ia64/ia64_flags.h \ - src/m32r/ffitarget.h \ - src/m68k/ffitarget.h \ - src/m88k/ffitarget.h \ - src/metag/ffitarget.h \ - src/microblaze/ffitarget.h \ - src/mips/ffitarget.h \ - src/moxie/ffitarget.h \ - src/nios2/ffitarget.h \ - src/or1k/ffitarget.h \ - src/pa/ffitarget.h \ - src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \ - src/s390/ffitarget.h src/s390/internal.h \ - src/sh/ffitarget.h \ - src/sh64/ffitarget.h \ - src/sparc/ffitarget.h src/sparc/internal.h \ - src/tile/ffitarget.h \ - src/vax/ffitarget.h \ - src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h src/x86/asmnames.h \ - src/xtensa/ffitarget.h \ - src/dlmalloc.c - -EXTRA_libffi_la_SOURCES = \ - src/aarch64/ffi.c src/aarch64/sysv.S \ - src/alpha/ffi.c src/alpha/osf.S \ - src/arc/ffi.c src/arc/arcompact.S \ - src/arm/ffi.c src/arm/sysv.S \ - src/avr32/ffi.c src/avr32/sysv.S \ - src/bfin/ffi.c src/bfin/sysv.S \ - src/cris/ffi.c src/cris/sysv.S \ - src/frv/ffi.c src/frv/eabi.S \ - src/ia64/ffi.c src/ia64/unix.S \ - src/m32r/ffi.c src/m32r/sysv.S \ - src/m68k/ffi.c src/m68k/sysv.S \ - src/m88k/ffi.c src/m88k/obsd.S \ - src/metag/ffi.c src/metag/sysv.S \ - src/microblaze/ffi.c src/microblaze/sysv.S \ - src/mips/ffi.c src/mips/o32.S src/mips/n32.S \ - src/moxie/ffi.c src/moxie/eabi.S \ - src/nios2/ffi.c src/nios2/sysv.S \ - src/or1k/ffi.c src/or1k/sysv.S \ - src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ - src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ - src/powerpc/sysv.S src/powerpc/linux64.S \ - src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ - src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \ - src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ - src/s390/ffi.c src/s390/sysv.S \ - src/sh/ffi.c src/sh/sysv.S \ - src/sh64/ffi.c src/sh64/sysv.S \ - src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S \ - src/tile/ffi.c src/tile/tile.S \ - src/vax/ffi.c src/vax/elfbsd.S \ - src/x86/ffi.c src/x86/sysv.S \ - src/x86/ffiw64.c src/x86/win64.S \ - src/x86/ffi64.c src/x86/unix64.S \ - src/xtensa/ffi.c src/xtensa/sysv.S - -libffi_la_LIBADD = $(TARGET_OBJ) -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) -libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) -libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) -AM_CFLAGS = $(am__append_3) -libffi_version_script = -##libffi_version_script = -Wl,--version-script,libffi.map -##libffi_version_script = -Wl,-M,libffi.map-sun -libffi_version_dep = -##libffi_version_dep = libffi.map -##libffi_version_dep = libffi.map-sun -libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) -libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) -AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -AM_CCASFLAGS = $(AM_CPPFLAGS) -all: fficonfig.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -.SUFFIXES: .S .c .lo .o .obj -am--refresh: Makefile - @: -$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: # $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): # $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): - -fficonfig.h: stamp-h1 - @test -f $@ || rm -f stamp-h1 - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 - -stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h -$(srcdir)/fficonfig.h.in: # $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f fficonfig.h stamp-h1 -libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ - } - -uninstall-toolexeclibLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ - done - -clean-toolexeclibLTLIBRARIES: - -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) - @list='$(toolexeclib_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -src/$(am__dirstamp): - @$(MKDIR_P) src - @: > src/$(am__dirstamp) -src/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/$(DEPDIR) - @: > src/$(DEPDIR)/$(am__dirstamp) -src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/aarch64/$(am__dirstamp): - @$(MKDIR_P) src/aarch64 - @: > src/aarch64/$(am__dirstamp) -src/aarch64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/aarch64/$(DEPDIR) - @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/alpha/$(am__dirstamp): - @$(MKDIR_P) src/alpha - @: > src/alpha/$(am__dirstamp) -src/alpha/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/alpha/$(DEPDIR) - @: > src/alpha/$(DEPDIR)/$(am__dirstamp) -src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ - src/alpha/$(DEPDIR)/$(am__dirstamp) -src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ - src/alpha/$(DEPDIR)/$(am__dirstamp) -src/arc/$(am__dirstamp): - @$(MKDIR_P) src/arc - @: > src/arc/$(am__dirstamp) -src/arc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/arc/$(DEPDIR) - @: > src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/ffi.lo: src/arc/$(am__dirstamp) \ - src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/arcompact.lo: src/arc/$(am__dirstamp) \ - src/arc/$(DEPDIR)/$(am__dirstamp) -src/arm/$(am__dirstamp): - @$(MKDIR_P) src/arm - @: > src/arm/$(am__dirstamp) -src/arm/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/arm/$(DEPDIR) - @: > src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/ffi.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/sysv.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/avr32/$(am__dirstamp): - @$(MKDIR_P) src/avr32 - @: > src/avr32/$(am__dirstamp) -src/avr32/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/avr32/$(DEPDIR) - @: > src/avr32/$(DEPDIR)/$(am__dirstamp) -src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/bfin/$(am__dirstamp): - @$(MKDIR_P) src/bfin - @: > src/bfin/$(am__dirstamp) -src/bfin/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/bfin/$(DEPDIR) - @: > src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(DEPDIR)/$(am__dirstamp) -src/cris/$(am__dirstamp): - @$(MKDIR_P) src/cris - @: > src/cris/$(am__dirstamp) -src/cris/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/cris/$(DEPDIR) - @: > src/cris/$(DEPDIR)/$(am__dirstamp) -src/cris/ffi.lo: src/cris/$(am__dirstamp) \ - src/cris/$(DEPDIR)/$(am__dirstamp) -src/cris/sysv.lo: src/cris/$(am__dirstamp) \ - src/cris/$(DEPDIR)/$(am__dirstamp) -src/frv/$(am__dirstamp): - @$(MKDIR_P) src/frv - @: > src/frv/$(am__dirstamp) -src/frv/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/frv/$(DEPDIR) - @: > src/frv/$(DEPDIR)/$(am__dirstamp) -src/frv/ffi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(DEPDIR)/$(am__dirstamp) -src/frv/eabi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(DEPDIR)/$(am__dirstamp) -src/ia64/$(am__dirstamp): - @$(MKDIR_P) src/ia64 - @: > src/ia64/$(am__dirstamp) -src/ia64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/ia64/$(DEPDIR) - @: > src/ia64/$(DEPDIR)/$(am__dirstamp) -src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ - src/ia64/$(DEPDIR)/$(am__dirstamp) -src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ - src/ia64/$(DEPDIR)/$(am__dirstamp) -src/m32r/$(am__dirstamp): - @$(MKDIR_P) src/m32r - @: > src/m32r/$(am__dirstamp) -src/m32r/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m32r/$(DEPDIR) - @: > src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ - src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ - src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m68k/$(am__dirstamp): - @$(MKDIR_P) src/m68k - @: > src/m68k/$(am__dirstamp) -src/m68k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m68k/$(DEPDIR) - @: > src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ - src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ - src/m68k/$(DEPDIR)/$(am__dirstamp) -src/m88k/$(am__dirstamp): - @$(MKDIR_P) src/m88k - @: > src/m88k/$(am__dirstamp) -src/m88k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m88k/$(DEPDIR) - @: > src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/metag/$(am__dirstamp): - @$(MKDIR_P) src/metag - @: > src/metag/$(am__dirstamp) -src/metag/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/metag/$(DEPDIR) - @: > src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/ffi.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/sysv.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/microblaze/$(am__dirstamp): - @$(MKDIR_P) src/microblaze - @: > src/microblaze/$(am__dirstamp) -src/microblaze/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/microblaze/$(DEPDIR) - @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/mips/$(am__dirstamp): - @$(MKDIR_P) src/mips - @: > src/mips/$(am__dirstamp) -src/mips/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/mips/$(DEPDIR) - @: > src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/ffi.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/o32.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/mips/n32.lo: src/mips/$(am__dirstamp) \ - src/mips/$(DEPDIR)/$(am__dirstamp) -src/moxie/$(am__dirstamp): - @$(MKDIR_P) src/moxie - @: > src/moxie/$(am__dirstamp) -src/moxie/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/moxie/$(DEPDIR) - @: > src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/nios2/$(am__dirstamp): - @$(MKDIR_P) src/nios2 - @: > src/nios2/$(am__dirstamp) -src/nios2/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/nios2/$(DEPDIR) - @: > src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/or1k/$(am__dirstamp): - @$(MKDIR_P) src/or1k - @: > src/or1k/$(am__dirstamp) -src/or1k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/or1k/$(DEPDIR) - @: > src/or1k/$(DEPDIR)/$(am__dirstamp) -src/or1k/ffi.lo: src/or1k/$(am__dirstamp) \ - src/or1k/$(DEPDIR)/$(am__dirstamp) -src/or1k/sysv.lo: src/or1k/$(am__dirstamp) \ - src/or1k/$(DEPDIR)/$(am__dirstamp) -src/pa/$(am__dirstamp): - @$(MKDIR_P) src/pa - @: > src/pa/$(am__dirstamp) -src/pa/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/pa/$(DEPDIR) - @: > src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/linux.lo: src/pa/$(am__dirstamp) \ - src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ - src/pa/$(DEPDIR)/$(am__dirstamp) -src/powerpc/$(am__dirstamp): - @$(MKDIR_P) src/powerpc - @: > src/powerpc/$(am__dirstamp) -src/powerpc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/powerpc/$(DEPDIR) - @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_linux64.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/s390/$(am__dirstamp): - @$(MKDIR_P) src/s390 - @: > src/s390/$(am__dirstamp) -src/s390/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/s390/$(DEPDIR) - @: > src/s390/$(DEPDIR)/$(am__dirstamp) -src/s390/ffi.lo: src/s390/$(am__dirstamp) \ - src/s390/$(DEPDIR)/$(am__dirstamp) -src/s390/sysv.lo: src/s390/$(am__dirstamp) \ - src/s390/$(DEPDIR)/$(am__dirstamp) -src/sh/$(am__dirstamp): - @$(MKDIR_P) src/sh - @: > src/sh/$(am__dirstamp) -src/sh/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sh/$(DEPDIR) - @: > src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh/sysv.lo: src/sh/$(am__dirstamp) \ - src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh64/$(am__dirstamp): - @$(MKDIR_P) src/sh64 - @: > src/sh64/$(am__dirstamp) -src/sh64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sh64/$(DEPDIR) - @: > src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sparc/$(am__dirstamp): - @$(MKDIR_P) src/sparc - @: > src/sparc/$(am__dirstamp) -src/sparc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/sparc/$(DEPDIR) - @: > src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/ffi64.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ - src/sparc/$(DEPDIR)/$(am__dirstamp) -src/tile/$(am__dirstamp): - @$(MKDIR_P) src/tile - @: > src/tile/$(am__dirstamp) -src/tile/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/tile/$(DEPDIR) - @: > src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/ffi.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/tile.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/vax/$(am__dirstamp): - @$(MKDIR_P) src/vax - @: > src/vax/$(am__dirstamp) -src/vax/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/vax/$(DEPDIR) - @: > src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/ffi.lo: src/vax/$(am__dirstamp) \ - src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \ - src/vax/$(DEPDIR)/$(am__dirstamp) -src/x86/$(am__dirstamp): - @$(MKDIR_P) src/x86 - @: > src/x86/$(am__dirstamp) -src/x86/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/x86/$(DEPDIR) - @: > src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/ffi.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/sysv.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/ffiw64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/win64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/unix64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/xtensa/$(am__dirstamp): - @$(MKDIR_P) src/xtensa - @: > src/xtensa/$(am__dirstamp) -src/xtensa/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/xtensa/$(DEPDIR) - @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) - -libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) - $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) - -libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -rm -f src/*.$(OBJEXT) - -rm -f src/*.lo - -rm -f src/aarch64/*.$(OBJEXT) - -rm -f src/aarch64/*.lo - -rm -f src/alpha/*.$(OBJEXT) - -rm -f src/alpha/*.lo - -rm -f src/arc/*.$(OBJEXT) - -rm -f src/arc/*.lo - -rm -f src/arm/*.$(OBJEXT) - -rm -f src/arm/*.lo - -rm -f src/avr32/*.$(OBJEXT) - -rm -f src/avr32/*.lo - -rm -f src/bfin/*.$(OBJEXT) - -rm -f src/bfin/*.lo - -rm -f src/cris/*.$(OBJEXT) - -rm -f src/cris/*.lo - -rm -f src/frv/*.$(OBJEXT) - -rm -f src/frv/*.lo - -rm -f src/ia64/*.$(OBJEXT) - -rm -f src/ia64/*.lo - -rm -f src/m32r/*.$(OBJEXT) - -rm -f src/m32r/*.lo - -rm -f src/m68k/*.$(OBJEXT) - -rm -f src/m68k/*.lo - -rm -f src/m88k/*.$(OBJEXT) - -rm -f src/m88k/*.lo - -rm -f src/metag/*.$(OBJEXT) - -rm -f src/metag/*.lo - -rm -f src/microblaze/*.$(OBJEXT) - -rm -f src/microblaze/*.lo - -rm -f src/mips/*.$(OBJEXT) - -rm -f src/mips/*.lo - -rm -f src/moxie/*.$(OBJEXT) - -rm -f src/moxie/*.lo - -rm -f src/nios2/*.$(OBJEXT) - -rm -f src/nios2/*.lo - -rm -f src/or1k/*.$(OBJEXT) - -rm -f src/or1k/*.lo - -rm -f src/pa/*.$(OBJEXT) - -rm -f src/pa/*.lo - -rm -f src/powerpc/*.$(OBJEXT) - -rm -f src/powerpc/*.lo - -rm -f src/s390/*.$(OBJEXT) - -rm -f src/s390/*.lo - -rm -f src/sh/*.$(OBJEXT) - -rm -f src/sh/*.lo - -rm -f src/sh64/*.$(OBJEXT) - -rm -f src/sh64/*.lo - -rm -f src/sparc/*.$(OBJEXT) - -rm -f src/sparc/*.lo - -rm -f src/tile/*.$(OBJEXT) - -rm -f src/tile/*.lo - -rm -f src/vax/*.$(OBJEXT) - -rm -f src/vax/*.lo - -rm -f src/x86/*.$(OBJEXT) - -rm -f src/x86/*.lo - -rm -f src/xtensa/*.$(OBJEXT) - -rm -f src/xtensa/*.lo - -distclean-compile: - -rm -f *.tab.c - -#include src/$(DEPDIR)/closures.Plo -#include src/$(DEPDIR)/debug.Plo -#include src/$(DEPDIR)/java_raw_api.Plo -#include src/$(DEPDIR)/prep_cif.Plo -#include src/$(DEPDIR)/raw_api.Plo -#include src/$(DEPDIR)/types.Plo -#include src/aarch64/$(DEPDIR)/ffi.Plo -#include src/aarch64/$(DEPDIR)/sysv.Plo -#include src/alpha/$(DEPDIR)/ffi.Plo -#include src/alpha/$(DEPDIR)/osf.Plo -#include src/arc/$(DEPDIR)/arcompact.Plo -#include src/arc/$(DEPDIR)/ffi.Plo -#include src/arm/$(DEPDIR)/ffi.Plo -#include src/arm/$(DEPDIR)/sysv.Plo -#include src/avr32/$(DEPDIR)/ffi.Plo -#include src/avr32/$(DEPDIR)/sysv.Plo -#include src/bfin/$(DEPDIR)/ffi.Plo -#include src/bfin/$(DEPDIR)/sysv.Plo -#include src/cris/$(DEPDIR)/ffi.Plo -#include src/cris/$(DEPDIR)/sysv.Plo -#include src/frv/$(DEPDIR)/eabi.Plo -#include src/frv/$(DEPDIR)/ffi.Plo -#include src/ia64/$(DEPDIR)/ffi.Plo -#include src/ia64/$(DEPDIR)/unix.Plo -#include src/m32r/$(DEPDIR)/ffi.Plo -#include src/m32r/$(DEPDIR)/sysv.Plo -#include src/m68k/$(DEPDIR)/ffi.Plo -#include src/m68k/$(DEPDIR)/sysv.Plo -#include src/m88k/$(DEPDIR)/ffi.Plo -#include src/m88k/$(DEPDIR)/obsd.Plo -#include src/metag/$(DEPDIR)/ffi.Plo -#include src/metag/$(DEPDIR)/sysv.Plo -#include src/microblaze/$(DEPDIR)/ffi.Plo -#include src/microblaze/$(DEPDIR)/sysv.Plo -#include src/mips/$(DEPDIR)/ffi.Plo -#include src/mips/$(DEPDIR)/n32.Plo -#include src/mips/$(DEPDIR)/o32.Plo -#include src/moxie/$(DEPDIR)/eabi.Plo -#include src/moxie/$(DEPDIR)/ffi.Plo -#include src/nios2/$(DEPDIR)/ffi.Plo -#include src/nios2/$(DEPDIR)/sysv.Plo -#include src/or1k/$(DEPDIR)/ffi.Plo -#include src/or1k/$(DEPDIR)/sysv.Plo -#include src/pa/$(DEPDIR)/ffi.Plo -#include src/pa/$(DEPDIR)/hpux32.Plo -#include src/pa/$(DEPDIR)/linux.Plo -#include src/powerpc/$(DEPDIR)/aix.Plo -#include src/powerpc/$(DEPDIR)/aix_closure.Plo -#include src/powerpc/$(DEPDIR)/darwin.Plo -#include src/powerpc/$(DEPDIR)/darwin_closure.Plo -#include src/powerpc/$(DEPDIR)/ffi.Plo -#include src/powerpc/$(DEPDIR)/ffi_darwin.Plo -#include src/powerpc/$(DEPDIR)/ffi_linux64.Plo -#include src/powerpc/$(DEPDIR)/ffi_sysv.Plo -#include src/powerpc/$(DEPDIR)/linux64.Plo -#include src/powerpc/$(DEPDIR)/linux64_closure.Plo -#include src/powerpc/$(DEPDIR)/ppc_closure.Plo -#include src/powerpc/$(DEPDIR)/sysv.Plo -#include src/s390/$(DEPDIR)/ffi.Plo -#include src/s390/$(DEPDIR)/sysv.Plo -#include src/sh/$(DEPDIR)/ffi.Plo -#include src/sh/$(DEPDIR)/sysv.Plo -#include src/sh64/$(DEPDIR)/ffi.Plo -#include src/sh64/$(DEPDIR)/sysv.Plo -#include src/sparc/$(DEPDIR)/ffi.Plo -#include src/sparc/$(DEPDIR)/ffi64.Plo -#include src/sparc/$(DEPDIR)/v8.Plo -#include src/sparc/$(DEPDIR)/v9.Plo -#include src/tile/$(DEPDIR)/ffi.Plo -#include src/tile/$(DEPDIR)/tile.Plo -#include src/vax/$(DEPDIR)/elfbsd.Plo -#include src/vax/$(DEPDIR)/ffi.Plo -#include src/x86/$(DEPDIR)/ffi.Plo -#include src/x86/$(DEPDIR)/ffi64.Plo -#include src/x86/$(DEPDIR)/ffiw64.Plo -#include src/x86/$(DEPDIR)/sysv.Plo -#include src/x86/$(DEPDIR)/unix64.Plo -#include src/x86/$(DEPDIR)/win64.Plo -#include src/xtensa/$(DEPDIR)/ffi.Plo -#include src/xtensa/$(DEPDIR)/sysv.Plo - -.S.o: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CPPAS)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ $< - -.S.obj: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CPPAS)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.S.lo: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -# $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Plo -# $(AM_V_CPPAS)source='$<' object='$@' libtool=yes -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(LTCPPASCOMPILE) -c -o $@ $< - -.c.o: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CC)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(COMPILE) -c -o $@ $< - -.c.obj: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CC)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -# $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Plo -# $(AM_V_CC)source='$<' object='$@' libtool=yes -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -rm -rf src/.libs src/_libs - -rm -rf src/aarch64/.libs src/aarch64/_libs - -rm -rf src/alpha/.libs src/alpha/_libs - -rm -rf src/arc/.libs src/arc/_libs - -rm -rf src/arm/.libs src/arm/_libs - -rm -rf src/avr32/.libs src/avr32/_libs - -rm -rf src/bfin/.libs src/bfin/_libs - -rm -rf src/cris/.libs src/cris/_libs - -rm -rf src/frv/.libs src/frv/_libs - -rm -rf src/ia64/.libs src/ia64/_libs - -rm -rf src/m32r/.libs src/m32r/_libs - -rm -rf src/m68k/.libs src/m68k/_libs - -rm -rf src/m88k/.libs src/m88k/_libs - -rm -rf src/metag/.libs src/metag/_libs - -rm -rf src/microblaze/.libs src/microblaze/_libs - -rm -rf src/mips/.libs src/mips/_libs - -rm -rf src/moxie/.libs src/moxie/_libs - -rm -rf src/nios2/.libs src/nios2/_libs - -rm -rf src/or1k/.libs src/or1k/_libs - -rm -rf src/pa/.libs src/pa/_libs - -rm -rf src/powerpc/.libs src/powerpc/_libs - -rm -rf src/s390/.libs src/s390/_libs - -rm -rf src/sh/.libs src/sh/_libs - -rm -rf src/sh64/.libs src/sh64/_libs - -rm -rf src/sparc/.libs src/sparc/_libs - -rm -rf src/tile/.libs src/tile/_libs - -rm -rf src/vax/.libs src/vax/_libs - -rm -rf src/x86/.libs src/x86/_libs - -rm -rf src/xtensa/.libs src/xtensa/_libs - -distclean-libtool: - -rm -f libtool config.lt -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) - -dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) - -dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) - -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__post_remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) fficonfig.h -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -rm -f src/$(DEPDIR)/$(am__dirstamp) - -rm -f src/$(am__dirstamp) - -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/aarch64/$(am__dirstamp) - -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) - -rm -f src/alpha/$(am__dirstamp) - -rm -f src/arc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/arc/$(am__dirstamp) - -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) - -rm -f src/arm/$(am__dirstamp) - -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) - -rm -f src/avr32/$(am__dirstamp) - -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) - -rm -f src/bfin/$(am__dirstamp) - -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) - -rm -f src/cris/$(am__dirstamp) - -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) - -rm -f src/frv/$(am__dirstamp) - -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/ia64/$(am__dirstamp) - -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m32r/$(am__dirstamp) - -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m68k/$(am__dirstamp) - -rm -f src/m88k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m88k/$(am__dirstamp) - -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) - -rm -f src/metag/$(am__dirstamp) - -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) - -rm -f src/microblaze/$(am__dirstamp) - -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) - -rm -f src/mips/$(am__dirstamp) - -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) - -rm -f src/moxie/$(am__dirstamp) - -rm -f src/nios2/$(DEPDIR)/$(am__dirstamp) - -rm -f src/nios2/$(am__dirstamp) - -rm -f src/or1k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/or1k/$(am__dirstamp) - -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) - -rm -f src/pa/$(am__dirstamp) - -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/powerpc/$(am__dirstamp) - -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) - -rm -f src/s390/$(am__dirstamp) - -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sh/$(am__dirstamp) - -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sh64/$(am__dirstamp) - -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/sparc/$(am__dirstamp) - -rm -f src/tile/$(DEPDIR)/$(am__dirstamp) - -rm -f src/tile/$(am__dirstamp) - -rm -f src/vax/$(DEPDIR)/$(am__dirstamp) - -rm -f src/vax/$(am__dirstamp) - -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) - -rm -f src/x86/$(am__dirstamp) - -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) - -rm -f src/xtensa/$(am__dirstamp) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ - clean-toolexeclibLTLIBRARIES mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPD