IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

Code source des fonctions standard


Sujet :

Bibliothèque standard C

  1. #1
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut Code source des fonctions standard
    Bonjour

    Je voudrais savoir si on peut avoir accés au code source des fonctions qui se trouve dans stdlib.h ?

    Plus précisément je voudrais voir (ou du moins connaître l'algorithtme) de la fonction rand() de stdlib.h et srand().

    Merci

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842

  3. #3
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Merci,

    Sur mon PC j'ai une distribution linux dans laquelle on peut parfaitement trouver le fichier stdlib.h. Est ce que tu sais si les sources comme on les voit sur les sites que tu m'as donnés sont également quelque part dans la distribution linux ou un pacquet ?

    Je voudrais être sur que le code que je vois est celui que j'utilise.

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Je ne crois pas que les sources soient disponibles sur ta machine (peut-être que je me trompe).
    Pour être sûr d'avoir les sources de ta distribution il faut que tu regardes sur le site de ta distrib de Linux et que tu trouves ton fichier

    Quelle est ta distrib ?

  5. #5
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Une RedHat, le terminal me donne ça :

    RHEL_5__x86_64

    si c'est plus facile, chez moi c'est une ubuntu 9.10

  6. #6
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    RedHat c'est par là : http://sources.redhat.com/glibc/

  7. #7
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    euh ... je vais faire mon boulet mais comment tu t'y retrouve là dedans ?

    Mon terminal me donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    gcc -v
    Using built-in specs.
    Target: x86_64-redhat-linux
    Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
    Thread model: posix
    gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)
    Il faut que je choississe une version de glibc ?

  8. #8
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Heuu ... par défaut je prendrais la dernière version
    Tu peux télécharger la totale en prenant le lien ftp dans Availability le lien c'est "available by anonymous ftp."
    Sinon en ligne : http://sourceware.org/git/?p=glibc.g...98381c640ab06f

  9. #9
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Merci,

    Effectivement j'avais téléchargé la dernière ... D'après les commentaires des fichiers qui m'intéressent, les derniers copyright datent de 2005 ou 1995 voir moins ... je pense que ma machine est plus récente même pour 2005.

  10. #10
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Ca ne veut rien dire
    Le fichier n'est pas obligé d'être retouché tous les ans pour qu'il soit 'à jour'. Si la dernière émission est correcte (sans bug etc.) il n'y a aucune raison de le modifier

  11. #11
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Je comprend pas

    Bien entendu si il n'y a ni bug ni amélioration intéressante, le fichier n'a pas intéret à être modifié mais quel est le lien avec ce que je disais par rapport au copyright ?

    Dans tous les cas les dates des fichiers sont vielles donc ils ne sont pas récent !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -rw-r----- 1 ***** pmc 1.5K Jul  6  2001 rand_r.c
    -rw-r----- 1 ***** pmc  991 Jul  6  2001 rand.c
    -rw-r----- 1 ***** pmc  13K Dec 16  2002 random.c
    -rw-r----- 1 ***** pmc  13K Apr 12  2005 random_r.c

  12. #12
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Oublie ce que j'ai dit j'ai loupé un épisode

  13. #13
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Salut

    Au fait je me pose une question, est ce qu'il y a une librairies particulière pour les architectures 64 bits (comme la mienne ) ? Ou est ce que la librairie est écrite de façon à ce que le code soit portable en 32 comme en 64 bits ?

    Merci

  14. #14
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Il peut y avoir des bibliothèques particulières, mais en général c'est le même code qui est simplement compilé en 64 bits.
    Un exemple de code standard qui fait attention à l'architecture (lien donné plus haut lib FreeBSD) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    /*-
     * Copyright (c) 2009 Xin LI <delphij@FreeBSD.org>
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. 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.
     *
     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
     */
     
    #include <sys/cdefs.h>
    __FBSDID("$FreeBSD: src/lib/libc/string/strlen.c,v 1.7.2.1.2.1 2009/10/25 01:10:29 kensmith Exp $");
     
    #include <sys/limits.h>
    #include <sys/types.h>
    #include <string.h>
     
    /*
     * Portable strlen() for 32-bit and 64-bit systems.
     *
     * Rationale: it is generally much more efficient to do word length
     * operations and avoid branches on modern computer systems, as
     * compared to byte-length operations with a lot of branches.
     *
     * The expression:
     *
     *	((x - 0x01....01) & ~x & 0x80....80)
     *
     * would evaluate to a non-zero value iff any of the bytes in the
     * original word is zero.  However, we can further reduce ~1/3 of
     * time if we consider that strlen() usually operate on 7-bit ASCII
     * by employing the following expression, which allows false positive
     * when high bit of 1 and use the tail case to catch these case:
     *
     *	((x - 0x01....01) & 0x80....80)
     *
     * This is more than 5.2 times as fast as the raw implementation on
     * Intel T7300 under long mode for strings longer than word length.
     */
     
    /* Magic numbers for the algorithm */
    #if LONG_BIT == 32
    static const unsigned long mask01 = 0x01010101;
    static const unsigned long mask80 = 0x80808080;
    #elif LONG_BIT == 64
    static const unsigned long mask01 = 0x0101010101010101;
    static const unsigned long mask80 = 0x8080808080808080;
    #else
    #error Unsupported word size
    #endif
     
    #define	LONGPTR_MASK (sizeof(long) - 1)
     
    /*
     * Helper macro to return string length if we caught the zero
     * byte.
     */
    #define testbyte(x)				\
    	do {					\
    		if (p[x] == '\0')		\
    		    return (p - str + x);	\
    	} while (0)
     
    size_t
    strlen(const char *str)
    {
    	const char *p;
    	const unsigned long *lp;
     
    	/* Skip the first few bytes until we have an aligned p */
    	for (p = str; (uintptr_t)p & LONGPTR_MASK; p++)
    	    if (*p == '\0')
    		return (p - str);
     
    	/* Scan the rest of the string using word sized operation */
    	for (lp = (const unsigned long *)p; ; lp++)
    	    if ((*lp - mask01) & mask80) {
    		p = (const char *)(lp);
    		testbyte(0);
    		testbyte(1);
    		testbyte(2);
    		testbyte(3);
    #if (LONG_BIT >= 64)
    		testbyte(4);
    		testbyte(5);
    		testbyte(6);
    		testbyte(7);
    #endif
    	    }
     
    	/* NOTREACHED */
    	return (0);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/05/2011, 13h27
  2. Réponses: 5
    Dernier message: 13/03/2007, 23h20
  3. Réponses: 4
    Dernier message: 01/03/2007, 13h19
  4. Réponses: 2
    Dernier message: 03/10/2006, 18h55
  5. Code source des commandes ?
    Par malalll dans le forum Linux
    Réponses: 3
    Dernier message: 01/04/2006, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo